[LLVMdev] Proposal: add intrinsics for safe division

Philip Reames listmail at philipreames.com
Fri May 2 16:17:21 PDT 2014


On 05/02/2014 12:52 PM, Andrew Trick wrote:
>
> On May 2, 2014, at 12:16 PM, Filip Pizlo <fpizlo at apple.com 
> <mailto:fpizlo at apple.com>> wrote:
>
>> You're proposing a unified intrinsic that allows Philip's call target 
>> reasoning and the current "anything goes" semantics.  I strongly 
>> dislike unifying the two.  I don't believe that the current semantics 
>> are cleanly expressible using Philip's intrinsic.  Specifying 
>> patchpoint semantics in a way that implies that the call target is 
>> always called breaks inline caches.  Even if you could make those 
>> things work, you'd still have to solve other issues, like the types 
>> used to pass the call target.
>>
>> How would a unified intrinsic work for dynamic object access inline 
>> caches and virtual call inline caches?  Presumably you'd want to have 
>> a special fake call target that means "this can do anything".  You 
>> could say that null means "anything" but this feels ugly.  Other than 
>> that, my understanding is that LLVM IR currently doesn't allow for 
>> any other kind of "this is a call target that is guaranteed to not be 
>> analyzable" construct - hypothetically any extern call could be 
>> resolved with LTO or something else.
>>
>> Claiming in the documentation that the point of a patchpoint is that 
>> it always calls the call target would be confusing to anyone wanting 
>> to implement inline caches using LLVM.  The purpose of inline caches 
>> is to change the call target, or to eliminate the call altogether, 
>> using post-compilation patch-up.  The semantics of patchpoints should 
>> be crystal-clear regarding this aspect of the intrinsic and the fact 
>> that this is allowed.
>>
>> Also, would you expect LLVM phases that perform optimizations using 
>> the call target to recover the call target by unwrapping the 
>> function-pointer-to-i8* bitcast?  This part is particularly yucky to me.
>>
>> There's also the question of how not to break WebKit.  Note that you 
>> can accomplish this by saying that a null call target means that the 
>> call target can do anything, as I mention above - but I don't like 
>> this because it seems like you're creating two intrinsics and 
>> selecting them by passing null as one of the arguments rather than 
>> selecting them by name.
>>
>> Long story short: creating unified intrinsics is useful if it 
>> clarifies reasoning.  In this case a single unified intrinsic doesn't 
>> clarify anything.  We’re
>> talking about two different semantics - one that means call and 
>> another that means "clobber the world" - and so we should keep them 
>> separate.
>
> If you pass a null target, then LLVM can’t assume anything. So you 
> will always have your “anything goes” semantics if you want it.
>
> Passing a symbolic target (which we don’t even support yet) could 
> convey to LLVM that the return value is consistent with the call 
> target. It doesn’t mean the target actually has to be called. e.g. If 
> I give patchpoint a @safe.div target with operands a, b, I can expect 
> the return value to be a/b. Some other stuff could have happened too 
> that doesn’t affect the result.
This was exactly my original chain of reasoning.
>
> I do not like the idea of doing this for safe.div at all, but we could 
> certainly add more useful semantics to patchpoint without affecting 
> WebKit.
>
> -Andy
>>
>> On May 2, 2014 at 12:00:40 PM, Eric Christopher (echristo at gmail.com 
>> <mailto:echristo at gmail.com>) wrote:
>>
>>> On Fri, May 2, 2014 at 11:58 AM, Philip Reames
>>> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>>> >
>>> > On 05/02/2014 11:57 AM, Filip Pizlo wrote:
>>> >
>>> >
>>> > On May 2, 2014 at 11:53:25 AM, Eric Christopher 
>>> (echristo at gmail.com <mailto:echristo at gmail.com>) wrote:
>>> >
>>> > On Wed, Apr 30, 2014 at 10:34 PM, Philip Reames
>>> > <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>>> >> Andy - If you're not already following this closely, please 
>>> start. We've
>>> >> gotten into fairly fundamental questions of what a patchpoint does.
>>> >>
>>> >> Filip,
>>> >>
>>> >> I think you've hit the nail on the head. What I'm thinking of as 
>>> being
>>> >> patchpoints are not what you think they are. Part of that is that 
>>> I've got
>>> >> a local change which adds a very similar construction (called
>>> >> "statepoints"
>>> >> for the moment), but I was trying to keep that separate. That also
>>> >> includes
>>> >> a lot of GC semantics which are not under discussion currently. My
>>> >> apologies if that experience bled over into this conversation and 
>>> made
>>> >> things more confusing.
>>> >>
>>> >> I will note that the documentation for patchpoint say explicitly the
>>> >> following:
>>> >> "The ‘llvm.experimental.patchpoint.*‘ intrinsics creates a 
>>> function call
>>> >> to
>>> >> the specified <target> and records the location of specified 
>>> values in the
>>> >> stack map."
>>> >>
>>> >> My reading has always been that a patchpoint *that isn't patched* is
>>> >> simply
>>> >> a call with a stackmap associated with it. To my reading, this 
>>> can (and
>>> >> did, and does) indicate my proposed usage would be legal.
>>> >>
>>> >
>>> > I like the idea that the target can be assumed to be called. It makes
>>> > optimization of the call possible, etc. I think it's definitely worth
>>> > exploring before we lock down the patchpoint intrinsic.
>>> >
>>> > I will actively oppose this.
>>> >
>>> > I think it sounds like we need to split patchpoint into two cases. 
>>> I'm
>>> > going to send a rough proposal for this later today.
>>> >
>>>
>>> A proposal definitely sounds interesting but if it makes more sense to
>>> keep it as single intrinsics then that's preferable. We've already got
>>> two in a kind of weird way with patchpoint and stackmap.
>>>
>>> -eric
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140502/baf305b2/attachment.html>


More information about the llvm-dev mailing list