RFR: 8341611: [REDO] AArch64: Clean up IndOffXX type and let legitimize_address() fix out-of-range operands

Andrew Haley aph at openjdk.org
Tue Jan 7 17:13:39 UTC 2025


On Mon, 23 Dec 2024 10:45:00 GMT, Fei Gao <fgao at openjdk.org> wrote:

> `IndOffXX` types don't do us any good. It would be simpler and faster to match a general-purpose `IndOff` type then let `legitimize_address()` fix any out-of-range operands. That'd reduce the size of the match rules and the time to run them.
> 
> This patch simplifies the definitions of `immXOffset` with an estimated range. Whether an immediate can be encoded in a `LDR`/`STR` instructions as an offset will be determined in the phase of code-emitting. Meanwhile, we add necessary `legitimize_address()` in the phase of matcher for all `LDR`/`STR` instructions using the new `IndOff` memory operands (fix [JDK-8341437](https://bugs.openjdk.org/browse/JDK-8341437)).
> 
> After this clean-up, memory operands matched with `IndOff` may require extra code emission (effectively a `lea`) before the address can be used. So we also modify the code about looking up precise offset of load/store instruction for implicit null check (fix [JDK-8340646](https://bugs.openjdk.org/browse/JDK-8340646)). On `aarch64` platform, we will use the beginning offset of the last instruction in the instruction clause emitted for a load/store machine node. Because `LDR`/`STR` is always the last one emitted, no matter what addressing mode the load/store operations finally use.
> 
> Tier 1 - 3 passed on `Macos-aarch64` with or without the vm option `-XX:+UseZGC`.

> Yes, as expected, `legitimize_address` splitting is very rare. As you suggested, I compiled all of `java.base` with built `javac` and found over `700k` `load/store` generated by C2 but no `legitimize_address` splitting. Actually, no `legitimize_address` splitting happened even I did `make bootcycle-images`. From our experience, `Unsafe` APIs can generate unaligned offsets and some corner cases may generate out-of-range offsets.

Good enough for me. I made a couple of suggestions about comments.

src/hotspot/cpu/aarch64/aarch64.ad line 5158:

> 5156: // with an immediate offset. legitimize_address() will fix out-of-range
> 5157: // operands by generating a lea before the address can be used.
> 5158: operand indOffI(iRegP reg, immIOffset off)

Suggestion:

// "off" may not be within the encoding range for LDR/STR instructions
// with an immediate offset. In that case, legitimize_address() will fix 
// out-of-range operands by generating a lea before the address is used.
operand indOffI(iRegP reg, immIOffset off)

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

PR Review: https://git.openjdk.org/jdk/pull/22862#pullrequestreview-2534959037
PR Review Comment: https://git.openjdk.org/jdk/pull/22862#discussion_r1905798204


More information about the hotspot-dev mailing list