summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2008-02-04 09:29:17 +0000
committerDuncan Sands <baldrick@free.fr>2008-02-04 09:29:17 +0000
commit6cb7e6d36bf7d5b3687ae19217fef6dd24448285 (patch)
tree139f7d18190e757d2a195d7cf6fa0926ee46da07 /lib
parent204e84e138b973491039c1a37cf93a6fa85bb1e1 (diff)
downloadllvm-6cb7e6d36bf7d5b3687ae19217fef6dd24448285.tar.gz
llvm-6cb7e6d36bf7d5b3687ae19217fef6dd24448285.tar.bz2
llvm-6cb7e6d36bf7d5b3687ae19217fef6dd24448285.tar.xz
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]. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46705 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeTypes.cpp15
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
index f09a311c06..3d41955282 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
+++ b/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);
}
};
}