From: Chris Lattner Date: Sun, 16 Jan 2005 19:46:48 +0000 (+0000) Subject: Implement legalize of call nodes. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8ac532c55eb7f8698466f25d1a8a01240c44ec7d;p=oota-llvm.git Implement legalize of call nodes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19617 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 7582e3f95c9..2c0bfb6df86 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -907,9 +907,6 @@ SDOperand SelectionDAGLegalize::PromoteOp(SDOperand Op) { std::cerr << "NODE: "; Node->dump(); std::cerr << "\n"; assert(0 && "Do not know how to promote this operator!"); abort(); - case ISD::CALL: - assert(0 && "Target's LowerCallTo implementation is buggy, returning value" - " types that are not supported by the target!"); case ISD::Constant: Result = DAG.getNode(ISD::ZERO_EXTEND, NVT, Op); assert(isa(Result) && "Didn't constant fold zext?"); @@ -1092,6 +1089,23 @@ SDOperand SelectionDAGLegalize::PromoteOp(SDOperand Op) { Tmp3 = PromoteOp(Node->getOperand(2)); // Legalize the op1 Result = DAG.getNode(ISD::SELECT, NVT, Tmp1, Tmp2, Tmp3); break; + case ISD::CALL: { + Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. + Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the callee. + + assert(Node->getNumValues() == 2 && Op.ResNo == 0 && + "Can only promote single result calls"); + std::vector RetTyVTs; + RetTyVTs.reserve(2); + RetTyVTs.push_back(NVT); + RetTyVTs.push_back(MVT::Other); + SDNode *NC = DAG.getCall(RetTyVTs, Tmp1, Tmp2); + Result = SDOperand(NC, 0); + + // Insert the new chain mapping. + AddLegalizedOperand(Op.getValue(1), Result.getValue(1)); + break; + } } assert(Result.Val && "Didn't set a result!");