diff options
author | Chris Lattner <sabre@nondot.org> | 2005-01-07 23:32:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-01-07 23:32:00 +0000 |
commit | 7c68ec6b70c765edec1e850331c30a7b65c6ebda (patch) | |
tree | 3b8e46371eb1aa54228a39ee3417e7e0675e1fb9 /lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | 5351e9b172962a4f51e6d3b12018dd2de34b2f97 (diff) |
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
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index e917350f8c..357275eb24 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<SDNode*> 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<SDNode*> &AllNodeSet = *(std::set<SDNode*>*)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); |