diff options
author | Michael Zolotukhin <mzolotukhin@apple.com> | 2016-04-06 21:47:12 +0000 |
---|---|---|
committer | Michael Zolotukhin <mzolotukhin@apple.com> | 2016-04-06 21:47:12 +0000 |
commit | 97567e141e85aa26ac4df7ceda15a31ed034409e (patch) | |
tree | d07efb40d5b6cfdcedf0ebe2e598f5e86aeae772 /llvm/test | |
parent | c916204a81ea85b51c1469c4858b13a452fde4c0 (diff) | |
download | bcm5719-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.ll | 53 |
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 +} |