OSDN Git Service

[SCEV] Don't infinitely recurse on unreachable code
authorSanjoy Das <sanjoy@playingwithpointers.com>
Fri, 5 Aug 2016 18:34:14 +0000 (18:34 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Fri, 5 Aug 2016 18:34:14 +0000 (18:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277848 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp
test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll

index 482d3a6..d3d85b1 100644 (file)
@@ -4168,7 +4168,9 @@ static bool BrPHIToSelect(DominatorTree &DT, BranchInst *BI, PHINode *Merge,
 }
 
 const SCEV *ScalarEvolution::createNodeFromSelectLikePHI(PHINode *PN) {
-  if (PN->getNumIncomingValues() == 2) {
+  auto IsReachable =
+      [&](BasicBlock *BB) { return DT.isReachableFromEntry(BB); };
+  if (PN->getNumIncomingValues() == 2 && all_of(PN->blocks(), IsReachable)) {
     const Loop *L = LI.getLoopFor(PN->getParent());
 
     // We don't want to break LCSSA, even in a SCEV expression tree.
index 500f3e1..dc24bd1 100644 (file)
@@ -126,3 +126,31 @@ for.cond.0:
 
   ret i32 %init
 }
+
+define i32 @f6(i32 %x, i32 %y) {
+; Do the right thing for unreachable code:
+
+; CHECK-LABEL: Classifying expressions for: @f6
+ entry:
+  %c0 = icmp sgt i32 %y, 0
+  %sum = add i32 %x, %y
+  br i1 %c0, label %merge, label %leave_1
+
+ merge:
+  %v0 = phi i32 [ %sum, %entry ], [ %v1, %unreachable ]
+  %c1 = icmp slt i32 %y, 0
+  br i1 %c1, label %leave_0, label %leave_0_cond
+
+leave_0_cond:
+  br label %leave_0
+
+leave_0:
+  %v1 = phi i32 [ %v0, %merge ], [ 0, %leave_0_cond ]
+  ret i32 0
+
+leave_1:
+  ret i32 0
+
+unreachable:
+  br label %merge
+}