RFR: 8277168: AArch64: Enable arraycopy partial inlining with SVE

Andrew Haley aph at openjdk.java.net
Thu Nov 18 16:55:43 UTC 2021


On Thu, 18 Nov 2021 13:53:11 GMT, Andrew Haley <aph at openjdk.org> wrote:

> I'm baffled by what is going on.

Sorry, it looks like I managed to confuse myself. The top of the loop looks like:

    10c     B17: #      out( B18 ) <- in( B27 )  Freq: 4.49963
    10c     # castLL of R2
    10c     sve_whilelo P0, zr, R2       # sve
    110     sve_ldr V16, P0, [R0]       # load vector predicated (sve)
    114     sve_str [R1], P0, V16       # store vector predicated (sve)
    118     B18: #      out( B30 B19 ) <- in( B17 B28 B26 )  Freq: 8.99927
    118
    118     ldarb  R10, [R23]   # byte ! Field: volatile org/openjdk/jmh/runner/InfraControlL2.isDone

... and the bottom

    1a0     cmp  R2, #64
    1a4     bls  B17    # unsigned  P=0.500000 C=-1.000000
    1a8     B28: #      out( B18 ) <- in( B27 )  Freq: 4.49963
    1a8     CALL, runtime leaf nofp 0x0000ffff6d1058f8 jbyte_arraycopy
            No JVM State Info
            #
    1b0     b  B18

So only if the length is < 64 (i.e. 512 bits) do we branch back to B17 to do the `SVE WHILELO` to set the predicate. This is confusing only because the code has been rearranged so that the test for < 64 bytes is at the bottom of the loop.

-------------

PR: https://git.openjdk.java.net/jdk/pull/6444


More information about the hotspot-compiler-dev mailing list