RFR: 8354062: x86: Optimize stores of zero immediates with r12_heapbase

Aleksey Shipilev shade at openjdk.org
Tue Apr 8 17:59:25 UTC 2025


On Tue, 8 Apr 2025 17:53:29 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

> X86 does not have zero register. Except that it does for Hotspot, when compressed oops are enabled and heap base is zero. C2 routinely uses `r12` as zero register then. It makes the code considerably more compact. We can do the same in `MacroAssembler`. This would target the stores of known zeroes, which are surprisingly frequent in C1, mostly for zeroing out various `JavaThread` slots, e.g. for exception handling. 
> 
> Additional testing:
>  - [ ] Linux x86_64 server fastdebug, `all`

Sample code density improvements:


$ for I in 1 2 3 4; do build/linux-x86_64-server-release/images/jdk/bin/java -XX:TieredStopAtLevel=${I} \
 -Xcomp -XX:+CITime Hello 2>&1 | grep "Tier${I}" | cut -d' ' -f 3,23-; done

# Before
Tier1 nmethods_size: 668432 bytes; nmethods_code_size: 431960 bytes}
Tier2 nmethods_size: 718144 bytes; nmethods_code_size: 467888 bytes}
Tier3 nmethods_size: 1328424 bytes; nmethods_code_size: 1009728 bytes}
Tier4 nmethods_size: 493704 bytes; nmethods_code_size: 337272 bytes}

# After
Tier1 nmethods_size: 664880 bytes; nmethods_code_size: 428408 bytes}   ; -0.8% 
Tier2 nmethods_size: 714576 bytes; nmethods_code_size: 464320 bytes}   ; -0.8%
Tier3 nmethods_size: 1324888 bytes; nmethods_code_size: 1006192 bytes} ; -0.4%
Tier4 nmethods_size: 493368 bytes; nmethods_code_size: 336936 bytes}   ; -0.1%

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

PR Comment: https://git.openjdk.org/jdk/pull/24519#issuecomment-2787243486


More information about the hotspot-dev mailing list