]> granicus.if.org Git - llvm/commitdiff
Loop unroller: set thresholds for optsize and minsize functions to zero
authorHans Wennborg <hans@hanshq.net>
Tue, 10 May 2016 21:45:55 +0000 (21:45 +0000)
committerHans Wennborg <hans@hanshq.net>
Tue, 10 May 2016 21:45:55 +0000 (21:45 +0000)
Before r268509, Clang would disable the loop unroll pass when optimizing
for size. That commit enabled it to be able to support unroll pragmas
in -Os builds. However, this regressed binary size in one of Chromium's
DLLs with ~100 KB.

This restores the original behaviour of no unrolling at -Os, but doing it
in LLVM instead of Clang makes more sense, and also allows the pragmas to
keep working.

Differential revision: http://reviews.llvm.org/D20115

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@269124 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopUnrollPass.cpp
test/Transforms/LoopUnroll/PowerPC/a2-unrolling.ll
test/Transforms/LoopUnroll/PowerPC/p7-unrolling.ll
test/Transforms/LoopUnroll/partial-unroll-optsize.ll [deleted file]
test/Transforms/LoopUnroll/unroll-opt-attribute.ll
test/Transforms/LoopUnroll/unroll-pragmas.ll

index 2e5c55e73a4fcca4e0160af7254b8ba4916939a4..95ec12d5cb89c6d4536ad67ac28ac3c83262ddde 100644 (file)
@@ -111,9 +111,9 @@ static TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences(
   UP.Threshold = 150;
   UP.PercentDynamicCostSavedThreshold = 20;
   UP.DynamicCostSavingsDiscount = 2000;
-  UP.OptSizeThreshold = 50;
+  UP.OptSizeThreshold = 0;
   UP.PartialThreshold = UP.Threshold;
-  UP.PartialOptSizeThreshold = UP.OptSizeThreshold;
+  UP.PartialOptSizeThreshold = 0;
   UP.Count = 0;
   UP.MaxCount = UINT_MAX;
   UP.FullUnrollMaxCount = UINT_MAX;
index bf2b9cf40dd0e8bd3713e954b285b5c8a16ef947..77e92bd7506cf655eacd542987f070488ae48d0a 100644 (file)
@@ -1,30 +1,5 @@
 ; RUN: opt < %s -S -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 -loop-unroll | FileCheck %s -check-prefix=EPILOG
 ; RUN: opt < %s -S -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 -loop-unroll -unroll-runtime-epilog=false | FileCheck %s -check-prefix=PROLOG
-define void @unroll_opt_for_size() nounwind optsize {
-entry:
-  br label %loop
-
-loop:
-  %iv = phi i32 [ 0, %entry ], [ %inc, %loop ]
-  %inc = add i32 %iv, 1
-  %exitcnd = icmp uge i32 %inc, 1024
-  br i1 %exitcnd, label %exit, label %loop
-
-exit:
-  ret void
-}
-
-; EPILOG-LABEL: @unroll_opt_for_size
-; EPILOG:      add
-; EPILOG-NEXT: add
-; EPILOG-NEXT: add
-; EPILOG: icmp
-
-; PROLOG-LABEL: @unroll_opt_for_size
-; PROLOG:      add
-; PROLOG-NEXT: add
-; PROLOG-NEXT: add
-; PROLOG: icmp
 
 define i32 @test(i32* nocapture %a, i32 %n) nounwind uwtable readonly {
 entry:
index 7a50fc0a4f49e7dc8daa354fd49ac2e17ad3437e..c9677d83e377525e6f1fdd1b9f1658d3fa818c64 100644 (file)
@@ -1,53 +1,4 @@
 ; RUN: opt < %s -S -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -loop-unroll | FileCheck %s
-define void @unroll_opt_for_size() nounwind optsize {
-entry:
-  br label %loop
-
-loop:
-  %iv = phi i32 [ 0, %entry ], [ %inc, %loop ]
-  %inc = add i32 %iv, 1
-  %exitcnd = icmp uge i32 %inc, 1024
-  br i1 %exitcnd, label %exit, label %loop
-
-exit:
-  ret void
-}
-
-; CHECK-LABEL: @unroll_opt_for_size
-; CHECK:      add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: icmp
-
 define void @unroll_default() nounwind {
 entry:
   br label %loop
diff --git a/test/Transforms/LoopUnroll/partial-unroll-optsize.ll b/test/Transforms/LoopUnroll/partial-unroll-optsize.ll
deleted file mode 100644 (file)
index e5e0151..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-; RUN: opt < %s -S -loop-unroll -unroll-allow-partial | FileCheck %s
-; RUN: sed -e 's/optsize/minsize/' %s | opt -S -loop-unroll -unroll-allow-partial | FileCheck %s
-
-; Loop size = 3, when the function has the optsize attribute, the
-; OptSizeUnrollThreshold, i.e. 50, is used, hence the loop should be unrolled
-; by 32 times because (1 * 32) + 2 < 50 (whereas (1 * 64 + 2) is not).
-define void @unroll_opt_for_size() nounwind optsize {
-entry:
-  br label %loop
-
-loop:
-  %iv = phi i32 [ 0, %entry ], [ %inc, %loop ]
-  %inc = add i32 %iv, 1
-  %exitcnd = icmp uge i32 %inc, 1024
-  br i1 %exitcnd, label %exit, label %loop
-
-exit:
-  ret void
-}
-
-; CHECK:      add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: add
-; CHECK-NEXT: icmp
index 334162f5605525afa588a0b43506db78046ef940..f4a76c71368d1c31cedda8ac2f3b186914b63e33 100644 (file)
@@ -4,10 +4,10 @@
 \r
 ;///////////////////// TEST 1 //////////////////////////////\r
 \r
-; This test shows that with optsize attribute, the loop is unrolled\r
-; according to the specified unroll factor.\r
+; This test shows that the loop is unrolled according to the specified\r
+; unroll factor.\r
 \r
-define void @Test1() nounwind optsize {\r
+define void @Test1() nounwind {\r
 entry:\r
   br label %loop\r
 \r
@@ -32,38 +32,10 @@ exit:
 \r
 ;///////////////////// TEST 2 //////////////////////////////\r
 \r
-; This test shows that with minsize attribute, the loop is unrolled\r
-; according to the specified unroll factor.\r
-\r
-define void @Test2() nounwind minsize {\r
-entry:\r
-  br label %loop\r
-\r
-loop:\r
-  %iv = phi i32 [ 0, %entry ], [ %inc, %loop ]\r
-  %inc = add i32 %iv, 1\r
-  %exitcnd = icmp uge i32 %inc, 1024\r
-  br i1 %exitcnd, label %exit, label %loop\r
-\r
-exit:\r
-  ret void\r
-}\r
-\r
-; CHECK_COUNT4-LABEL: @Test2\r
-; CHECK_COUNT4:      phi\r
-; CHECK_COUNT4-NEXT: add\r
-; CHECK_COUNT4-NEXT: add\r
-; CHECK_COUNT4-NEXT: add\r
-; CHECK_COUNT4-NEXT: add\r
-; CHECK_COUNT4-NEXT: icmp\r
-\r
-\r
-;///////////////////// TEST 3 //////////////////////////////\r
-\r
 ; This test shows that with optnone attribute, the loop is not unrolled\r
 ; even if an unroll factor was specified.\r
 \r
-define void @Test3() nounwind optnone noinline {\r
+define void @Test2() nounwind optnone noinline {\r
 entry:\r
   br label %loop\r
 \r
@@ -77,20 +49,19 @@ exit:
   ret void\r
 }\r
 \r
-; CHECK_COUNT4-LABEL: @Test3\r
+; CHECK_COUNT4-LABEL: @Test2\r
 ; CHECK_COUNT4:      phi\r
 ; CHECK_COUNT4-NEXT: add\r
 ; CHECK_COUNT4-NEXT: icmp\r
 \r
 \r
-;///////////////////// TEST 4 //////////////////////////////\r
+;///////////////////// TEST 3 //////////////////////////////\r
 \r
-; This test shows that without any attribute, this loop is fully unrolled \r
-; by default.\r
+; This test shows that this loop is fully unrolled by default.\r
 \r
 @tab = common global [24 x i32] zeroinitializer, align 4\r
 \r
-define i32 @Test4() {\r
+define i32 @Test3() {\r
 entry:\r
   br label %for.body\r
 \r
@@ -106,7 +77,7 @@ for.end:                                          ; preds = %for.body
   ret i32 42\r
 }\r
 \r
-; CHECK_NOCOUNT-LABEL: @Test4\r
+; CHECK_NOCOUNT-LABEL: @Test3\r
 ; CHECK_NOCOUNT:      store\r
 ; CHECK_NOCOUNT-NEXT: store\r
 ; CHECK_NOCOUNT-NEXT: store\r
@@ -134,12 +105,11 @@ for.end:                                          ; preds = %for.body
 ; CHECK_NOCOUNT-NEXT: ret\r
 \r
 \r
-;///////////////////// TEST 5 //////////////////////////////\r
+;///////////////////// TEST 4 //////////////////////////////\r
 \r
-; This test shows that with optsize attribute, this loop is not unrolled \r
-; by default.\r
+; This test shows that with optsize attribute, this loop is not unrolled.\r
 \r
-define i32 @Test5() optsize {\r
+define i32 @Test4() optsize {\r
 entry:\r
   br label %for.body\r
 \r
@@ -155,6 +125,6 @@ for.end:                                          ; preds = %for.body
   ret i32 42\r
 }\r
 \r
-; CHECK_NOCOUNT-LABEL: @Test5\r
+; CHECK_NOCOUNT-LABEL: @Test4\r
 ; CHECK_NOCOUNT:      phi\r
 ; CHECK_NOCOUNT:      icmp\r
index 88f32c92d694f353ef5fdbbaacb5574425603918..5b405a030a163456906844e2f047bed6d3dd7e09 100644 (file)
@@ -108,6 +108,29 @@ for.end:                                          ; preds = %for.body
 !3 = !{!3, !4}
 !4 = !{!"llvm.loop.unroll.full"}
 
+; #pragma clang loop unroll(full)
+; Loop should be fully unrolled, even for optsize.
+;
+; CHECK-LABEL: @loop64_with_full_optsize(
+; CHECK-NOT: br i1
+define void @loop64_with_full_optsize(i32* nocapture %a) optsize {
+entry:
+  br label %for.body
+
+for.body:                                         ; preds = %for.body, %entry
+  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %inc = add nsw i32 %0, 1
+  store i32 %inc, i32* %arrayidx, align 4
+  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+  %exitcond = icmp eq i64 %indvars.iv.next, 64
+  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !3
+
+for.end:                                          ; preds = %for.body
+  ret void
+}
+
 ; #pragma clang loop unroll_count(4)
 ; Loop should be unrolled 4 times.
 ;