[LLVMdev] LowerCALL (TargetLowering)
Evan Cheng
evan.cheng at apple.com
Wed Nov 15 10:17:19 PST 2006
Hi Nickhil,
The Legalizer expects lower'd call is the node that produce the same
number of values as the non-lowered node. That's what the assertion
is checking.
Take a look at the LowerCall routine for any other targets. You will
see that in the non-void function case, it returns a MERGE_VALUES,
i.e. all the results merged along with the chain.
Cheers,
Evan
On Nov 15, 2006, at 3:30 AM, Nikhil Patil wrote:
> Hi,
>
> I am trying to write a LowerCALL() function for my (custom) target
> ISA.
> All I need to do is map a CALL instruction directly onto an SDNode
> that
> takes an equal number of arguments (very much alike intrinsics, except
> that these are custom to my target.) I do not need to implement any
> call
> sequences, stack frames etc.
>
> I get the following assertion failure:
>
> llc: LegalizeDAG.cpp:834: llvm::SDOperand
> <unnamed>::SelectionDAGLegalize::LegalizeOp(llvm::SDOperand):
> Assertion `Tmp3.Val->getNumValues() == Result.Val->getNumValues()
> && "Lowering call/formal_arguments produced unexpected # results!"'
> failed.
>
> This is what my LowerCALL looks like:
>
> SDOperand MCTargetLowering::LowerCALL(SDOperand Op, SelectionDAG
> &DAG) {
> SDOperand Chain = Op.getOperand(0);
> bool isVarArg = cast<ConstantSDNode>(Op.getOperand(2))-
> >getValue() != 0;
> assert(!isVarArg);
> bool isTailCall = cast<ConstantSDNode>(Op.getOperand(3))-
> >getValue() != 0;
> SDOperand Callee = Op.getOperand(4);
> MVT::ValueType RetVT= Op.Val->getValueType(0);
> unsigned NumOps = (Op.getNumOperands() - 5) / 2;
>
> std::string Name;
> if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>
> (Callee))
> Name = G->getGlobal()->getName();
> else if (ExternalSymbolSDNode *S =
> dyn_cast<ExternalSymbolSDNode>(Callee))
> Name = S->getSymbol();
>
> unsigned opcode = funcname_to_opc[Name];
> assert(opcode != 0 && "Unknown function call.");
>
> std::vector<MVT::ValueType> Tys;
> std::vector<SDOperand> Ops;
>
> for (unsigned i = 0; i != NumOps; ++i) {
> SDOperand Arg = Op.getOperand(5+2*i);
> Tys.push_back(Arg.getValueType());
> Ops.push_back(Arg);
> }
> Tys.push_back(MVT::Other);
> Ops.push_back(Chain);
>
> Chain = DAG.getNode(opcode, Tys, &Ops[0], Ops.size());
>
> assert(RetVT == MVT::Other);
> return Chain;
> }
>
> Everything works fine for functions with no arguments, but otherwise I
> get this assert. Can anyone point out my mistake?
>
> Any help will be greatly appreciated,
>
> Thanks,
> Nikhil
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list