[llvm-dev] Altering the return address , for a function with multiple return paths
John McCall via llvm-dev
llvm-dev at lists.llvm.org
Wed Jul 24 16:18:51 PDT 2019
On 24 Jul 2019, at 18:24, Philip Reames wrote:
> On 7/24/19 7:42 AM, John McCall wrote:
>>
>> On 24 Jul 2019, at 1:46, Philip Reames wrote:
>>
>> We've also got some cases where returning a value in a flag might
>> be useful. Our typical use case is we have a "rare, but not
>> *that* rare* slowpath which sometimes needs to run after a call
>> from a runtime function. Our other compiler(s) - which use hand
>> rolled assembly for all of these bits - return the "take-rare"
>> bit
>> in ZF, and branch on that after the call. For our LLVM based
>> system, we just materialize the value into $rax and branch on
>> that. That naive scheme has been surprisingly not bad
>> performance
>> wise.
>>
>> * The "not *that* rare" part is needed to avoid having
>> exceptional
>> unwinding be the right answer.
>>
>> If we were to support something like this, you'd really want to
>> be
>> able to define individual flags in the callee's calling
>> convention
>> clobber/preserve lists. It's really common to have a helper
>> routine which sets say ZF, but leaves others unchanged. Or to
>> have a function which sets ZF, clobbers OF, and preserves all
>> others. But if we were going to do that, we'd quickly realize
>> that the x86 backend doesn't track individual flags at all, and
>> thus conclude it probably wasn't worth it begin with. :)
>>
>> I'm intrigued what functions would usefully /preserve/ flags. That's
>> quite difficult on x86, since it means you have to spill flags if you
>> do any basic arithmetic at all (unless you do it all with |lea|).
>> Maybe on a target like PPC with really fleshed-out support for flags
>> and conditionality?
>>
> My use case would be hand written assembly stubs for particular
> fastpath operations. These aren't compiler generated, and the hour
> of human time to line of code ratio is quite high. Having said that,
> while I have practical examples where returning flags have been used,
> I don't, off the top of my head, have a concrete example of needing to
> preserve flags (except DF). So, take that part more as a "if we're
> there anyways, the ideal would be...". On a practical level, return
> via flags with full clobber (except DF) would probably be more than
> sufficient.
Ah, assembly stubs make perfect sense.
John.
More information about the llvm-dev
mailing list