diff options
| author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-03-26 17:28:26 +0000 |
|---|---|---|
| committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-03-26 17:28:26 +0000 |
| commit | 14598830fe9ea08c1cb073390b2d79f79a2a9342 (patch) | |
| tree | 719c4bb0297e9d3805a4ea894a08f6b4de498f4a | |
| parent | 0781e98cc74223fd73491bc44a9d406f2c0b41c1 (diff) | |
| download | bcm5719-llvm-14598830fe9ea08c1cb073390b2d79f79a2a9342.tar.gz bcm5719-llvm-14598830fe9ea08c1cb073390b2d79f79a2a9342.zip | |
[SCEV] Revert bailout added in r75511.
Summary:
With the introduction of MarkPendingLoopPredicates in r157092, I don't
think the bailout is needed anymore.
Reviewers: atrick, nicholas
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D8624
llvm-svn: 233296
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 23 | ||||
| -rw-r--r-- | llvm/test/Analysis/ScalarEvolution/ext-antecedent.ll | 45 |
2 files changed, 56 insertions, 12 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index fdfe5cbd498..4e713fb1218 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -6793,15 +6793,6 @@ bool ScalarEvolution::isImpliedCond(ICmpInst::Predicate Pred, ICmpInst *ICI = dyn_cast<ICmpInst>(FoundCondValue); if (!ICI) return false; - // Bail if the ICmp's operands' types are wider than the needed type - // before attempting to call getSCEV on them. This avoids infinite - // recursion, since the analysis of widening casts can require loop - // exit condition information for overflow checking, which would - // lead back here. - if (getTypeSizeInBits(LHS->getType()) < - getTypeSizeInBits(ICI->getOperand(0)->getType())) - return false; - // Now that we found a conditional branch that dominates the loop or controls // the loop latch. Check to see if it is the comparison we are looking for. ICmpInst::Predicate FoundPred; @@ -6813,9 +6804,17 @@ bool ScalarEvolution::isImpliedCond(ICmpInst::Predicate Pred, const SCEV *FoundLHS = getSCEV(ICI->getOperand(0)); const SCEV *FoundRHS = getSCEV(ICI->getOperand(1)); - // Balance the types. The case where FoundLHS' type is wider than - // LHS' type is checked for above. - if (getTypeSizeInBits(LHS->getType()) > + // Balance the types. + if (getTypeSizeInBits(LHS->getType()) < + getTypeSizeInBits(FoundLHS->getType())) { + if (CmpInst::isSigned(Pred)) { + LHS = getSignExtendExpr(LHS, FoundLHS->getType()); + RHS = getSignExtendExpr(RHS, FoundLHS->getType()); + } else { + LHS = getZeroExtendExpr(LHS, FoundLHS->getType()); + RHS = getZeroExtendExpr(RHS, FoundLHS->getType()); + } + } else if (getTypeSizeInBits(LHS->getType()) > getTypeSizeInBits(FoundLHS->getType())) { if (CmpInst::isSigned(FoundPred)) { FoundLHS = getSignExtendExpr(FoundLHS, LHS->getType()); diff --git a/llvm/test/Analysis/ScalarEvolution/ext-antecedent.ll b/llvm/test/Analysis/ScalarEvolution/ext-antecedent.ll new file mode 100644 index 00000000000..e8d38133ad3 --- /dev/null +++ b/llvm/test/Analysis/ScalarEvolution/ext-antecedent.ll @@ -0,0 +1,45 @@ +; RUN: opt -S -indvars < %s | FileCheck %s + +declare void @use(i1) + +define void @sext_condition(i8 %t) { +; CHECK-LABEL: sext_condition + entry: + %st = sext i8 %t to i16 + %ecmp = icmp slt i16 %st, 42 + br i1 %ecmp, label %loop, label %exit + + loop: +; CHECK-LABEL: loop + %idx = phi i8 [ %t, %entry ], [ %idx.inc, %loop ] + %idx.inc = add i8 %idx, 1 + %c = icmp slt i8 %idx, 42 +; CHECK: call void @use(i1 true) + call void @use(i1 %c) + %be = icmp slt i8 %idx.inc, 42 + br i1 %be, label %loop, label %exit + + exit: + ret void +} + +define void @zext_condition(i8 %t) { +; CHECK-LABEL: zext_condition + entry: + %st = zext i8 %t to i16 + %ecmp = icmp ult i16 %st, 42 + br i1 %ecmp, label %loop, label %exit + + loop: +; CHECK-LABEL: loop + %idx = phi i8 [ %t, %entry ], [ %idx.inc, %loop ] + %idx.inc = add i8 %idx, 1 + %c = icmp ult i8 %idx, 42 +; CHECK: call void @use(i1 true) + call void @use(i1 %c) + %be = icmp ult i8 %idx.inc, 42 + br i1 %be, label %loop, label %exit + + exit: + ret void +} |

