[llvm-commits] [llvm] r39789 - /llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp

Owen Anderson resistor at mac.com
Thu Jul 12 11:08:51 PDT 2007


Author: resistor
Date: Thu Jul 12 13:08:51 2007
New Revision: 39789

URL: http://llvm.org/viewvc/llvm-project?rev=39789&view=rev
Log:
Make the condition-checking for free with non-trivial dependencies more correct.

Modified:
    llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp?rev=39789&r1=39788&r2=39789&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp Thu Jul 12 13:08:51 2007
@@ -46,9 +46,8 @@
     }
 
     bool runOnBasicBlock(BasicBlock &BB);
-    bool handleFreeWithNonTrivialDependency(FreeInst* F, StoreInst* dependency,
+    bool handleFreeWithNonTrivialDependency(FreeInst* F, Instruction* dependency,
                                             SetVector<Instruction*>& possiblyDead);
-    bool handleEndBlock(BasicBlock& BB, SetVector<Instruction*>& possiblyDead);
     void DeleteDeadInstructionChains(Instruction *I,
                                      SetVector<Instruction*> &DeadInsts);
 
@@ -91,6 +90,7 @@
       assert(pointer && "Not a free or a store?");
       
       StoreInst*& last = lastStore[pointer];
+      bool deletedStore = false;
       
       // ... to a pointer that has been stored to before...
       if (last) {
@@ -107,13 +107,17 @@
           
           last->eraseFromParent();
           NumFastStores++;
+          deletedStore = true;
           MadeChange = true;
-        
-        // If this is a free, check for a non-trivial dependency
-        } else if (FreeInst* F = dyn_cast<FreeInst>(BBI))
-          MadeChange |= handleFreeWithNonTrivialDependency(F, last, possiblyDead);
+        }
       }
       
+      // Handle frees whose dependencies are non-trivial
+      if (FreeInst* F = dyn_cast<FreeInst>(BBI))
+        if (!deletedStore)
+          MadeChange |= handleFreeWithNonTrivialDependency(F, MD.getDependency(F),
+                                                           possiblyDead);
+      
       // Update our most-recent-store map
       if (StoreInst* S = dyn_cast<StoreInst>(BBI))
         last = S;
@@ -134,12 +138,20 @@
 
 /// handleFreeWithNonTrivialDependency - Handle frees of entire structures whose
 /// dependency is a store to a field of that structure
-bool FDSE::handleFreeWithNonTrivialDependency(FreeInst* F, StoreInst* dependency,
+bool FDSE::handleFreeWithNonTrivialDependency(FreeInst* F, Instruction* dep,
                                               SetVector<Instruction*>& possiblyDead) {
   TargetData &TD = getAnalysis<TargetData>();
   AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
   MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
   
+  if (dep == MemoryDependenceAnalysis::None ||
+      dep == MemoryDependenceAnalysis::NonLocal)
+    return false;
+  
+  StoreInst* dependency = dyn_cast<StoreInst>(dep);
+  if (!dependency)
+    return false;
+  
   Value* depPointer = dependency->getPointerOperand();
   unsigned depPointerSize = TD.getTypeSize(dependency->getOperand(0)->getType());
     





More information about the llvm-commits mailing list