[llvm-dev] LLVM as a back end for HHVM

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Thu Sep 10 09:40:13 PDT 2015


On 09/08/2015 11:56 AM, Maksim Panchenko wrote:
> On 9/8/15, 9:35 AM, "Philip Reames" <listmail at philipreames.com> wrote:
>
>>>> We're currently developing a scheme called "operand bundles" (more
>>>> details at [1], patches at [2]) that can be used to tag calls and
>>>> invokes with arbitrary values in a way that that they won't be dropped
>>>> by the optimizer.  The exact semantics of operand bundles are still
>>>> under discussion, and I'd like to make mechanism broadly useful,
>>>> including for things like location records.  So it'd be great if you
>>>> take a look to see if location records can be implemented using
>>>> operand bundles.  I was thinking of something like
>>>>
>>>>     musttail call void @foo(i64 %val) [ "locrec"(i32 42) ]
>>>>
>>>> where the "locrec"(i32 42) gets lowered to some suitable form in
>>>> SelectionDAG.
>>> That sounds like it should work. One of the ideas behind locrecs was
>>> that they'd work with any instruction, not just call. We currently
>>> only use locrecs on call/invoke, and I can't think of anything we
>>> haven't yet implemented that would benefit from locrecs on other
>>> instructions (that may change in the future, of course).
>> Interesting.  What type of use cases are you imagining for locrecs on
>> non-call instructions?  Are you thinking of things like implicit null
>> and div-by-zero checks?  (The former is already supported in LLVM
>> today.)  Or something else entirely?
> One possible scenario is locating a constant address generation, e.g. for
> an
> indirect call destination. It¹s rather hypothetical example,
> as we don¹t use it in this way at the moment. Substituting such address
> isn¹t quite straightforward as the value could be scattered across several
> instructions on some architectures, or be placed in a data section.
Just to be clear, you're talking about representing a call to a function 
at a constant address right?  With no additional constraints?  If so, 
introducing a function declaration and using the link/resolver 
functionality provided by MCJIT seems like a more natural fit.  The only 
real downside to that is that you end up with a generic far-call and we 
don't have a way to indicate a particular call is in fact near enough 
for a pc-relative offset.
>
> In general, we found locrecs useful for annotating IR and exploring
> resulting
> assembly. You could mark instruction in the IR, and the assembly dump will
> include annotations showing all machine instructions generated from it.
> However, this particular feature is orthogonal to our JIT requirements
> and could go in separately if there¹s enough interest.
This actually sounds like both a useful debugging feature and a 
reasonable use of metadata.  Given there's no *correctness* requirement 
that the metadata be preserved, it seems like a reasonable fit.  If you 
wanted to propose this upstream, I could see this being really useful 
with some revision.  My biggest concern would be whether this overlaps 
with something we already have in the debug info support.
>
> Maksim
>



More information about the llvm-dev mailing list