[llvm-commits] [llvm] r167136 - /llvm/trunk/lib/Transforms/Utils/LCSSA.cpp

Benjamin Kramer benny.kra at googlemail.com
Wed Oct 31 09:30:03 PDT 2012


Author: d0k
Date: Wed Oct 31 11:30:03 2012
New Revision: 167136

URL: http://llvm.org/viewvc/llvm-project?rev=167136&view=rev
Log:
LCSSA: Try to recover compile time regressions due to SCEV updates.

- Use value handle tricks to communicate use replacements instead of forgetLoop, this is a lot faster.
- Move the "big hammer" out of the main loop so it's not called for every instruction.

This should recover most (if not all) compile time regressions introduced by this code.

Modified:
    llvm/trunk/lib/Transforms/Utils/LCSSA.cpp

Modified: llvm/trunk/lib/Transforms/Utils/LCSSA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LCSSA.cpp?rev=167136&r1=167135&r2=167136&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LCSSA.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LCSSA.cpp Wed Oct 31 11:30:03 2012
@@ -160,6 +160,12 @@
       MadeChange |= ProcessInstruction(I, ExitBlocks);
     }
   }
+
+  // If we modified the code, remove any caches about the loop from SCEV to
+  // avoid dangling entries.
+  // FIXME: This is a big hammer, can we clear the cache more selectively?
+  if (SE && MadeChange)
+    SE->forgetLoop(L);
   
   assert(L->isLCSSAForm(*DT));
   PredCache.clear();
@@ -248,19 +254,8 @@
     
     // Remember that this phi makes the value alive in this block.
     SSAUpdate.AddAvailableValue(ExitBB, PN);
-
-    // If the exiting block is part of a loop inserting a PHI may change its
-    // SCEV analysis. Conservatively drop any caches from it.
-    if (SE)
-      if (Loop *L = LI->getLoopFor(ExitBB))
-        SE->forgetLoop(L);
   }
 
-  // If we added a PHI, drop the cache to avoid invalidating SCEV caches.
-  // FIXME: This is a big hammer, can we clear the cache more selectively?
-  if (SE && !AddedPHIs.empty())
-    SE->forgetLoop(L);
-  
   // Rewrite all uses outside the loop in terms of the new PHIs we just
   // inserted.
   for (unsigned i = 0, e = UsesToRewrite.size(); i != e; ++i) {
@@ -273,12 +268,11 @@
     if (PHINode *PN = dyn_cast<PHINode>(User))
       UserBB = PN->getIncomingBlock(*UsesToRewrite[i]);
 
-    // Tell SCEV to reanalyze the value that's about to change.
-    if (SE)
-      SE->forgetValue(*UsesToRewrite[i]);
-
     if (isa<PHINode>(UserBB->begin()) &&
         isExitBlock(UserBB, ExitBlocks)) {
+      // Tell the VHs that the uses changed. This updates SCEV's caches.
+      if (UsesToRewrite[i]->get()->hasValueHandle())
+        ValueHandleBase::ValueIsRAUWd(*UsesToRewrite[i], UserBB->begin());
       UsesToRewrite[i]->set(UserBB->begin());
       continue;
     }





More information about the llvm-commits mailing list