Add a runtime unrolling parameter to the LoopUnroll pass constructor
authorHal Finkel <hfinkel@anl.gov>
Tue, 5 Nov 2013 00:08:03 +0000 (00:08 +0000)
committerHal Finkel <hfinkel@anl.gov>
Tue, 5 Nov 2013 00:08:03 +0000 (00:08 +0000)
As with the other loop unrolling parameters (the unrolling threshold, partial
unrolling, etc.) runtime unrolling can now also be controlled via the
constructor. This will be necessary for moving non-trivial unrolling late in
the pass manager (after loop vectorization).

No functionality change intended.

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

include/llvm/Transforms/Scalar.h
lib/Transforms/Scalar/LoopUnrollPass.cpp

index 51aeba4a361743b334f7d0bbf92435fbb0553063..65b83441aae7e8cedfd9571113c79f4754389396 100644 (file)
@@ -138,7 +138,8 @@ Pass *createLoopInstSimplifyPass();
 //
 // LoopUnroll - This pass is a simple loop unrolling pass.
 //
-Pass *createLoopUnrollPass(int Threshold = -1, int Count = -1, int AllowPartial = -1);
+Pass *createLoopUnrollPass(int Threshold = -1, int Count = -1,
+                           int AllowPartial = -1, int Runtime = -1);
 
 //===----------------------------------------------------------------------===//
 //
index d47a3c3b526e9614bc410f9cc0b91bc71b74b792..08ac38dec5dd8adc2f032aad68ced9c79ffef454 100644 (file)
@@ -49,14 +49,16 @@ namespace {
   class LoopUnroll : public LoopPass {
   public:
     static char ID; // Pass ID, replacement for typeid
-    LoopUnroll(int T = -1, int C = -1,  int P = -1) : LoopPass(ID) {
+    LoopUnroll(int T = -1, int C = -1, int P = -1, int R = -1) : LoopPass(ID) {
       CurrentThreshold = (T == -1) ? UnrollThreshold : unsigned(T);
       CurrentCount = (C == -1) ? UnrollCount : unsigned(C);
       CurrentAllowPartial = (P == -1) ? UnrollAllowPartial : (bool)P;
+      CurrentRuntime = (R == -1) ? UnrollRuntime : (bool)R;
 
       UserThreshold = (T != -1) || (UnrollThreshold.getNumOccurrences() > 0);
       UserAllowPartial = (P != -1) ||
                          (UnrollAllowPartial.getNumOccurrences() > 0);
+      UserRuntime = (R != -1) || (UnrollRuntime.getNumOccurrences() > 0);
       UserCount = (C != -1) || (UnrollCount.getNumOccurrences() > 0);
 
       initializeLoopUnrollPass(*PassRegistry::getPassRegistry());
@@ -78,9 +80,11 @@ namespace {
     unsigned CurrentCount;
     unsigned CurrentThreshold;
     bool     CurrentAllowPartial;
+    bool     CurrentRuntime;
     bool     UserCount;            // CurrentCount is user-specified.
     bool     UserThreshold;        // CurrentThreshold is user-specified.
     bool     UserAllowPartial;     // CurrentAllowPartial is user-specified.
+    bool     UserRuntime;          // CurrentRuntime is user-specified.
 
     bool runOnLoop(Loop *L, LPPassManager &LPM);
 
@@ -115,8 +119,9 @@ INITIALIZE_PASS_DEPENDENCY(LCSSA)
 INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
 INITIALIZE_PASS_END(LoopUnroll, "loop-unroll", "Unroll loops", false, false)
 
-Pass *llvm::createLoopUnrollPass(int Threshold, int Count, int AllowPartial) {
-  return new LoopUnroll(Threshold, Count, AllowPartial);
+Pass *llvm::createLoopUnrollPass(int Threshold, int Count, int AllowPartial,
+                                 int Runtime) {
+  return new LoopUnroll(Threshold, Count, AllowPartial, Runtime);
 }
 
 /// ApproximateLoopSize - Approximate the size of the loop.
@@ -155,7 +160,7 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
   UP.OptSizeThreshold = OptSizeUnrollThreshold;
   UP.Count = CurrentCount;
   UP.Partial = CurrentAllowPartial;
-  UP.Runtime = UnrollRuntime;
+  UP.Runtime = CurrentRuntime;
   TTI.getUnrollingPreferences(L, UP);
 
   // Determine the current unrolling threshold.  While this is normally set
@@ -181,8 +186,7 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
     TripMultiple = SE->getSmallConstantTripMultiple(L, LatchBlock);
   }
 
-  bool Runtime = UnrollRuntime.getNumOccurrences() == 0 ?
-                 UP.Runtime : UnrollRuntime;
+  bool Runtime = UserRuntime ? CurrentRuntime : UP.Runtime;
 
   // Use a default unroll-count if the user doesn't specify a value
   // and the trip count is a run-time value.  The default is different