[llvm-commits] [llvm] r54160 - in /llvm/trunk: lib/Transforms/Scalar/LoopUnroll.cpp test/Transforms/LoopUnroll/partial.ll

Matthijs Kooijman matthijs at stdin.nl
Tue Jul 29 06:21:24 PDT 2008


Author: matthijs
Date: Tue Jul 29 08:21:23 2008
New Revision: 54160

URL: http://llvm.org/viewvc/llvm-project?rev=54160&view=rev
Log:
Add -unroll-allow-partial command line option that enabled the loop unroller to
partially unroll a loop when fully unrolling would not fit under the threshold.

Patch by Mikael Lepistö.

Added:
    llvm/trunk/test/Transforms/LoopUnroll/partial.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp?rev=54160&r1=54159&r2=54160&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp Tue Jul 29 08:21:23 2008
@@ -33,6 +33,11 @@
 UnrollCount("unroll-count", cl::init(0), cl::Hidden,
   cl::desc("Use this unroll count for all loops, for testing purposes"));
 
+static cl::opt<bool>
+UnrollAllowPartial("unroll-allow-partial", cl::init(false), cl::Hidden,
+  cl::desc("Allows loops to be partially unrolled until "
+           "-unroll-threshold loop size is reached."));
+
 namespace {
   class VISIBILITY_HIDDEN LoopUnroll : public LoopPass {
   public:
@@ -122,7 +127,8 @@
   if (Count == 0) {
     // Conservative heuristic: if we know the trip count, see if we can
     // completely unroll (subject to the threshold, checked below); otherwise
-    // don't unroll.
+    // try to find greatest modulo of the trip count which is still under 
+    // threshold value.
     if (TripCount != 0) {
       Count = TripCount;
     } else {
@@ -136,9 +142,25 @@
     DOUT << "  Loop Size = " << LoopSize << "\n";
     uint64_t Size = (uint64_t)LoopSize*Count;
     if (TripCount != 1 && Size > UnrollThreshold) {
-      DOUT << "  TOO LARGE TO UNROLL: "
-           << Size << ">" << UnrollThreshold << "\n";
-      return false;
+      DOUT << "  Too large to fully unroll with count: " << Count
+           << " because size: " << Size << ">" << UnrollThreshold << "\n";
+      if (UnrollAllowPartial) {
+        // Reduce unroll count to be modulo of TripCount for partial unrolling
+        Count = UnrollThreshold / LoopSize;        
+        while (Count != 0 && TripCount%Count != 0) {
+          Count--;
+        }        
+        if (Count < 2) {
+          DOUT << "  could not unroll partially\n";
+          return false;
+        } else {
+          DOUT << "  partially unrolling with count: " << Count << "\n";
+        }
+      } else {
+        DOUT << "  will not try to unroll partially because "
+             << "-unroll-allow-partial not given\n";
+        return false;
+      }
     }
   }
 

Added: llvm/trunk/test/Transforms/LoopUnroll/partial.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/partial.ll?rev=54160&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/LoopUnroll/partial.ll (added)
+++ llvm/trunk/test/Transforms/LoopUnroll/partial.ll Tue Jul 29 08:21:23 2008
@@ -0,0 +1,15 @@
+; RUN: llvm-as < %s | opt -debug -loop-unroll |& grep {will not try to unroll partially because}
+; RUN: llvm-as < %s | opt -debug -loop-unroll -unroll-allow-partial |& grep {partially unrolling with count}
+; RUN: llvm-as < %s | opt -debug -loop-unroll -unroll-allow-partial -unroll-threshold=3 |& grep {could not unroll partially}
+
+define i32 @main() {
+entry:
+	br label %no_exit
+no_exit:		; preds = %no_exit, %entry
+	%indvar = phi i32 [ 0, %entry ], [ %indvar.next, %no_exit ]		; <i32> [#uses=1]
+	%indvar.next = add i32 %indvar, 1		; <i32> [#uses=2]
+	%exitcond = icmp ne i32 %indvar.next, 100	; <i1> [#uses=1]
+	br i1 %exitcond, label %no_exit, label %loopexit
+loopexit:		; preds = %no_exit
+	ret i32 0
+}





More information about the llvm-commits mailing list