From 97011ccce085acd084e91a15df22c7a96bd3a7cc Mon Sep 17 00:00:00 2001 From: Nirav Dave Date: Fri, 8 Feb 2019 15:21:13 +0000 Subject: [PATCH] Revert r353416 "[DAG] Cleanup unused nodes on failed store-to-load forward combine." This cleanup causes out-of-tree crashes. llvm-svn: 353527 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index a9904a257830..5a933dd8be24 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 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) {