diff options
Diffstat (limited to 'test/Transforms/LoopUnroll/runtime-loop.ll')
| -rw-r--r-- | test/Transforms/LoopUnroll/runtime-loop.ll | 68 | 
1 files changed, 68 insertions, 0 deletions
diff --git a/test/Transforms/LoopUnroll/runtime-loop.ll b/test/Transforms/LoopUnroll/runtime-loop.ll index 04661314eb1d7..878f4e8c78f0f 100644 --- a/test/Transforms/LoopUnroll/runtime-loop.ll +++ b/test/Transforms/LoopUnroll/runtime-loop.ll @@ -170,6 +170,74 @@ for.end:                                          ; preds = %for.cond.for.end_cr    ret i16 %res.0.lcssa  } +; dont unroll loop with multiple exit/exiting blocks, unless +; -runtime-unroll-multi-exit=true +; single exit, multiple exiting blocks. +define void @unique_exit(i32 %arg) { +; PROLOG: unique_exit( +; PROLOG-NOT: .unr + +; EPILOG: unique_exit( +; EPILOG-NOT: .unr +entry: +  %tmp = icmp sgt i32 undef, %arg +  br i1 %tmp, label %preheader, label %returnblock + +preheader:                                 ; preds = %entry +  br label %header + +LoopExit:                                ; preds = %header, %latch +  %tmp2.ph = phi i32 [ %tmp4, %header ], [ -1, %latch ] +  br label %returnblock + +returnblock:                                         ; preds = %LoopExit, %entry +  %tmp2 = phi i32 [ -1, %entry ], [ %tmp2.ph, %LoopExit ] +  ret void + +header:                                           ; preds = %preheader, %latch +  %tmp4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ] +  %inc = add nsw i32 %tmp4, 1 +  br i1 true, label %LoopExit, label %latch + +latch:                                            ; preds = %header +  %cmp = icmp slt i32 %inc, undef +  br i1 %cmp, label %header, label %LoopExit +} + +; multiple exit blocks. don't unroll +define void @multi_exit(i64 %trip, i1 %cond) { +; PROLOG: multi_exit( +; PROLOG-NOT: .unr + +; EPILOG: multi_exit( +; EPILOG-NOT: .unr +entry: +  br label %loop_header + +loop_header: +  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] +  br i1 %cond, label %loop_latch, label %loop_exiting_bb1 + +loop_exiting_bb1: +  br i1 false, label %loop_exiting_bb2, label %exit1 + +loop_exiting_bb2: +  br i1 false, label %loop_latch, label %exit3 + +exit3: +  ret void + +loop_latch: +  %iv_next = add i64 %iv, 1 +  %cmp = icmp ne i64 %iv_next, %trip +  br i1 %cmp, label %loop_header, label %exit2.loopexit + +exit1: + ret void + +exit2.loopexit: +  ret void +}  !0 = distinct !{!0, !1}  !1 = !{!"llvm.loop.unroll.runtime.disable"}  | 
