[llvm] r353416 - [DAG] Cleanup unused nodes on failed store-to-load forward combine.
Mikael Holmén via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 8 05:21:43 PST 2019
Hi Nirav,
On 2/7/19 4:38 PM, Nirav Dave via llvm-commits wrote:
> Author: niravd
> Date: Thu Feb 7 07:38:14 2019
> New Revision: 353416
>
> URL: http://llvm.org/viewvc/llvm-project?rev=353416&view=rev
> Log:
> [DAG] Cleanup unused nodes on failed store-to-load forward combine.
>
> Modified:
> llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=353416&r1=353415&r2=353416&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Thu Feb 7 07:38:14 2019
> @@ -13123,30 +13123,42 @@ SDValue DAGCombiner::ForwardStoreValueTo
> if (LD->getBasePtr().isUndef() || Offset != 0)
> return SDValue();
> // Model necessary truncations / extenstions.
> - SDValue Val;
> + SmallVector<SDNode *, 4> Vals; // Temporaries which may need to be deleted.
> + SDValue Val, RV;
> // 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())
> + STMemType.isInteger() && LDMemType.isInteger()) {
> + Vals.push_back(Val.getNode());
All other places where we add Val.getNode() to Vals we guard that with
if (Vals.empty() || Vals.back() != Val.getNode())
any reason we shouldn't guard the push_back above too?
I've triggered a case in our downstream clone where the same node is
added twice to Vals (which causes a failed assertion due to us trying to
remove the same node twice). Unfortunately my test case doesn't trigger
the crash on trunk due to some local patches we have.
Alternatively, should Vals be a set rather than a vector?
Regards,
Mikael
> Val = DAG.getNode(ISD::TRUNCATE, SDLoc(LD), LDMemType, Val);
> - else
> + } else
> continue;
> }
> - if (!extendLoadedValueToExtension(LD, Val))
> - continue;
> - return ReplaceLd(LD, Val, Chain);
> + 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());
> } while (false);
>
> // On failure, cleanup dead nodes we may have created.
> - if (Val->use_empty())
> - deleteAndRecombine(Val.getNode());
> - return SDValue();
> + 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;
> }
>
> SDValue DAGCombiner::visitLOAD(SDNode *N) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list