summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Pilipenko <apilipenko@azulsystems.com>2016-08-09 10:00:22 +0000
committerArtur Pilipenko <apilipenko@azulsystems.com>2016-08-09 10:00:22 +0000
commitd97eedff403a07e9ee7e5534d5abd8eeddfdfa02 (patch)
treefab07d6c0e8665e6912f3137188186df846c8d64
parente01ffee570ba968c19c41fa3b44461cbe3586e5b (diff)
downloadbcm5719-llvm-d97eedff403a07e9ee7e5534d5abd8eeddfdfa02.tar.gz
bcm5719-llvm-d97eedff403a07e9ee7e5534d5abd8eeddfdfa02.zip
Revert 278107 which causes buildbot failures and in addition has wrong commit message
llvm-svn: 278109
-rw-r--r--llvm/lib/Analysis/LazyValueInfo.cpp52
-rw-r--r--llvm/test/Transforms/CorrelatedValuePropagation/range.ll112
2 files changed, 19 insertions, 145 deletions
diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index e6c375a8d8c..2728687a31c 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -1197,44 +1197,30 @@ bool getValueFromCondition(Value *Val, Value *Cond, LVILatticeVal &Result,
Result = LVILatticeVal::getNot(cast<Constant>(RHS));
return true;
}
- }
-
- // Use ConstantRange::makeAllowedICmpRegion in order to determine the possible
- // range of Val guaranteed by the condition. Recognize comparisons in the from
- // of:
- // icmp <pred> Val, ...
- // icmp ult (add Val, Offset), ...
- // The latter is the range checking idiom that InstCombine produces. Subtract
- // the offset from the allowed range for RHS in this case.
-
- // Val or (add Val, Offset) can be on either hand of the comparison
- if (LHS != Val && !match(LHS, m_Add(m_Specific(Val), m_ConstantInt()))) {
- std::swap(LHS, RHS);
- Predicate = CmpInst::getSwappedPredicate(Predicate);
- }
- ConstantInt *Offset = nullptr;
- if (Predicate == ICmpInst::ICMP_ULT)
- match(LHS, m_Add(m_Specific(Val), m_ConstantInt(Offset)));
+ // Recognize the range checking idiom that InstCombine produces.
+ // (X+C1) u< C2 --> [-C1, C2-C1)
+ ConstantInt *Offset = nullptr;
+ if (Predicate == ICmpInst::ICMP_ULT)
+ match(LHS, m_Add(m_Specific(Val), m_ConstantInt(Offset)));
- if (LHS == Val || Offset) {
- // Calculate the range of values that are allowed by the comparison
- ConstantRange RHSRange(RHS->getType()->getIntegerBitWidth(),
- /*isFullSet=*/true);
- if (ConstantInt *CI = dyn_cast<ConstantInt>(RHS))
- RHSRange = ConstantRange(CI->getValue());
+ ConstantInt *CI = dyn_cast<ConstantInt>(RHS);
+ if (CI && (LHS == Val || Offset)) {
+ // Calculate the range of values that are allowed by the comparison
+ ConstantRange CmpRange(CI->getValue());
- // If we're interested in the false dest, invert the condition
- CmpInst::Predicate Pred =
- isTrueDest ? Predicate : CmpInst::getInversePredicate(Predicate);
- ConstantRange TrueValues =
- ConstantRange::makeAllowedICmpRegion(Pred, RHSRange);
+ // If we're interested in the false dest, invert the condition
+ CmpInst::Predicate Pred =
+ isTrueDest ? Predicate : CmpInst::getInversePredicate(Predicate);
+ ConstantRange TrueValues =
+ ConstantRange::makeAllowedICmpRegion(Pred, CmpRange);
- if (Offset) // Apply the offset from above.
- TrueValues = TrueValues.subtract(Offset->getValue());
+ if (Offset) // Apply the offset from above.
+ TrueValues = TrueValues.subtract(Offset->getValue());
- Result = LVILatticeVal::getRange(std::move(TrueValues));
- return true;
+ Result = LVILatticeVal::getRange(std::move(TrueValues));
+ return true;
+ }
}
return false;
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/range.ll b/llvm/test/Transforms/CorrelatedValuePropagation/range.ll
index f8ad6bd3bbf..8ca171a286c 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/range.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/range.ll
@@ -203,115 +203,3 @@ define i1 @test11() {
next:
ret i1 %test
}
-
-define i32 @test12(i32 %a, i32 %b) {
-; CHECK-LABEL: @test12(
-; CHECK: then:
-; CHECK-NEXT: br i1 false, label %end, label %else
- %cmp = icmp ult i32 %a, %b
- br i1 %cmp, label %then, label %else
-
-then:
- %dead = icmp eq i32 %a, -1
- br i1 %dead, label %end, label %else
-
-else:
- ret i32 1
-
-end:
- ret i32 2
-}
-
-define i32 @test12_swap(i32 %a, i32 %b) {
-; CHECK-LABEL: @test12_swap(
-; CHECK: then:
-; CHECK-NEXT: br i1 false, label %end, label %else
- %cmp = icmp ugt i32 %b, %a
- br i1 %cmp, label %then, label %else
-
-then:
- %dead = icmp eq i32 %a, -1
- br i1 %dead, label %end, label %else
-
-else:
- ret i32 1
-
-end:
- ret i32 2
-}
-
-define i32 @test12_neg(i32 %a, i32 %b) {
-; The same as @test12 but the second check is on the false path
-; CHECK-LABEL: @test12_neg(
-; CHECK: else:
-; CHECK-NEXT: %alive = icmp eq i32 %a, -1
- %cmp = icmp ult i32 %a, %b
- br i1 %cmp, label %then, label %else
-
-else:
- %alive = icmp eq i32 %a, -1
- br i1 %alive, label %end, label %then
-
-then:
- ret i32 1
-
-end:
- ret i32 2
-}
-
-define i32 @test12_signed(i32 %a, i32 %b) {
-; The same as @test12 but with signed comparison
-; CHECK-LABEL: @test12_signed(
-; CHECK: then:
-; CHECK-NEXT: br i1 false, label %end, label %else
- %cmp = icmp slt i32 %a, %b
- br i1 %cmp, label %then, label %else
-
-then:
- %dead = icmp eq i32 %a, 2147483647
- br i1 %dead, label %end, label %else
-
-else:
- ret i32 1
-
-end:
- ret i32 2
-}
-
-define i32 @test13(i32 %a, i32 %b) {
-; CHECK-LABEL: @test13(
-; CHECK: then:
-; CHECK-NEXT: br i1 false, label %end, label %else
- %a.off = add i32 %a, -8
- %cmp = icmp ult i32 %a.off, %b
- br i1 %cmp, label %then, label %else
-
-then:
- %dead = icmp eq i32 %a, 7
- br i1 %dead, label %end, label %else
-
-else:
- ret i32 1
-
-end:
- ret i32 2
-}
-
-define i32 @test13_swap(i32 %a, i32 %b) {
-; CHECK-LABEL: @test13_swap(
-; CHECK: then:
-; CHECK-NEXT: br i1 false, label %end, label %else
- %a.off = add i32 %a, -8
- %cmp = icmp ugt i32 %b, %a.off
- br i1 %cmp, label %then, label %else
-
-then:
- %dead = icmp eq i32 %a, 7
- br i1 %dead, label %end, label %else
-
-else:
- ret i32 1
-
-end:
- ret i32 2
-}
OpenPOWER on IntegriCloud