summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorMichael Zolotukhin <mzolotukhin@apple.com>2016-04-06 21:47:12 +0000
committerMichael Zolotukhin <mzolotukhin@apple.com>2016-04-06 21:47:12 +0000
commit97567e141e85aa26ac4df7ceda15a31ed034409e (patch)
treed07efb40d5b6cfdcedf0ebe2e598f5e86aeae772 /llvm/test
parentc916204a81ea85b51c1469c4858b13a452fde4c0 (diff)
downloadbcm5719-llvm-97567e141e85aa26ac4df7ceda15a31ed034409e.tar.gz
bcm5719-llvm-97567e141e85aa26ac4df7ceda15a31ed034409e.zip
[LoopUnroll] Fix the way we update DT after complete unrolling.
Updating dominators for exit-blocks of the unrolled loops is not enough, as shown in PR27157. The proper way is to update dominators for all dominance-children of original loop blocks. llvm-svn: 265605
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/LoopUnroll/pr27157.ll53
1 files changed, 53 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopUnroll/pr27157.ll b/llvm/test/Transforms/LoopUnroll/pr27157.ll
new file mode 100644
index 00000000000..917bcf1f944
--- /dev/null
+++ b/llvm/test/Transforms/LoopUnroll/pr27157.ll
@@ -0,0 +1,53 @@
+; RUN: opt -loop-unroll -debug-only=loop-unroll -disable-output < %s
+; REQUIRES: asserts
+; Compile this test with debug flag on to verify domtree right after loop unrolling.
+target datalayout = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
+
+; PR27157
+define void @foo() {
+entry:
+ br label %loop_header
+loop_header:
+ %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
+ br i1 undef, label %loop_latch, label %loop_exiting_bb1
+loop_exiting_bb1:
+ br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
+loop_exiting_bb2:
+ br i1 false, label %loop_latch, label %bb
+bb:
+ br label %exit1
+loop_latch:
+ %iv_next = add nuw nsw i64 %iv, 1
+ %cmp = icmp ne i64 %iv_next, 2
+ br i1 %cmp, label %loop_header, label %exit2
+exit1.loopexit:
+ br label %exit1
+exit1:
+ ret void
+exit2:
+ ret void
+}
+
+define void @foo2() {
+entry:
+ br label %loop.header
+loop.header:
+ %iv = phi i32 [ 0, %entry ], [ %iv.inc, %latch ]
+ %iv.inc = add i32 %iv, 1
+ br i1 undef, label %diamond, label %latch
+diamond:
+ br i1 undef, label %left, label %right
+left:
+ br i1 undef, label %exit, label %merge
+right:
+ br i1 undef, label %exit, label %merge
+merge:
+ br label %latch
+latch:
+ %end.cond = icmp eq i32 %iv, 1
+ br i1 %end.cond, label %exit1, label %loop.header
+exit:
+ ret void
+exit1:
+ ret void
+}
OpenPOWER on IntegriCloud