diff options
Diffstat (limited to 'llvm/test/Transforms/LoopUnroll/AArch64/full-unroll-trip-count-upper-bound.ll')
-rw-r--r-- | llvm/test/Transforms/LoopUnroll/AArch64/full-unroll-trip-count-upper-bound.ll | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopUnroll/AArch64/full-unroll-trip-count-upper-bound.ll b/llvm/test/Transforms/LoopUnroll/AArch64/full-unroll-trip-count-upper-bound.ll new file mode 100644 index 00000000000..5c70a2668db --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/AArch64/full-unroll-trip-count-upper-bound.ll @@ -0,0 +1,43 @@ +; RUN: opt -loop-unroll -S -mtriple aarch64 -mcpu=cortex-a57 %s | FileCheck %s -check-prefix=UNROLL +; RUN: opt -loop-unroll -unroll-max-upperbound=0 -S -mtriple aarch64 -mcpu=cortex-a57 %s | FileCheck %s -check-prefix=NOUNROLL + +; This IR comes from this C code: +; +; for (int i = 0; i < 4; i++) { +; if (src[i] == 1) { +; *dst = i; +; break; +; } +; } +; +; This test is meant to check that this loop is unrolled into four iterations. + +; UNROLL-LABEL: @test +; UNROLL: load i32, i32* +; UNROLL: load i32, i32* +; UNROLL: load i32, i32* +; UNROLL: load i32, i32* +; UNROLL-NOT: load i32, i32* +; NOUNROLL-LABEL: @test +; NOUNROLL: load i32, i32* +; NOUNROLL-NOT: load i32, i32* + +define void @test(i32* %dst, i32* %src) { +entry: + br label %for.body + +for.body: ; preds = %entry, %for.body + %i = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %0 = sext i32 %i to i64 + %1 = getelementptr inbounds i32, i32* %src, i64 %0 + %2 = load i32, i32* %1 + %inc = add nsw i32 %i, 1 + %cmp1 = icmp slt i32 %inc, 4 + %cmp3 = icmp eq i32 %2, 1 + %or.cond = and i1 %cmp3, %cmp1 + br i1 %or.cond, label %for.body, label %exit + +exit: ; preds = %for.body + store i32 %i, i32* %dst + ret void +} |