summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2008-06-30 16:43:45 +0000
committerDuncan Sands <baldrick@free.fr>2008-06-30 16:43:45 +0000
commit9e08148f297679c1a0a20a0012f205a5bec98d6d (patch)
tree66a6a051d368a275a2c1391636fce6f0f745665f /llvm/lib
parent54dd81ced97dccc2196481e3fb43dd4548b888e1 (diff)
downloadbcm5719-llvm-9e08148f297679c1a0a20a0012f205a5bec98d6d.tar.gz
bcm5719-llvm-9e08148f297679c1a0a20a0012f205a5bec98d6d.zip
ExpungeNode is only needed for new nodes! This
fixes CodeGen/PowerPC/2008-06-19-LegalizerCrash.ll when using the new LegalizeTypes infrastructure. llvm-svn: 52903
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
index 0c50d64d4e2..00f32017428 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
@@ -364,16 +364,19 @@ void DAGTypeLegalizer::RemapNode(SDOperand &N) {
}
}
-/// ExpungeNode - If this is a deleted value that was kept around to speed up
-/// remapping, remove it globally now. The only map that can have a deleted
-/// node as a source is ReplacedNodes. Other maps can have deleted nodes as
-/// targets, but since their looked-up values are always immediately remapped
-/// using RemapNode, resulting in a not-deleted node, this is harmless as long
-/// as ReplacedNodes/RemapNode always performs correct mappings. The mapping
-/// will always be correct as long as ExpungeNode is called on the source when
-/// adding a new node to ReplacedNodes, and called on the target when adding
-/// a new node to any map.
+/// ExpungeNode - If this is a reincarnation of a deleted value that was kept
+/// around to speed up remapping, remove it from all maps now. The only map
+/// that can have a deleted node as a source is ReplacedNodes. Other maps can
+/// have deleted nodes as targets, but since their looked-up values are always
+/// immediately remapped using RemapNode, resulting in a not-deleted node, this
+/// is harmless as long as ReplacedNodes/RemapNode always performs correct
+/// mappings. The mapping will always be correct as long as ExpungeNode is
+/// called on the source when adding a new node to ReplacedNodes, and called on
+/// the target when adding a new node to any map.
void DAGTypeLegalizer::ExpungeNode(SDOperand N) {
+ if (N.Val->getNodeId() != NewNode)
+ return;
+
SDOperand Replacement = N;
RemapNode(Replacement);
if (Replacement != N) {
OpenPOWER on IntegriCloud