[9] RFR(S): 8181742: Load that bypasses arraycopy has wrong memory state

Tobias Hartmann tobias.hartmann at oracle.com
Fri Jun 16 07:32:38 UTC 2017


Hi Roland,

this looks good to me but can you elaborate a bit on why this also fixes 8179678?

I think Vladimir should have a look as well. I'll run some pre-integration testing in the meantime.

Best regards,
Tobias

On 09.06.2017 10:36, Roland Westrelin wrote:
> 
> http://cr.openjdk.java.net/~roland/8181742/webrev.00/
> 
> In:
> 
> static int test1(int[] src) {
>      int[] dst = new int[10];
>      System.arraycopy(src, 0, dst, 0, 10);
>      src[1] = 0x42;
>      return dst[1];
> }
> 
> LoadNode::can_see_arraycopy_value() replaces the load dst[1] by src[1]
> but it does that by cloning the load and doesn't change the memory
> edge. C2 then wrongly optimizes the src[1] load right after the store to
> src[1] as 0x42. This is fixed by setting the memory edge to the memory
> state right before the arraycopy.
> 
> This fix is also a nicer fix for 8179678 (ArrayCopy with same src and
> dst can cause incorrect execution or compiler crash). Most of the
> previous fix is no longer necessary and I removed it.
> 
> With that change, the following test breaks:
> 
> static Object test5_src = null;
> static int test3() {
>     int[] dst = new int[10];
>     System.arraycopy(test5_src, 0, dst, 0, 10);
>     ((int[])test5_src)[1] = 0x42;
>     System.arraycopy(test5_src, 0, dst, 0, 10);
>     return dst[1];
> }
> 
> The input to the arraycopy is not an array. The dst[1] load is replaced
> by test5_src[1] which is of type Object + some offset so that load
> before the second arraycopy won't be on the same slice as the store to
> the array and they can reorder. That failure can be reproduced with
> -XX:+StressGCM and -XX:+StressLCM by running the test enough
> times. LoadNode::can_see_arraycopy_value() now bails out if the source
> type is not an array. If guards are emitted before the ArrayCopyNode we
> can safely assume test5_src is of array type. To cover that case,
> I added a CheckCast to the intrinsification code.
> 
> Roland.
> 


More information about the hotspot-compiler-dev mailing list