RFR: 8233506: ZGC: the load for Reference.get() can be converted to a load for strong refs

erik.osterlund at oracle.com erik.osterlund at oracle.com
Fri Nov 8 15:00:42 UTC 2019


Hi Nils,

Thanks!

/Erik

On 11/8/19 3:58 PM, Nils Eliasson wrote:
> 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