Redundant store instructions should be removed as dead code
[oota-llvm.git] / lib / CodeGen / SelectionDAG / DAGCombiner.cpp
index 33e70593d154d06996b59a32665bc458e3aaa625..fdac0e27acedca96719a7ed4de9ae7d327449547 100644 (file)
@@ -9799,6 +9799,20 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
       return Chain;
     }
   }
+  // If this is a store followed by a store with the same value to the same
+  // location, then the store is dead/noop.
+  if (StoreSDNode *ST1 = dyn_cast<StoreSDNode>(Chain)) {
+    if (ST1->getBasePtr() == Ptr && ST->getMemoryVT() == ST1->getMemoryVT() &&
+        ST1->getValue() == Value && ST->isUnindexed() && !ST->isVolatile() &&
+        ST1->isUnindexed() &&
+        !ST1->isVolatile() &&
+        // There can't be any side effects between the two stores, such as
+        // a call or store.
+        Chain.reachesChainWithoutSideEffects(SDValue(ST1, 0))) {
+      // The store is dead, remove it.
+      return Chain;
+    }
+  }
 
   // If this is an FP_ROUND or TRUNC followed by a store, fold this into a
   // truncating store.  We can do this even if this is already a truncstore.