Don't DSe volatile stores.
authorOwen Anderson <resistor@mac.com>
Sun, 26 Aug 2007 21:14:47 +0000 (21:14 +0000)
committerOwen Anderson <resistor@mac.com>
Sun, 26 Aug 2007 21:14:47 +0000 (21:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41456 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/DeadStoreElimination.cpp

index 283fcbc97a1a2d6400edffe1e4a3338ecdfd0720..1e5381db9af2d4b86f3c0516331d0d697b39a43e 100644 (file)
@@ -111,9 +111,12 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
       continue;
       
     Value* pointer = 0;
-    if (StoreInst* S = dyn_cast<StoreInst>(BBI))
-      pointer = S->getPointerOperand();
-    else
+    if (StoreInst* S = dyn_cast<StoreInst>(BBI)) {
+      if (!S->isVolatile())
+        pointer = S->getPointerOperand();
+      else
+        continue;
+    } else
       pointer = cast<FreeInst>(BBI)->getPointerOperand();
       
     StoreInst*& last = lastStore[pointer];
@@ -194,6 +197,8 @@ bool DSE::handleFreeWithNonTrivialDependency(FreeInst* F, Instruction* dep,
   StoreInst* dependency = dyn_cast<StoreInst>(dep);
   if (!dependency)
     return false;
+  else if (dependency->isVolatile())
+    return false;
   
   Value* depPointer = dependency->getPointerOperand();
   const Type* depType = dependency->getOperand(0)->getType();
@@ -253,24 +258,26 @@ bool DSE::handleEndBlock(BasicBlock& BB,
     
     // If we find a store whose pointer is dead...
     if (StoreInst* S = dyn_cast<StoreInst>(BBI)) {
-      Value* pointerOperand = S->getPointerOperand();
-      // See through pointer-to-pointer bitcasts
-      TranslatePointerBitCasts(pointerOperand);
+      if (!S->isVolatile()) {
+        Value* pointerOperand = S->getPointerOperand();
+        // See through pointer-to-pointer bitcasts
+        TranslatePointerBitCasts(pointerOperand);
       
-      if (deadPointers.count(pointerOperand)){
-        // Remove it!
-        MD.removeInstruction(S);
+        if (deadPointers.count(pointerOperand)){
+          // Remove it!
+          MD.removeInstruction(S);
         
-        // DCE instructions only used to calculate that store
-        if (Instruction* D = dyn_cast<Instruction>(S->getOperand(0)))
-          possiblyDead.insert(D);
-        if (Instruction* D = dyn_cast<Instruction>(S->getOperand(1)))
-          possiblyDead.insert(D);
+          // DCE instructions only used to calculate that store
+          if (Instruction* D = dyn_cast<Instruction>(S->getOperand(0)))
+            possiblyDead.insert(D);
+          if (Instruction* D = dyn_cast<Instruction>(S->getOperand(1)))
+            possiblyDead.insert(D);
         
-        BBI++;
-        S->eraseFromParent();
-        NumFastStores++;
-        MadeChange = true;
+          BBI++;
+          S->eraseFromParent();
+          NumFastStores++;
+          MadeChange = true;
+        }
       }
       
       continue;