Hi guys, I'm running into the following assert in InstrEmiiter::EmitMachineNode() with the RET instruction: #ifndef NDEBUG Unsigned NumMIOperands = NodeOperands + NumResults; if (II.isVariadic()) { assert(NumMIOperands >= II.getNumOperands() && "Too few operands for a variadic node!"); } else { assert(NumMIOperands >= II.getNumOperands() && NumMIOperands <= II.getNumOperands() + II.getNumImplicitDefs() + NumImpUses && "#operands for dag node doesn't match .td file!"); } #endif And the reason seems to be that "NumImpUses" only takes into account the number of the physical registers? The pattern we have for RET is Let isTerminator =1, isReturn =1 in { Multiclass __RET< SDNode node, Opcode op, string asmstr> { def : OP <op, 0, (outs), (ins), !strconcat(asmstr, " "), [(node)]>; } } If I added "variable_ops" for the ins, it seems to then go to the "isvariadic" path without hitting the assert. Let isTerminator =1, isReturn =1 in { Multiclass __RET< SDNode node, Opcode op, string asmstr> { def : OP <op, 0, (outs), (ins variable_ops), !strconcat(asmstr, " "), [(node)]>; } } Does this approach sound reasonable? I noticed that the "variable_ops" has been removed for CALL instructions for many backends. I was wondering if this is not going to be supported by RET either? Thanks a lot, - Chad -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150331/fe92978d/attachment.html>