summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG
diff options
context:
space:
mode:
authorDavid Xu <David.Xu@arm.com>2014-09-26 02:02:09 +0000
committerDavid Xu <David.Xu@arm.com>2014-09-26 02:02:09 +0000
commit64f661ee0bfc5cc581cb80fb2750ff359b48c43c (patch)
tree3644c767b03e5c468d761c89178761ce8532aa8d /llvm/lib/CodeGen/SelectionDAG
parenta9353d17988f83b09ecaed076772c1a8281c3e12 (diff)
downloadbcm5719-llvm-64f661ee0bfc5cc581cb80fb2750ff359b48c43c.tar.gz
bcm5719-llvm-64f661ee0bfc5cc581cb80fb2750ff359b48c43c.zip
Redundant store instructions should be removed as dead code
llvm-svn: 218493
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 33e70593d15..fdac0e27ace 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -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.
OpenPOWER on IntegriCloud