Handle eliminating stores that occur right before a free.
authorOwen Anderson <resistor@mac.com>
Wed, 11 Jul 2007 20:38:34 +0000 (20:38 +0000)
committerOwen Anderson <resistor@mac.com>
Wed, 11 Jul 2007 20:38:34 +0000 (20:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@39753 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/FastDSE.cpp

index e344f55e823ee81647ce2f746d8ae715b8c571ad..82862f7b489734b2253053d9dae83faef366be45 100644 (file)
@@ -74,14 +74,22 @@ bool FDSE::runOnBasicBlock(BasicBlock &BB) {
   // Do a top-down walk on the BB
   for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ++BBI) {
     // If we find a store...
-    if (StoreInst* S = dyn_cast<StoreInst>(BBI)) {
-      StoreInst*& last = lastStore[S->getPointerOperand()];
+    if (isa<StoreInst>(BBI) || isa<FreeInst>(BBI)) {
+      Value* pointer = 0;
+      if (StoreInst* S = dyn_cast<StoreInst>(BBI))
+        pointer = S->getPointerOperand();
+      else if (FreeInst* F = dyn_cast<FreeInst>(BBI))
+        pointer = F->getPointerOperand();
+      assert(pointer && "Not a free or a store?");
+      
+      StoreInst*& last = lastStore[pointer];
       
       // ... to a pointer that has been stored to before...
       if (last) {
         
         // ... and no other memory dependencies are between them....
-        if (MD.getDependency(S) == last) {
+        if (MD.getDependency(BBI) == last) {
+          
           // Remove it!
           MD.removeInstruction(last);
           
@@ -96,7 +104,10 @@ bool FDSE::runOnBasicBlock(BasicBlock &BB) {
       }
       
       // Update our most-recent-store map
-      last =  S;
+      if (StoreInst* S = dyn_cast<StoreInst>(BBI))
+        last = S;
+      else
+        last = 0;
     }
   }