diff options
author | Zhaoshi Zheng <zhaoshiz@quicinc.com> | 2019-09-26 21:40:27 +0000 |
---|---|---|
committer | Zhaoshi Zheng <zhaoshiz@quicinc.com> | 2019-09-26 21:40:27 +0000 |
commit | 1128fa09249126449270f807a25a1e40db87d8c5 (patch) | |
tree | 8a12bb097eff7a2d11aa899537552bb6a6955e18 /llvm/test/Transforms/LoopUnroll | |
parent | 7dfb095b882d6b3ec42c7b9c4391ce3e30d37375 (diff) | |
download | bcm5719-llvm-1128fa09249126449270f807a25a1e40db87d8c5.tar.gz bcm5719-llvm-1128fa09249126449270f807a25a1e40db87d8c5.zip |
[Unroll] Do NOT unroll a loop with small runtime upperbound
For a runtime loop if we can compute its trip count upperbound:
Don't unroll if:
1. loop is not guaranteed to run either zero or upperbound iterations; and
2. trip count upperbound is less than UnrollMaxUpperBound
Unless user or TTI asked to do so.
If unrolling, limit unroll factor to loop's trip count upperbound.
Differential Revision: https://reviews.llvm.org/D62989
Change-Id: I6083c46a9d98b2e22cd855e60523fdc5a4929c73
llvm-svn: 373017
Diffstat (limited to 'llvm/test/Transforms/LoopUnroll')
-rw-r--r-- | llvm/test/Transforms/LoopUnroll/runtime-small-upperbound.ll | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopUnroll/runtime-small-upperbound.ll b/llvm/test/Transforms/LoopUnroll/runtime-small-upperbound.ll new file mode 100644 index 00000000000..95632a5a3be --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/runtime-small-upperbound.ll @@ -0,0 +1,70 @@ +; RUN: opt -S -loop-unroll -unroll-runtime %s -o - | FileCheck %s +; RUN: opt -S -loop-unroll -unroll-runtime -unroll-max-upperbound=6 %s -o - | FileCheck %s --check-prefix=UPPER + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" + +@global = dso_local local_unnamed_addr global i32 0, align 4 +@global.1 = dso_local local_unnamed_addr global i8* null, align 4 + +; Check that loop in hoge_3, with a runtime upperbound of 3, is not unrolled. +; CHECK-LABEL: hoge_3 +; CHECK: loop: +; CHECK: store +; CHECK-NOT: store +; CHECK: br i1 %{{.*}}, label %loop +; UPPER-LABEL: hoge_3 +; UPPER: loop: +; UPPER: store +; UPPER-NOT: store +; UPPER: br i1 %{{.*}}, label %loop +define dso_local void @hoge_3(i8 %arg) { +entry: + %x = load i32, i32* @global, align 4 + %y = load i8*, i8** @global.1, align 4 + %0 = icmp ult i32 %x, 17 + br i1 %0, label %loop, label %exit + +loop: + %iv = phi i32 [ %x, %entry ], [ %iv.next, %loop ] + %ptr = phi i8* [ %y, %entry ], [ %ptr.next, %loop ] + %iv.next = add nuw i32 %iv, 8 + %ptr.next = getelementptr inbounds i8, i8* %ptr, i32 1 + store i8 %arg, i8* %ptr.next, align 1 + %1 = icmp ult i32 %iv.next, 17 + br i1 %1, label %loop, label %exit + +exit: + ret void +} + +; Check that loop in hoge_5, with a runtime upperbound of 5, is unrolled when -unroll-max-upperbound=4 +; CHECK-LABEL: hoge_5 +; CHECK: loop: +; CHECK: store +; CHECK-NOT: store +; CHECK: br i1 %{{.*}}, label %loop +; UPPER-LABEL: hoge_5 +; UPPER: loop: +; UPPER: store +; UPPER: store +; UPPER: store +; UPPER: br i1 %{{.*}}, label %loop +define dso_local void @hoge_5(i8 %arg) { +entry: + %x = load i32, i32* @global, align 4 + %y = load i8*, i8** @global.1, align 4 + %0 = icmp ult i32 %x, 17 + br i1 %0, label %loop, label %exit + +loop: + %iv = phi i32 [ %x, %entry ], [ %iv.next, %loop ] + %ptr = phi i8* [ %y, %entry ], [ %ptr.next, %loop ] + %iv.next = add nuw i32 %iv, 4 + %ptr.next = getelementptr inbounds i8, i8* %ptr, i32 1 + store i8 %arg, i8* %ptr.next, align 1 + %1 = icmp ult i32 %iv.next, 17 + br i1 %1, label %loop, label %exit + +exit: + ret void +} |