LoopVectorizer: Don't count the induction variable multiple times
authorArnold Schwaighofer <aschwaighofer@apple.com>
Wed, 29 Jan 2014 04:36:12 +0000 (04:36 +0000)
committerArnold Schwaighofer <aschwaighofer@apple.com>
Wed, 29 Jan 2014 04:36:12 +0000 (04:36 +0000)
When estimating register pressure, don't count the induction variable mulitple
times. It is unlikely to be unrolled. This is currently disabled and hidden
behind a flag ("enable-ind-var-reg-heur").

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

lib/Transforms/Vectorize/LoopVectorize.cpp

index c72c2dc41fc07d3e3be02fab4dbe9f61921cbf9b..1ffb4289cbd5400c75d6d0eb53a0eba81184fa68 100644 (file)
@@ -188,6 +188,10 @@ static cl::opt<unsigned> NumberOfStoresToPredicate(
     "vectorize-num-stores-pred", cl::init(0), cl::Hidden,
     cl::desc("Max number of stores to be predicated behind an if."));
 
+static cl::opt<bool> EnableIndVarRegisterHeur(
+    "enable-ind-var-reg-heur", cl::init(false), cl::Hidden,
+    cl::desc("Count the induction variable only once when unrolling"));
+
 static cl::opt<bool> EnableCondStoresVectorization(
     "enable-cond-stores-vec", cl::init(false), cl::Hidden,
     cl::desc("Enable if predication of stores during vectorization."));
@@ -5155,6 +5159,11 @@ LoopVectorizationCostModel::selectUnrollFactor(bool OptForSize,
   unsigned UF = PowerOf2Floor((TargetNumRegisters - R.LoopInvariantRegs) /
                               R.MaxLocalUsers);
 
+  // Don't count the induction variable as unrolled.
+  if (EnableIndVarRegisterHeur)
+    UF = PowerOf2Floor((TargetNumRegisters - R.LoopInvariantRegs - 1) /
+                       std::max(1U, (R.MaxLocalUsers - 1)));
+
   // Clamp the unroll factor ranges to reasonable factors.
   unsigned MaxUnrollSize = TTI.getMaximumUnrollFactor();