RFR: 8300258: C2: vectorization fails on simple ByteBuffer loop [v5]

Doug Simon dnsimon at openjdk.org
Thu Jun 15 13:38:21 UTC 2023


On Mon, 6 Mar 2023 14:26:19 GMT, Roland Westrelin <roland at openjdk.org> wrote:

>> The loop that doesn't vectorize is:
>> 
>> 
>> public static void testByteLong4(byte[] dest, long[] src, int start, int stop) {
>>     for (int i = start; i < stop; i++) {
>>         UNSAFE.putLongUnaligned(dest, 8 * i + baseOffset, src[i]);
>>     }
>> }
>> 
>> 
>> It's from a micro-benchmark in the panama
>> repo. `SuperWord::find_adjacent_refs() `prevents it from vectorizing
>> because it finds it cannot properly align the loop and, from the
>> comment in the code, that:
>> 
>> 
>> // Can't allow vectorization of unaligned memory accesses with the
>> // same type since it could be overlapped accesses to the same array.
>> 
>> 
>> The test for "same type" is implemented by looking at the memory
>> operation type which in this case is overly conservative as the loop
>> above is reading and writing with long loads/stores but from and to
>> arrays of different types that can't overlap. Actually, with such
>> mismatched accesses, it's also likely an incorrect test (reading and
>> writing could be to the same array with loads/stores that use
>> different operand size) eventhough I couldn't write a test case that
>> would trigger an incorrect execution.
>> 
>> As a fix, I propose implementing the "same type" test by looking at
>> memory aliases instead.
>
> Roland Westrelin has updated the pull request incrementally with one additional commit since the last revision:
> 
>   improved test

Ok, thanks for the explanation. As long as the tests' correctness do not depend on C2, then they will pass on GraalVM, even if they are really testing much in that case.

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

PR Comment: https://git.openjdk.org/jdk/pull/12440#issuecomment-1593079076


More information about the hotspot-compiler-dev mailing list