RFR(S): 8087341: C2 doesn't optimize redundant memory operations with G1

Mikael Gerdin mikael.gerdin at oracle.com
Wed Feb 3 13:42:07 UTC 2016


Hi Andrew,

On 2016-02-02 18:03, Andrew Haley wrote:
> On 02/02/2016 02:55 PM, Mikael Gerdin wrote:
>> The barrier can only be removed if the object is never allocated.
>> If the object is allocated and the field store is performed then the
>> barrier must be preserved, even if the compiler can prove that no
>> application thread can see the objects, a concurrent gc thread may still
>> see these objects.
>
> This reminds me of the discussion at http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2015-December/020345.html

I've realized that this is becoming a bit confusing since we are in fact 
talking about two different uses of the word "barrier".

The use I meant in my reply above is the entire "g1 post-barrier".
This is further complicated by the fact that the "g1 post-barrier" does 
contain an instruction sequence which has the intended effect of a 
"StoreLoad memory barrier".

I've had a look at the mail thread (and I did follow it with a cursory 
look when it was active).

>
> It removes the memory barrier after object creation if the object does
> not escape.  I guess this is not safe, then, because a concurrent GC
> will see a partially-constructed object: the fields may not have been
> zeroed and the  header may not have been initialized.
>
> I'd like your opinion on this.

I think that the reasoning in the thread is sound, and it should hold 
for this case as well.

The one question I have is if it is possible for a safepoint to occur 
between
*) in your case between the object initialization and the memory barrier 
instruction
*) in this case between the object allocation and the field store with 
its g1 post-barrier.

If there is no way a safepoint can occur in the middle of these 
transactions then I believe it should be safe to elide the entire "g1 
post-barrier" in this case. But the reason for that is that post 
barriers can be elided altogether for newly allocated objects.
This, however, should already be taken care of by
GraphKit::g1_can_remove_post_barrier.

So, given that we are emitting the "g1 post-barrier" I would say that 
it's not safe to remove the "memory barrier" instruction from it.

Does that make sense?

/Mikael


>
> Thanks,
>
> Andrew.
>



More information about the hotspot-compiler-dev mailing list