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;
; 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:
; 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
+++ /dev/null
-; 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
\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
\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
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
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
; 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
ret i32 42\r
}\r
\r
-; CHECK_NOCOUNT-LABEL: @Test5\r
+; CHECK_NOCOUNT-LABEL: @Test4\r
; CHECK_NOCOUNT: phi\r
; CHECK_NOCOUNT: icmp\r
!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.
;