Changes in directory llvm/lib/CodeGen/SelectionDAG:
LegalizeDAG.cpp updated: 1.231 -> 1.232 --- Log message: legalize copytoreg and copyfromreg nodes that have flag operands correctly. --- Diffs of the changes: (+34 -11) LegalizeDAG.cpp | 45 ++++++++++++++++++++++++++++++++++----------- 1 files changed, 34 insertions(+), 11 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.231 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.232 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.231 Sat Dec 17 17:46:46 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Sun Dec 18 09:27:43 2005 @@ -567,13 +567,21 @@ return LegalizeOp(Node->getOperand(Op.ResNo)); case ISD::CopyFromReg: Tmp1 = LegalizeOp(Node->getOperand(0)); - if (Tmp1 != Node->getOperand(0)) - Result = DAG.getCopyFromReg(Tmp1, + Result = Op.getValue(0); + if (Node->getNumOperands() == 2) { + if (Tmp1 != Node->getOperand(0)) + Result = DAG.getCopyFromReg(Tmp1, cast<RegisterSDNode>(Node->getOperand(1))->getReg(), - Node->getValueType(0)); - else - Result = Op.getValue(0); - + Node->getValueType(0)); + } else { + assert(Node->getNumOperands() == 3 && "Invalid copyfromreg!"); + Tmp2 = LegalizeOp(Node->getOperand(2)); + if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(2)) + Result = DAG.getCopyFromReg(Tmp1, + cast<RegisterSDNode>(Node->getOperand(1))->getReg(), + Node->getValueType(0), Tmp2); + AddLegalizedOperand(Op.getValue(2), Result.getValue(2)); + } // Since CopyFromReg produces two values, make sure to remember that we // legalized both of them. AddLegalizedOperand(Op.getValue(0), Result); @@ -1130,11 +1138,27 @@ assert(isTypeLegal(Node->getOperand(2).getValueType()) && "Register type must be legal!"); - // Legalize the incoming value (must be legal). + // Legalize the incoming value (must be a legal type). Tmp2 = LegalizeOp(Node->getOperand(2)); - if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(2)) - Result = DAG.getNode(ISD::CopyToReg, MVT::Other, Tmp1, - Node->getOperand(1), Tmp2); + if (Node->getNumOperands() == 3) { + if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(2)) + Result = DAG.getNode(ISD::CopyToReg, MVT::Other, Tmp1, + Node->getOperand(1), Tmp2); + } else { + assert(Node->getNumOperands() == 4 && "Unknown CopyToReg"); + Tmp3 = LegalizeOp(Node->getOperand(3)); + if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(2) || + Tmp3 != Node->getOperand(3)) { + unsigned Reg = cast<RegisterSDNode>(Node->getOperand(1))->getReg(); + Result = DAG.getCopyToReg(Tmp1, Reg, Tmp2, Tmp3); + } + + // Since this produces two values, make sure to remember that we legalized + // both of them. + AddLegalizedOperand(SDOperand(Node, 0), Result); + AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1)); + return Result.getValue(Op.ResNo); + } break; case ISD::RET: @@ -1278,7 +1302,6 @@ AddLegalizedOperand(SDOperand(Node, 0), Result); AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1)); return Result.getValue(Op.ResNo); - break; case ISD::TRUNCSTORE: Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits