summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LoopUnroll
diff options
context:
space:
mode:
authorZhaoshi Zheng <zhaoshiz@quicinc.com>2019-09-26 21:40:27 +0000
committerZhaoshi Zheng <zhaoshiz@quicinc.com>2019-09-26 21:40:27 +0000
commit1128fa09249126449270f807a25a1e40db87d8c5 (patch)
tree8a12bb097eff7a2d11aa899537552bb6a6955e18 /llvm/test/Transforms/LoopUnroll
parent7dfb095b882d6b3ec42c7b9c4391ce3e30d37375 (diff)
downloadbcm5719-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.ll70
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
+}
OpenPOWER on IntegriCloud