On 4/15/19 6:51 AM, Michael Matz wrote:
> Hi,
> 
> On Fri, 12 Apr 2019, Jeff Law wrote:
> 
>>> I don't think this follows. Imagine a pure foo tailcalling a pure bar.
>>> To make the tailcall, foo may need to change some of its argument slots
>>> to pass new arguments to bar.
>> I'd claim that a pure/const call can't tail call another function as
>> that would potentially modify the argument slots.
> 
> I still don't think that what you want follows.  Imagine this:
> 
>   int foo (int i) { ++i; return i; }
> 
> To claim that this function is anything else than const+pure seems weird 
> (in fact this function doesn't access anything that must lie in memory at 
> all).  Now take your off-the-mill ABI that passes arguments on stack, and 
> an only slightly bad code generator, i.e. -O0 on i386.  You will get an 
> modification of the argument slot:
Ugh.  Good point.  But then we're back to the problem with handling of
REG_EQUIV notes for stores into the argument space.  If the callee owns,
has been declared pure/const, but can clobber things like you've shown,
then a REG_EQUIV note on those slots must be avoided.

> 
> foo:
>         pushl   %ebp
>         movl    %esp, %ebp
>         addl    $1, 8(%ebp)
>         movl    8(%ebp), %eax
>         popl    %ebp
>         ret
> 
> So, if anything then the ownership of argument slots is a property of the 
> psABI.  And while we may have been through this discussion a couple times 
> over the years, I'm pretty sure that at least I consistently argued to 
> declare all psABIs that leave argument slot ownerships with the callers 
> (after the call actually happens) to be seriously broken^Wmisguided (and 
> yes, also because it can prevent tail calls that otherwise would be 
> perfectly valid).
Certainly wouldn't disagree that the ABIs ought to own defining this
stuff.  It's just an area where they've been weak in the past.

Jeff

Reply via email to