diff options
author | Duncan Sands <baldrick@free.fr> | 2008-02-04 09:29:17 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-02-04 09:29:17 +0000 |
commit | 354e353220c1aabe340c9c2ffbc155d29e74c48f (patch) | |
tree | ea3dabc5c96a6979716efe1d39b6ab96de074f08 | |
parent | e146c0e3fda28afc013523fef4c152cede9f4e41 (diff) | |
download | bcm5719-llvm-354e353220c1aabe340c9c2ffbc155d29e74c48f.tar.gz bcm5719-llvm-354e353220c1aabe340c9c2ffbc155d29e74c48f.zip |
I don't see how NodeUpdated can be called with a
ReadyToProcess node - add an assertion to check
this. Add an assertion to NodeDeleted that checks
that processed/ready nodes are indeed not deleted.
It is because they are never deleted that none of
the maps can have a deleted node as the source of
a mapping. It does however seem to be possible in
theory to have a deleted value as the target of a
mapping, however this has not yet been spotted in
the wild. Still mulling on what to do about this.
[The theoretical situation is this: a node A is
expanded/promoted/whatever to a newly created node
B. Thus A->B is added to a map. When the subtree
rooted at B is legalized it is conceivable that B
is deleted due to RAUW on a node somewhere above
it].
llvm-svn: 46705
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp index f09a311c064..3d419552826 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp @@ -220,22 +220,27 @@ void DAGTypeLegalizer::MarkNewNodes(SDNode *N) { namespace { /// NodeUpdateListener - This class is a DAGUpdateListener that listens for /// updates to nodes and recomputes their ready state. - class VISIBILITY_HIDDEN NodeUpdateListener : + class VISIBILITY_HIDDEN NodeUpdateListener : public SelectionDAG::DAGUpdateListener { DAGTypeLegalizer &DTL; public: NodeUpdateListener(DAGTypeLegalizer &dtl) : DTL(dtl) {} - + virtual void NodeDeleted(SDNode *N) { // Ignore deletes. + assert(N->getNodeId() != DAGTypeLegalizer::Processed && + N->getNodeId() != DAGTypeLegalizer::ReadyToProcess && + "RAUW deleted processed node!"); } - + virtual void NodeUpdated(SDNode *N) { // Node updates can mean pretty much anything. It is possible that an // operand was set to something already processed (f.e.) in which case // this node could become ready. Recompute its flags. - if (N->getNodeId() != DAGTypeLegalizer::ReadyToProcess) - DTL.ReanalyzeNodeFlags(N); + assert(N->getNodeId() != DAGTypeLegalizer::Processed && + N->getNodeId() != DAGTypeLegalizer::ReadyToProcess && + "RAUW updated processed node!"); + DTL.ReanalyzeNodeFlags(N); } }; } |