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

Brett Simmers via llvm-dev llvm-dev at lists.llvm.org
Fri Sep 4 11:36:57 PDT 2015


On 9/4/15 1:12 AM, Sanjoy Das via llvm-dev wrote:
> Specifically on "Location records" --
>
> Is it legal for the optimizer to drop the `!locrec` metadata that you
> attach to instructions?  The general convention in LLVM is that
> dropping metadata should not affect correctness, and if the location
> record information is not best-effort or optional then metadata is
> perhaps not the best way to represent it.

Unfortunately not - all of our uses of locrecs are required for correctness.

>
> 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).

> I'm also curious about HHVM's notion of side exits -- how do you track
> the abstract state to which you have to exit to?  Our primary use-case
> for operand bundles is to track the abstract state of a thread (the
> "interpreter state") that we need for side exits and asynchronous code
> invalidation.

All VM state syncing for side exits is explicit in the IR we lower to 
LLVM (as a series of stores on an unlikely path), so we don't need 
anything special from LLVM here. We use locrecs to update our jump 
smashing stubs, so they know the address of the jump that entered the 
stub and should be smashed.

-Brett


More information about the llvm-dev mailing list