]> granicus.if.org Git - llvm/commitdiff
SDAG: Don't leave dangling dead nodes after SelectCodeCommon
authorJustin Bogner <mail@justinbogner.com>
Fri, 6 May 2016 18:42:16 +0000 (18:42 +0000)
committerJustin Bogner <mail@justinbogner.com>
Fri, 6 May 2016 18:42:16 +0000 (18:42 +0000)
Relying on the caller to clean up after we've replaced all uses of a
node won't work when we've migrated to the `void Select(...)` API.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268774 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index 0aafbbae6dbeceadde590e2d686d0210602079b0..a036a31c31770f47cc1272d996af7a73812e4764 100644 (file)
@@ -2179,7 +2179,7 @@ void SelectionDAGISel::UpdateChains(
       CurDAG->ReplaceAllUsesOfValueWith(ChainVal, InputChain);
 
       // If the node became dead and we haven't already seen it, delete it.
-      if (ChainNode->use_empty() &&
+      if (ChainNode != NodeToMatch && ChainNode->use_empty() &&
           !std::count(NowDeadNodes.begin(), NowDeadNodes.end(), ChainNode))
         NowDeadNodes.push_back(ChainNode);
     }
@@ -2741,6 +2741,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
   case ISD::AssertZext:
     CurDAG->ReplaceAllUsesOfValueWith(SDValue(NodeToMatch, 0),
                                       NodeToMatch->getOperand(0));
+    CurDAG->RemoveDeadNode(NodeToMatch);
     return nullptr;
   case ISD::INLINEASM: return Select_INLINEASM(NodeToMatch);
   case ISD::READ_REGISTER: return Select_READ_REGISTER(NodeToMatch);
@@ -3474,6 +3475,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
 
       assert(NodeToMatch->use_empty() &&
              "Didn't replace all uses of the node?");
+      CurDAG->RemoveDeadNode(NodeToMatch);
 
       // FIXME: We just return here, which interacts correctly with SelectRoot
       // above.  We should fix this to not return an SDNode* anymore.