[LLVMdev] Broke my tail (call)

Arnold Schwaighofer
Tue, 24 Feb 2009 14:31:28 -0000

On Tue, Feb 24, 2009 at 11:57 AM, Török Edwin <edwintorok at gmail.com>
wrote:
> On 2009-02-24 12:35, Jon Harrop wrote:
>> On Tuesday 24 February 2009 00:16:37 Dan Gohman wrote:
>>
>>> On Feb 23, 2009, at 5:59 AM, Anton Korobeynikov wrote:
>>>
>>>> This is not true in general and highly target- and CC-
dependent. For
>>>> example, you can ran out of registers and then your struct can
be
>>>> passed
>>>> partly in registers and partly on stack. And depending on the
stack
>>>> frame size of the callee you can easily get infinite stack
growth.
>>>>
>>> There is a sense in which it is true -- first-class structs are
>>> converted to a set of *virtual* registers holding their first-class
fields,
>>> which may of course be passed on the stack when physical registers
run
>>> short, in exactly the same manner as with lots of scalar arguments.
>>>
>>
>> Exactly.
>
> In case of tailcall(+fastcc?), can't this be done in constant
stackspace?
> First time you allocate stackspace to pass the parameters, then all
> other tailcalls will reuse the stackspace
> that it got its parameters in, to pass parameters to the next tailcall.

Yes and indeed it already does.

define fastcc void @init2({ i32, i32, i32, i32}, i32) {
entry:
       tail call fastcc void @init2({ i32, i32, i32, i32} %0, i32 %1)
       ret void
}

results in (admittedly a little to eager to move arguments around )
tail call version:

Llabel1:
        subl    $12, %esp
        movl    24(%esp), %eax
        movl    %eax, 24(%esp)
        movl    20(%esp), %eax
        movl    %eax, 20(%esp)
        movl    16(%esp), %eax
        movl    %eax, 16(%esp)
        addl    $12, %esp
        jmp     _init2  # TAILCALL
Leh_func_end1:

The problem Jon is seeing has to do with the struct return. not the
struct argument passing as i wrongly assumed at first.

regards arnold