[llvm-dev] RFC: Strong GC References in LLVM

Sanjoy Das via llvm-dev llvm-dev at lists.llvm.org
Fri Jul 15 12:21:09 PDT 2016

Hi Daniel,

Daniel Berlin wrote:
 >          As a starting point, LLVM will conservatively not speculate such
 >          loads and stores; and will leave open the potential to upstream
 >          logic that will have a more precise sense of when these 
loads and
 >          stores are safe to speculate.
 > I think you need to define what you mean by control dependence here.  If
 > you mean speculation, you should say speculation :)

Apologies for being non-specific -- this is really just "don't

 > As you describe below, it is not enough to simply not speculate them.

I'm not sure where I said that?

 > You also are saying you don't want to change the conditions on which
 > they execute.
 > That is very different from speculation.

If I implied that somehow then I (or the example) was wrong. :)

We can't speculate these instructions (without special knowledge of
the GC and the Java type system), and that's it.

 > FWIW: This raises one of the same issues we have now with may-throw,
 > which is that, if all you have is a flag on the instruction, now you
 > have to look at every instruction in every block to know whether a *CFG*
 > transform is correct.
 > That means any pass that wants to just touch the CFG can't do so without
 > also looking at the instruction stream.  It will also make a bunch of
 > things currently O(N), O(N^2) (see the sets of patches fixing may-throw
 > places, and extrapolate to more places).

As I said, I'm only proposing a "don't speculate" flag, so this does
not (?) apply.

However, I didn't quite understand your point about may-throw -- how
is may-throw different from a generic side-effect (volatile store,
syscall etc.)?  All of those can't be hoisted or sunk -- we have to
make sure that they execute in semantically the same conditions that
they did in the original program.

 > This is theoretically fixable in each pass by taking a single pass over
 > the instruction stream and marking which blocks have these instructions,
 > etc, and then using that info.
 > But we shouldn't have to do that in each pass,  especially if they just
 > want to make CFG manipulations.
 > The TL;DR  I would really like to see this also made a BB level flag
 > that says whether the block contains instructions with unknown control
 > dependences (or really, 1 bb level flag for each attribute you 
introduce) .
 >   I don't think this is terribly difficult, and at the very least, will
 > keep us from having to look at every instruction in the block in the
 > common case that there is nothing in the block to worry about ;)
 > Also note that these CFG transforms will also now need post-dominance
 > info in a bunch of cases to sanely determine if they are changing the
 > control dependence structure.
 > Let me ask another question:
 > Given
 >    %x = malloc()  ;; known thread local
 >    if (cond_0) {
 >      store GCREF %val to %x
 >    }
 >    if (cond_1) {
 >      store i64 %val to %x
 >    }
 > Assume i can prove cond0 and cond1 the same.
 > I change this to:
 >    %x = malloc()  ;; known thread local
 >    if (cond_0) {
 >      store i64 %val to %x
 >      store GCREF %val to %x
 >    }
 > Is this okay to happen?

Yes.  The only restriction is you can't issue a GCREF load or store
that wouldn't have been issued in the original program (even if the
location is thread local, in case of stores).

-- Sanjoy

 > Note that i did not actually change the control dependence of it by the
 > normal definition of control dependence.
 > But you can end up "hoisting" or "sinking" instructions by moving every
 > other instruction :)
 > Is that okay, or are they really barriers as well (like may throw), in
 > which case, they probably need some real representation in control flow
 > if you want to make most algorithms O(N) (you can get away with the bb
 > level flags if you are willing to make some algorithms N^2 in cases
 > where these things exist).

More information about the llvm-dev mailing list