From: Nirav Dave Date: Fri, 8 Feb 2019 15:21:13 +0000 (+0000) Subject: Revert r353416 "[DAG] Cleanup unused nodes on failed store-to-load forward combine." X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9274280d4a82bb82f0b9b7bd4c2f97e4181242e8;p=llvm Revert r353416 "[DAG] Cleanup unused nodes on failed store-to-load forward combine." This cleanup causes out-of-tree crashes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353527 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index a9904a25783..5a933dd8be2 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/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) {