diff options
| author | Duncan Sands <baldrick@free.fr> | 2008-06-30 16:43:45 +0000 |
|---|---|---|
| committer | Duncan Sands <baldrick@free.fr> | 2008-06-30 16:43:45 +0000 |
| commit | 9e08148f297679c1a0a20a0012f205a5bec98d6d (patch) | |
| tree | 66a6a051d368a275a2c1391636fce6f0f745665f /llvm/lib | |
| parent | 54dd81ced97dccc2196481e3fb43dd4548b888e1 (diff) | |
| download | bcm5719-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.cpp | 21 |
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) { |

