RFR: 8300258: C2: vectorization fails on simple ByteBuffer loop
Roland Westrelin
roland at openjdk.org
Mon Feb 6 14:23:55 UTC 2023
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.
-------------
Commit messages:
- more
- fix & test
Changes: https://git.openjdk.org/jdk/pull/12440/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=12440&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8300258
Stats: 186 lines in 2 files changed: 184 ins; 0 del; 2 mod
Patch: https://git.openjdk.org/jdk/pull/12440.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/12440/head:pull/12440
PR: https://git.openjdk.org/jdk/pull/12440
More information about the hotspot-compiler-dev
mailing list