fix some issues Frits noticed, add AliasAnalysis as a dependency
authorChris Lattner <sabre@nondot.org>
Mon, 27 Dec 2010 18:39:08 +0000 (18:39 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 27 Dec 2010 18:39:08 +0000 (18:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122585 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopIdiomRecognize.cpp

index f8748efeceaa2114188771659411355aee5106f8..476cb284bae3275e004d33f538093ca8859bf054 100644 (file)
@@ -15,6 +15,7 @@
 
 #define DEBUG_TYPE "loop-idiom"
 #include "llvm/Transforms/Scalar.h"
+#include "llvm/Analysis/AliasAnalysis.h"
 #include "llvm/Analysis/LoopPass.h"
 #include "llvm/Analysis/ScalarEvolutionExpressions.h"
 #include "llvm/Analysis/ScalarEvolutionExpander.h"
@@ -59,6 +60,8 @@ namespace {
       AU.addPreservedID(LoopSimplifyID);
       AU.addRequiredID(LCSSAID);
       AU.addPreservedID(LCSSAID);
+      AU.addRequired<AliasAnalysis>();
+      AU.addPreserved<AliasAnalysis>();
       AU.addRequired<ScalarEvolution>();
       AU.addPreserved<ScalarEvolution>();
       AU.addPreserved<DominatorTree>();
@@ -73,6 +76,7 @@ INITIALIZE_PASS_DEPENDENCY(LoopInfo)
 INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
 INITIALIZE_PASS_DEPENDENCY(LCSSA)
 INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
+INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
 INITIALIZE_PASS_END(LoopIdiomRecognize, "loop-idiom", "Recognize loop idioms",
                     false, false)
 
@@ -141,13 +145,15 @@ bool LoopIdiomRecognize::runOnLoop(Loop *L, LPPassManager &LPM) {
     StoreInst *SI = dyn_cast<StoreInst>(I++);
     if (SI == 0 || SI->isVolatile()) continue;
     
-    WeakVH InstPtr;
-    if (processLoopStore(SI, BECount)) {
-      // If processing the store invalidated our iterator, start over from the
-      // head of the loop.
-      if (InstPtr == 0)
-        I = BB->begin();
-    }
+    WeakVH InstPtr(SI);
+    if (!processLoopStore(SI, BECount)) continue;
+    
+    MadeChange = true;
+    
+    // If processing the store invalidated our iterator, start over from the
+    // head of the loop.
+    if (InstPtr == 0)
+      I = BB->begin();
   }
   
   return MadeChange;
@@ -204,6 +210,10 @@ processLoopStoreOfSplatValue(StoreInst *SI, unsigned StoreSize,
   // would be unsafe to do if there is anything else in the loop that may read
   // or write to the aliased location.  Check for an alias.
   
+  // FIXME: Need to get a base pointer that is valid.
+  //  if (LoopCanModRefLocation(SI->getPointerOperand())
+  
+  
   // FIXME: TODO safety check.
   
   // Okay, everything looks good, insert the memset.