From: Chris Lattner Date: Fri, 7 Jan 2005 23:32:00 +0000 (+0000) Subject: Fix a pointer invalidation problem. This fixes Generic/badarg6.ll X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7c68ec6b70c765edec1e850331c30a7b65c6ebda;p=oota-llvm.git Fix a pointer invalidation problem. This fixes Generic/badarg6.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19361 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index e917350f8c9..357275eb244 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -191,29 +191,22 @@ void SelectionDAG::DeleteNodeIfDead(SDNode *N, void *NodeSet) { } // Next, brutally remove the operand list. - std::vector Operands; while (!N->Operands.empty()) { - SDOperand O = N->Operands.back(); + SDNode *O = N->Operands.back().Val; N->Operands.pop_back(); - Operands.push_back(O.Val); - O.Val->removeUser(N); + O->removeUser(N); + + // Now that we removed this operand, see if there are no uses of it left. + DeleteNodeIfDead(O, NodeSet); } // Remove the node from the nodes set and delete it. std::set &AllNodeSet = *(std::set*)NodeSet; AllNodeSet.erase(N); - delete N; // Now that the node is gone, check to see if any of the operands of this node // are dead now. - - // Remove duplicate operand entries. - std::sort(Operands.begin(), Operands.end()); - Operands.erase(std::unique(Operands.begin(), Operands.end()), - Operands.end()); - - for (unsigned i = 0, e = Operands.size(); i != e; ++i) - DeleteNodeIfDead(Operands[i], NodeSet); + delete N; } @@ -733,6 +726,7 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, return getNode(ISD::BR, MVT::Other, N1, N3); else return N1; // Never-taken branch + break; } SDNode *N = new SDNode(Opcode, N1, N2, N3);