From 4b653a0405bb16b555334d134c1eb8a97366ec3d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 14 Feb 2006 00:55:02 +0000 Subject: [PATCH] Fix a latent bug in the call sequence handling stuff. Some targets (e.g. x86) create these nodes with flag results. Remember that we legalized them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26156 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index a00e47e4b33..a3317fe9348 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -729,8 +729,10 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { } // Remember that the CALLSEQ_START is legalized. - AddLegalizedOperand(Op, Result); - + AddLegalizedOperand(Op.getValue(0), Result); + if (Node->getNumValues() == 2) // If this has a flag result, remember it. + AddLegalizedOperand(Op.getValue(1), Result.getValue(1)); + // Now that the callseq_start and all of the non-call nodes above this call // sequence have been legalized, legalize the call itself. During this // process, no libcalls can/will be inserted, guaranteeing that no calls @@ -778,10 +780,15 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { Result = DAG.UpdateNodeOperands(Result, Ops); } } - assert(IsLegalizingCall && "imbalance between START/END?"); + assert(IsLegalizingCall && "Call sequence imbalance between start/end?"); // This finishes up call legalization. IsLegalizingCall = false; - break; + + // If the CALLSEQ_END node has a flag, remember that we legalized it. + AddLegalizedOperand(SDOperand(Node, 0), Result.getValue(0)); + if (Node->getNumValues() == 2) + AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1)); + return Result.getValue(Op.ResNo); case ISD::DYNAMIC_STACKALLOC: { Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the size.