[llvm-commits] [llvm] r40809 - /llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp

Chris Lattner sabre at nondot.org
Fri Aug 3 19:15:25 PDT 2007


Author: lattner
Date: Fri Aug  3 21:15:24 2007
New Revision: 40809

URL: http://llvm.org/viewvc/llvm-project?rev=40809&view=rev
Log:
In mem2reg, when handling the single-store case, make sure to remove
a using block from the list if we handle it.  Not doing this caused us
to not be able to promote (with the fast path) allocas which have uses (whoops).

This increases the # allocas hitting this fastpath from 4042 to 8935 on the
testcase in PR1432, speeding up mem2reg by 2.6x


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

Modified: llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp?rev=40809&r1=40808&r2=40809&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Fri Aug  3 21:15:24 2007
@@ -531,28 +531,29 @@
 /// the value stored.
 void PromoteMem2Reg::RewriteSingleStoreAlloca(AllocaInst *AI,
                                               AllocaInfo &Info) {
+  StoreInst *OnlyStore = Info.OnlyStore;
+  
   // Be aware of loads before the store.
   std::set<BasicBlock*> ProcessedBlocks;
   for (unsigned i = 0, e = Info.UsingBlocks.size(); i != e; ++i) {
     // If the store dominates the block and if we haven't processed it yet,
     // do so now.
-    if (!dominates(Info.OnlyStore->getParent(), Info.UsingBlocks[i]))
-      continue;
-    
-    if (!ProcessedBlocks.insert(Info.UsingBlocks[i]).second)
+    if (!dominates(OnlyStore->getParent(), Info.UsingBlocks[i]))
       continue;
     
     BasicBlock *UseBlock = Info.UsingBlocks[i];
+    if (!ProcessedBlocks.insert(UseBlock).second)
+      continue;
     
     // If the use and store are in the same block, do a quick scan to
     // verify that there are no uses before the store.
-    if (UseBlock == Info.OnlyStore->getParent()) {
+    if (UseBlock == OnlyStore->getParent()) {
       BasicBlock::iterator I = UseBlock->begin();
-      for (; &*I != Info.OnlyStore; ++I) { // scan block for store.
+      for (; &*I != OnlyStore; ++I) { // scan block for store.
         if (isa<LoadInst>(I) && I->getOperand(0) == AI)
           break;
       }
-      if (&*I != Info.OnlyStore) break;  // Do not handle this case.
+      if (&*I != OnlyStore) break;  // Do not handle this case.
     }
     
     // Otherwise, if this is a different block or if all uses happen
@@ -562,7 +563,7 @@
          I != E; ) {
       if (LoadInst *LI = dyn_cast<LoadInst>(I++)) {
         if (LI->getOperand(0) == AI) {
-          LI->replaceAllUsesWith(Info.OnlyStore->getOperand(0));
+          LI->replaceAllUsesWith(OnlyStore->getOperand(0));
           if (AST && isa<PointerType>(LI->getType()))
             AST->deleteValue(LI);
           LI->eraseFromParent();
@@ -572,6 +573,7 @@
     
     // Finally, remove this block from the UsingBlock set.
     Info.UsingBlocks[i] = Info.UsingBlocks.back();
+    Info.UsingBlocks.pop_back();
     --i; --e;
   }
 }





More information about the llvm-commits mailing list