From 4252704561153f7605e22ef3deae79136dd871a1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 17 May 2006 18:00:08 +0000 Subject: [PATCH] When we legalize target nodes, do not use getNode to create a new node, use UpdateNodeOperands to just update the operands! This is important because getNode will allocate a new node if the node returns a flag and this breaks assumptions in the legalizer that you can legalize some things multiple times and get exactly the same results. This latent bug was exposed by my ppc patch last night, and this fixes gsm/toast. llvm-svn: 28348 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 3799f7cc056..3fbfbf927a3 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -529,19 +529,10 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { // If this is a target node, legalize it by legalizing the operands then // passing it through. std::vector Ops; - bool Changed = false; - for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { + for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) Ops.push_back(LegalizeOp(Node->getOperand(i))); - Changed = Changed || Node->getOperand(i) != Ops.back(); - } - if (Changed) - if (Node->getNumValues() == 1) - Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Ops); - else { - std::vector VTs(Node->value_begin(), - Node->value_end()); - Result = DAG.getNode(Node->getOpcode(), VTs, Ops); - } + + Result = DAG.UpdateNodeOperands(Result.getValue(0), Ops); for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) AddLegalizedOperand(Op.getValue(i), Result.getValue(i)); @@ -1058,7 +1049,7 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { // Merge in the last call, to ensure that this call start after the last // call ended. - if (LastCALLSEQ_END.getOpcode() != ISD::EntryNode) { + if (LastCALLSEQ_END.getOpcode() != ISD::EntryToken) { Tmp1 = DAG.getNode(ISD::TokenFactor, MVT::Other, Tmp1, LastCALLSEQ_END); Tmp1 = LegalizeOp(Tmp1); }