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

Brett Simmers via llvm-dev
2015-09-04T18:36:57Z

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