When we legalize target nodes, do not use getNode to create a new node,
authorChris Lattner <sabre@nondot.org>
Wed, 17 May 2006 18:00:08 +0000 (18:00 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 17 May 2006 18:00:08 +0000 (18:00 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28348 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 3799f7cc056e165091e64f7aa32387a7fc0938a6..3fbfbf927a3d2146a0b206e56194af136555f2c2 100644 (file)
@@ -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<SDOperand> 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<MVT::ValueType> 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);
     }