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