summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorJustin Bogner <mail@justinbogner.com>2016-06-03 18:50:11 +0000
committerJustin Bogner <mail@justinbogner.com>2016-06-03 18:50:11 +0000
commit6f6d012e32e8336c6d8668000c2855c08ac8bd8e (patch)
tree1088329813612192dff0d417f5f55ed1f1ecdad5 /llvm/lib
parent4b8c7aeb62793fbdee043d134abb342e529aeba0 (diff)
downloadbcm5719-llvm-6f6d012e32e8336c6d8668000c2855c08ac8bd8e.tar.gz
bcm5719-llvm-6f6d012e32e8336c6d8668000c2855c08ac8bd8e.zip
SDAG: Update ChainNodesMatched as nodes are deleted
Avoid relying on UB by looking into deleted nodes for a marker value. Instead, update the list of chain nodes as we go. llvm-svn: 271706
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 359919e14b2..20d500cf20e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -2163,10 +2163,8 @@ void SelectionDAGISel::UpdateChains(
// Replace all the chain results with the final chain we ended up with.
for (unsigned i = 0, e = ChainNodesMatched.size(); i != e; ++i) {
SDNode *ChainNode = ChainNodesMatched[i];
-
- // If this node was already deleted, don't look at it.
- if (ChainNode->getOpcode() == ISD::DELETED_NODE)
- continue;
+ assert(ChainNode->getOpcode() != ISD::DELETED_NODE &&
+ "Deleted node left in chain");
// Don't replace the results of the root node if we're doing a
// MorphNodeTo.
@@ -3368,6 +3366,13 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
} else {
assert(NodeToMatch->getOpcode() != ISD::DELETED_NODE &&
"NodeToMatch was removed partway through selection");
+ SelectionDAG::DAGNodeDeletedListener NDL(*CurDAG, [&](SDNode *N,
+ SDNode *E) {
+ assert(!E && "Unexpected node replacement in MorphNode");
+ ChainNodesMatched.erase(std::remove(ChainNodesMatched.begin(),
+ ChainNodesMatched.end(), N),
+ ChainNodesMatched.end());
+ });
Res = MorphNode(NodeToMatch, TargetOpc, VTList, Ops, EmitNodeInfo);
}
OpenPOWER on IntegriCloud