[Unroll] Refactor the accumulation of optimized instruction costs into
authorChandler Carruth <chandlerc@gmail.com>
Fri, 22 May 2015 02:47:29 +0000 (02:47 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 22 May 2015 02:47:29 +0000 (02:47 +0000)
a single location.

This reduces code duplication a bit and will also pave the way for
a better separation between the visitation algorithm and the unroll
analysis.

No functionality changed.

llvm-svn: 237990

llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp

index 03e1f4c..9f142a6 100644 (file)
@@ -402,14 +402,10 @@ class UnrollAnalyzer : public InstVisitor<UnrollAnalyzer, bool> {
     else
       SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS, DL);
 
-    if (SimpleV)
-      NumberOfOptimizedInstructions += TTI.getUserCost(&I);
-
-    if (Constant *C = dyn_cast_or_null<Constant>(SimpleV)) {
+    if (Constant *C = dyn_cast_or_null<Constant>(SimpleV))
       SimplifiedValues[&I] = C;
-      return true;
-    }
-    return false;
+
+    return SimpleV;
   }
 
   /// Try to fold load I.
@@ -452,7 +448,6 @@ class UnrollAnalyzer : public InstVisitor<UnrollAnalyzer, bool> {
     assert(CV && "Constant expected.");
     SimplifiedValues[&I] = CV;
 
-    NumberOfOptimizedInstructions += TTI.getUserCost(&I);
     return true;
   }
 
@@ -571,7 +566,13 @@ public:
         // opportunities.
         for (Instruction &I : *BB) {
           UnrolledLoopSize += TTI.getUserCost(&I);
-          Base::visit(I);
+
+          // Visit the instruction to analyze its loop cost after unrolling,
+          // and if the visitor returns true, then we can optimize this
+          // instruction away.
+          if (Base::visit(I))
+            NumberOfOptimizedInstructions += TTI.getUserCost(&I);
+
           // If unrolled body turns out to be too big, bail out.
           if (UnrolledLoopSize - NumberOfOptimizedInstructions >
               MaxUnrolledLoopSize)