RFR: 8331311: C2: Big Endian Port of 8318446: optimize stores into primitive arrays by combining values into larger store [v3]

Richard Reingruber rrich at openjdk.org
Wed May 15 14:12:17 UTC 2024


> This pr adds a few tweaks to [JDK-8318446](https://bugs.openjdk.org/browse/JDK-8318446) which allows enabling it also on big endian platforms (e.g. AIX, S390). JDK-8318446 introduced a C2 optimization to replace consecutive stores to a primitive array with just one store.
> 
> By example (from `TestMergeStores.java`):
> 
> 
>     static Object[] test2a(byte[] a, int offset, long v) {
>         if (IS_BIG_ENDIAN) {
>             a[offset + 0] = (byte)(v >> 56);
>             a[offset + 1] = (byte)(v >> 48);
>             a[offset + 2] = (byte)(v >> 40);
>             a[offset + 3] = (byte)(v >> 32);
>             a[offset + 4] = (byte)(v >> 24);
>             a[offset + 5] = (byte)(v >> 16);
>             a[offset + 6] = (byte)(v >> 8);
>             a[offset + 7] = (byte)(v >> 0);
>         } else {
>             a[offset + 0] = (byte)(v >> 0);
>             a[offset + 1] = (byte)(v >> 8);
>             a[offset + 2] = (byte)(v >> 16);
>             a[offset + 3] = (byte)(v >> 24);
>             a[offset + 4] = (byte)(v >> 32);
>             a[offset + 5] = (byte)(v >> 40);
>             a[offset + 6] = (byte)(v >> 48);
>             a[offset + 7] = (byte)(v >> 56);
>         }
>         return new Object[]{ a };
>     }
> 
> 
> Depending on the endianess 8 bytes are stored into an array. The order of the stores is the same as the order of an 8-byte-store therefore 8 1-byte-stores can be replaced with just one 8-byte-store (if there aren't too many range checks).
> 
> Additionally I've fixed a few comments and a test bug.
> 
> The optimization seems to be a little bit more effective on big endian platforms.
> 
> Again by example:
> 
> 
>     static Object[] test800a(byte[] a, int offset, long v) {
>         if (IS_BIG_ENDIAN) {
>             a[offset + 0] = (byte)(v >> 40); // Removed from candidate list
>             a[offset + 1] = (byte)(v >> 32); // Removed from candidate list
>             a[offset + 2] = (byte)(v >> 24); // Merged
>             a[offset + 3] = (byte)(v >> 16); // Merged
>             a[offset + 4] = (byte)(v >> 8);  // Merged
>             a[offset + 5] = (byte)(v >> 0);  // Merged
>         } else {
>             a[offset + 0] = (byte)(v >> 0);  // Removed from candidate list
>             a[offset + 1] = (byte)(v >> 8);  // Removed from candidate list
>             a[offset + 2] = (byte)(v >> 16); // Not merged
>             a[offset + 3] = (byte)(v >> 24); // Not merged
>             a[offset + 4] = (byte)(v >> 32); // Not merged
>             a[offset + 5] = (byte)(v >> 40); // Not merged
>         }
>         return new Object[]{ a };...

Richard Reingruber has updated the pull request incrementally with two additional commits since the last revision:

 - test2BE: big endian version of test2
 - Improve make_merged_input_value based on Emanuel's feedback

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/19218/files
  - new: https://git.openjdk.org/jdk/pull/19218/files/dc05bb0b..8844c837

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=19218&range=02
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19218&range=01-02

  Stats: 172 lines in 2 files changed: 98 ins; 34 del; 40 mod
  Patch: https://git.openjdk.org/jdk/pull/19218.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/19218/head:pull/19218

PR: https://git.openjdk.org/jdk/pull/19218


More information about the hotspot-compiler-dev mailing list