RFR: 8233506: ZGC: the load for Reference.get() can be converted to a load for strong refs
Per Liden
per.liden at oracle.com
Fri Nov 8 22:45:41 UTC 2019
On 11/7/19 2:49 PM, 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/
Looks good!
As discussed off-line, even if it's not a problem for ZGC, we should fix
so that we never call access.set_raw_access() *after* GVN
transformation. But let's do that as a separate fix.
/Per
>
> Bug:
> https://bugs.openjdk.java.net/browse/JDK-8233506
>
> Thanks,
> /Erik
More information about the hotspot-compiler-dev
mailing list