diff options
author | Nirav Dave <niravd@google.com> | 2017-06-09 12:57:35 +0000 |
---|---|---|
committer | Nirav Dave <niravd@google.com> | 2017-06-09 12:57:35 +0000 |
commit | 43a4d8122f4210fb0603ccc08346bcb95cacf938 (patch) | |
tree | af4756a779e33ad8e117337a02254ef24b5e374f /llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | 1840901a2ff8493ca60579298be97eda8fadbcec (diff) | |
download | bcm5719-llvm-43a4d8122f4210fb0603ccc08346bcb95cacf938.tar.gz bcm5719-llvm-43a4d8122f4210fb0603ccc08346bcb95cacf938.zip |
Prevent RemoveDeadNodes from deleted already deleted node.
This prevents against assertion errors like PR32659 which occur from a
replacement deleting a node after it's been added to the list argument
of RemoveDeadNodes. The specific failure from PR32659 does not
currently happen, but it is still potentially possible. The underlying
cause is that the callers of the change dfunction builds up a list of
nodes to delete after having moved their uses and it possible that a
move of a later node will cause a previously deleted nodes to be
deleted.
Reviewers: bkramer, spatel, davide
Reviewed By: spatel
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D33731
llvm-svn: 305070
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index caae3c98454..dff8bd2ad37 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -589,6 +589,11 @@ void SelectionDAG::RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes) { // worklist. while (!DeadNodes.empty()) { SDNode *N = DeadNodes.pop_back_val(); + // Skip to next node if we've already managed to delete the node. This could + // happen if replacing a node causes a node previously added to the node to + // be deleted. + if (N->getOpcode() == ISD::DELETED_NODE) + continue; for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next) DUL->NodeDeleted(N, nullptr); |