summaryrefslogtreecommitdiffstats
path: root/llvm/test/Analysis/ScalarEvolution/2012-05-18-LoopPredRecurse.ll
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2012-05-19 00:48:25 +0000
committerAndrew Trick <atrick@apple.com>2012-05-19 00:48:25 +0000
commit7fa4e0fea680bde6f19e770cc57fc98453226aea (patch)
tree34076ed7627cfa620aa601b2872c71a376ef4314 /llvm/test/Analysis/ScalarEvolution/2012-05-18-LoopPredRecurse.ll
parent8d27075c3d53368c14f0dd06b387529379de742d (diff)
downloadbcm5719-llvm-7fa4e0fea680bde6f19e770cc57fc98453226aea.tar.gz
bcm5719-llvm-7fa4e0fea680bde6f19e770cc57fc98453226aea.zip
SCEV: Add MarkPendingLoopPredicates to avoid recursive isImpliedCond.
getUDivExpr attempts to simplify by checking for overflow. isLoopEntryGuardedByCond then evaluates the loop predicate which may lead to the same getUDivExpr causing endless recursion. Fixes PR12868: clang 3.2 segmentation fault. llvm-svn: 157092
Diffstat (limited to 'llvm/test/Analysis/ScalarEvolution/2012-05-18-LoopPredRecurse.ll')
-rw-r--r--llvm/test/Analysis/ScalarEvolution/2012-05-18-LoopPredRecurse.ll30
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/test/Analysis/ScalarEvolution/2012-05-18-LoopPredRecurse.ll b/llvm/test/Analysis/ScalarEvolution/2012-05-18-LoopPredRecurse.ll
new file mode 100644
index 00000000000..52e6683c9f0
--- /dev/null
+++ b/llvm/test/Analysis/ScalarEvolution/2012-05-18-LoopPredRecurse.ll
@@ -0,0 +1,30 @@
+; RUN: opt < %s -iv-users -S -disable-output
+;
+; PR12868: Infinite recursion:
+; getUDivExpr()->getZeroExtendExpr()->isLoopBackedgeGuardedBy()
+;
+; We actually want SCEV simplification to fail gracefully in this
+; case, so there's no output to check, just the absense of stack overflow.
+
+@c = common global i8 0, align 1
+
+define i32 @func() {
+entry:
+ br label %for.cond
+
+for.cond: ; preds = %for.body, %entry
+ %storemerge = phi i8 [ -1, %entry ], [ %inc, %for.body ]
+ %ui.0 = phi i32 [ undef, %entry ], [ %div, %for.body ]
+ %tobool = icmp eq i8 %storemerge, 0
+ br i1 %tobool, label %for.end, label %for.body
+
+for.body: ; preds = %for.cond
+ %conv = sext i8 %storemerge to i32
+ %div = lshr i32 %conv, 1
+ %tobool2 = icmp eq i32 %div, 0
+ %inc = add i8 %storemerge, 1
+ br i1 %tobool2, label %for.cond, label %for.end
+
+for.end: ; preds = %for.body, %for.cond
+ ret i32 0
+}
OpenPOWER on IntegriCloud