diff options
author | Kevin Qin <Kevin.Qin@arm.com> | 2015-03-09 06:14:07 +0000 |
---|---|---|
committer | Kevin Qin <Kevin.Qin@arm.com> | 2015-03-09 06:14:07 +0000 |
commit | 3836dd03155be5cd57bd301a1c6458f7524d2bd8 (patch) | |
tree | 42805a5928754e32551e1b2f93c096fca270d7bf /test | |
parent | 4c8f5afd99a18ab81efe12b1fb26b150728a332d (diff) |
Run LICM pass after loop unrolling pass.
Runtime unrollng will introduce a runtime check in loop prologue.
If the unrolled loop is a inner loop, then the proglogue will be inside
the outer loop. LICM pass can help to promote the runtime check out if
the checked value is loop invariant.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231630 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/Transforms/LoopUnroll/runtime-loop4.ll | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/test/Transforms/LoopUnroll/runtime-loop4.ll b/test/Transforms/LoopUnroll/runtime-loop4.ll new file mode 100644 index 00000000000..9be0ffd23d3 --- /dev/null +++ b/test/Transforms/LoopUnroll/runtime-loop4.ll @@ -0,0 +1,43 @@ +; RUN: opt < %s -S -O2 -unroll-runtime=true | FileCheck %s + +; Check runtime unrolling prologue can be promoted by LICM pass. + +; CHECK: entry: +; CHECK: %xtraiter +; CHECK: %lcmp.mod +; CHECK: loop1: +; CHECK: br i1 %lcmp.mod +; CHECK: loop2.prol: + +define void @unroll(i32 %iter, i32* %addr1, i32* %addr2) nounwind { +entry: + br label %loop1 + +loop1: + %iv1 = phi i32 [ 0, %entry ], [ %inc1, %loop1.latch ] + %offset1 = getelementptr i32, i32* %addr1, i32 %iv1 + store i32 %iv1, i32* %offset1, align 4 + br label %loop2.header + +loop2.header: + br label %loop2 + +loop2: + %iv2 = phi i32 [ 0, %loop2.header ], [ %inc2, %loop2 ] + %offset2 = getelementptr i32, i32* %addr2, i32 %iv2 + store i32 %iv2, i32* %offset2, align 4 + %inc2 = add i32 %iv2, 1 + %exitcnd2 = icmp uge i32 %inc2, %iter + br i1 %exitcnd2, label %exit2, label %loop2 + +exit2: + br label %loop1.latch + +loop1.latch: + %inc1 = add i32 %iv1, 1 + %exitcnd1 = icmp uge i32 %inc1, 1024 + br i1 %exitcnd1, label %exit, label %loop1 + +exit: + ret void +} |