summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNirav Dave <niravd@google.com>2019-02-08 15:21:13 +0000
committerNirav Dave <niravd@google.com>2019-02-08 15:21:13 +0000
commit97011ccce085acd084e91a15df22c7a96bd3a7cc (patch)
tree30371282cfadbf24efc0fb82c3cab5de9592b7c4
parentb0a227049fda9d0d229ea801ae77bf1b812f7328 (diff)
downloadbcm5719-llvm-97011ccce085acd084e91a15df22c7a96bd3a7cc.tar.gz
bcm5719-llvm-97011ccce085acd084e91a15df22c7a96bd3a7cc.zip
Revert r353416 "[DAG] Cleanup unused nodes on failed store-to-load forward combine."
This cleanup causes out-of-tree crashes. llvm-svn: 353527
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp30
1 files changed, 9 insertions, 21 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index a9904a25783..5a933dd8be2 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -13154,42 +13154,30 @@ SDValue DAGCombiner::ForwardStoreValueToDirectLoad(LoadSDNode *LD) {
if (LD->getBasePtr().isUndef() || Offset != 0)
return SDValue();
// Model necessary truncations / extenstions.
- SmallVector<SDNode *, 4> Vals; // Temporaries which may need to be deleted.
- SDValue Val, RV;
+ SDValue Val;
// Truncate Value To Stored Memory Size.
do {
if (!getTruncatedStoreValue(ST, Val))
continue;
- if (Vals.empty() || Vals.back() != Val.getNode())
- Vals.push_back(Val.getNode());
if (!isTypeLegal(LDMemType))
continue;
if (STMemType != LDMemType) {
// TODO: Support vectors? This requires extract_subvector/bitcast.
if (!STMemType.isVector() && !LDMemType.isVector() &&
- STMemType.isInteger() && LDMemType.isInteger()) {
- Vals.push_back(Val.getNode());
+ STMemType.isInteger() && LDMemType.isInteger())
Val = DAG.getNode(ISD::TRUNCATE, SDLoc(LD), LDMemType, Val);
- } else
+ else
continue;
}
- if (Vals.empty() || Vals.back() != Val.getNode())
- Vals.push_back(Val.getNode());
- if (extendLoadedValueToExtension(LD, Val))
- RV = ReplaceLd(LD, Val, Chain);
- else if (Vals.empty() || Vals.back() != Val.getNode())
- Vals.push_back(Val.getNode());
+ if (!extendLoadedValueToExtension(LD, Val))
+ continue;
+ return ReplaceLd(LD, Val, Chain);
} while (false);
// On failure, cleanup dead nodes we may have created.
- if (Vals.empty() || Vals.back() != Val.getNode())
- Vals.push_back(Val.getNode());
- while (!Vals.empty()) {
- SDNode *Val = Vals.pop_back_val();
- if (Val->use_empty())
- recursivelyDeleteUnusedNodes(Val);
- }
- return RV;
+ if (Val->use_empty())
+ deleteAndRecombine(Val.getNode());
+ return SDValue();
}
SDValue DAGCombiner::visitLOAD(SDNode *N) {
OpenPOWER on IntegriCloud