[LLVMdev] variable_ops in RET?

Yang, Cheng-Chih Cheng-Chih.Yang at amd.com
Tue Mar 31 10:45:42 PDT 2015


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>


More information about the llvm-dev mailing list