From: Chris Lattner Date: Sun, 18 Dec 2005 15:27:43 +0000 (+0000) Subject: legalize copytoreg and copyfromreg nodes that have flag operands correctly. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7310fb11f2a074069bf9ec3fc169c742ac48d32b;p=oota-llvm.git legalize copytoreg and copyfromreg nodes that have flag operands correctly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24826 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 16ef90c2515..7b13db8258b 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -567,13 +567,21 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { 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(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(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 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { 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(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 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { 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.