diff options
author | Nirav Dave <niravd@google.com> | 2019-02-08 15:21:13 +0000 |
---|---|---|
committer | Nirav Dave <niravd@google.com> | 2019-02-08 15:21:13 +0000 |
commit | 97011ccce085acd084e91a15df22c7a96bd3a7cc (patch) | |
tree | 30371282cfadbf24efc0fb82c3cab5de9592b7c4 | |
parent | b0a227049fda9d0d229ea801ae77bf1b812f7328 (diff) | |
download | bcm5719-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.cpp | 30 |
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) { |