summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2008-04-13 16:04:03 +0000
committerDuncan Sands <baldrick@free.fr>2008-04-13 16:04:03 +0000
commit0a8a4c4a0ca1ae083b0ed978ed50b2931db4a4eb (patch)
tree4795790fa4a81065f1557b6df85542d298fb239b
parentdcc2eda5fc16813f0d90dfdbbc237613c2663adb (diff)
downloadbcm5719-llvm-0a8a4c4a0ca1ae083b0ed978ed50b2931db4a4eb.tar.gz
bcm5719-llvm-0a8a4c4a0ca1ae083b0ed978ed50b2931db4a4eb.zip
LegalizeTypes can sometimes have deleted nodes
in its maps. Add some sanity checks that catch this kind of thing. Hopefully these can be removed one day (once all problems are fixed!) but for the moment it seems wise to have them in. llvm-svn: 49612
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp48
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h3
2 files changed, 51 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
index 380c42220c7..34f99da49fa 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
@@ -267,6 +267,51 @@ void DAGTypeLegalizer::AnalyzeNewNode(SDNode *&N) {
Worklist.push_back(N);
}
+void DAGTypeLegalizer::SanityCheck(SDNode *N) {
+ for (SmallVector<SDNode*, 128>::iterator I = Worklist.begin(),
+ E = Worklist.end(); I != E; ++I)
+ assert(*I != N);
+
+ for (DenseMap<SDOperandImpl, SDOperand>::iterator I = ReplacedNodes.begin(),
+ E = ReplacedNodes.end(); I != E; ++I) {
+ assert(I->first.Val != N);
+ assert(I->second.Val != N);
+ }
+
+ for (DenseMap<SDOperandImpl, SDOperand>::iterator I = PromotedNodes.begin(),
+ E = PromotedNodes.end(); I != E; ++I) {
+ assert(I->first.Val != N);
+ assert(I->second.Val != N);
+ }
+
+ for (DenseMap<SDOperandImpl, SDOperand>::iterator
+ I = FloatToIntedNodes.begin(),
+ E = FloatToIntedNodes.end(); I != E; ++I) {
+ assert(I->first.Val != N);
+ assert(I->second.Val != N);
+ }
+
+ for (DenseMap<SDOperandImpl, SDOperand>::iterator I = ScalarizedNodes.begin(),
+ E = ScalarizedNodes.end(); I != E; ++I) {
+ assert(I->first.Val != N);
+ assert(I->second.Val != N);
+ }
+
+ for (DenseMap<SDOperandImpl, std::pair<SDOperand, SDOperand> >::iterator
+ I = ExpandedNodes.begin(), E = ExpandedNodes.end(); I != E; ++I) {
+ assert(I->first.Val != N);
+ assert(I->second.first.Val != N);
+ assert(I->second.second.Val != N);
+ }
+
+ for (DenseMap<SDOperandImpl, std::pair<SDOperand, SDOperand> >::iterator
+ I = SplitNodes.begin(), E = SplitNodes.end(); I != E; ++I) {
+ assert(I->first.Val != N);
+ assert(I->second.first.Val != N);
+ assert(I->second.second.Val != N);
+ }
+}
+
namespace {
/// NodeUpdateListener - This class is a DAGUpdateListener that listens for
/// updates to nodes and recomputes their ready state.
@@ -281,6 +326,9 @@ namespace {
assert(N->getNodeId() != DAGTypeLegalizer::Processed &&
N->getNodeId() != DAGTypeLegalizer::ReadyToProcess &&
"RAUW deleted processed node!");
+#ifndef NDEBUG
+ DTL.SanityCheck(N);
+#endif
}
virtual void NodeUpdated(SDNode *N) {
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index 5b9879315f8..b5ec7d1ca8e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -379,6 +379,9 @@ private:
SDOperand SplitOp_RET(SDNode *N, unsigned OpNo);
SDOperand SplitOp_STORE(StoreSDNode *N, unsigned OpNo);
SDOperand SplitOp_VECTOR_SHUFFLE(SDNode *N, unsigned OpNo);
+
+public:
+ void SanityCheck(SDNode *N);
};
} // end namespace llvm.
OpenPOWER on IntegriCloud