[llvm] r277848 - [SCEV] Don't infinitely recurse on unreachable code
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 5 11:34:14 PDT 2016
Author: sanjoy
Date: Fri Aug 5 13:34:14 2016
New Revision: 277848
URL: http://llvm.org/viewvc/llvm-project?rev=277848&view=rev
Log:
[SCEV] Don't infinitely recurse on unreachable code
Modified:
llvm/trunk/lib/Analysis/ScalarEvolution.cpp
llvm/trunk/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll
Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=277848&r1=277847&r2=277848&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Aug 5 13:34:14 2016
@@ -4168,7 +4168,9 @@ static bool BrPHIToSelect(DominatorTree
}
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.
Modified: llvm/trunk/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll?rev=277848&r1=277847&r2=277848&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll (original)
+++ llvm/trunk/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll Fri Aug 5 13:34:14 2016
@@ -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
+}
More information about the llvm-commits
mailing list