RFR: 8233506: ZGC: the load for Reference.get() can be converted to a load for strong refs
Nils Eliasson
nils.eliasson at oracle.com
Fri Nov 8 14:58:06 UTC 2019
Hi Erik,
Looks good!
Regards,
Nils
On 2019-11-07 14:49, Erik Österlund wrote:
> Hi,
>
> We have noticed problems with the one single place where we let C2
> touch the graph while injecting our load barriers. Right before
> tagging a load as needing a load barrier, it is GVN transformed. The
> problem with this is that if we emit a strong field load, the GVN
> transformation can see through that load, by following it through the
> store that set its value, and find that the field value really came
> from the load of a weak Reference.get intrinsic. In this scenario, the
> load we get out from the GVN transformation needs weak barriers, yet
> we override it with strong barriers, as that was the semantics of the
> access being parsed. Sigh. We already have code that tries to
> determine if the load we got out from the GVN transformation looks
> like a load that was created in the BarrierSetC2 factory function, so
> one way of solving this is to refine that logic that tries to
> determine if this was the load we created before the transformation or
> not. But I felt like a better solution is to finish constructing the
> access with all the intended properties *before* transformation.
>
> I massaged the code so that the GC barrier data of accesses with load
> barriers gets passed in to the factory functions that create the
> access, right before the transformation. This way, we construct the
> access with the intended semantics where it is being created (parser
> or macro expansion for field accesses in clone intrinsics). Then we do
> not have to touch it after the GVN transformation.
>
> It does seem like there could be similar problems from other GCs, but
> in e.g. G1, the consequences are weird suboptimal code instead of
> anything dangerous happening. For example, we can generate SATB
> buffering code required by G1 Reference.get() intrinsics for strong
> accesses, due to GVN handing out earlier accesses with different
> semantics. Perhaps that should be looked into separately as well. But
> that investigation is outside of the scope of this bug fix.
>
> Webrev:
> http://cr.openjdk.java.net/~eosterlund/8233506/webrev.00/
>
> Bug:
> https://bugs.openjdk.java.net/browse/JDK-8233506
>
> Thanks,
> /Erik
More information about the hotspot-compiler-dev
mailing list