RFR: 8315843: C1: Use MDO offsets as int consts instead of intptr consts

Igor Veresov iveresov at openjdk.org
Thu Sep 7 09:41:42 UTC 2023


On Thu, 7 Sep 2023 08:54:57 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

> Noticed this when looking at C1 profiling code. We use MDO offsets as `intptrConst`, despite them being very small. This leads to loads with `movabs` with large immediates on x86. We can instead just load them as `intConst`-s. This affects tier3 profiling code only. 
> 
> Sample branch profiling hunk from C1 tier3 on x86_64:
> 
> 
> Before:
>    0x00007f269065ed02:   test   %edx,%edx
>    0x00007f269065ed04:   movabs $0x7f260a4ddd68,%rax  ;   {metadata(method data for {method} …
>    0x00007f269065ed0e:   movabs $0x138,%rsi
>  ╭ 0x00007f269065ed18:   je     0x00007f269065ed24
>  │ 0x00007f269065ed1a:   movabs $0x148,%rsi
>  ↘ 0x00007f269065ed24:   mov    (%rax,%rsi,1),%rdi
>    0x00007f269065ed28:   lea    0x1(%rdi),%rdi
>    0x00007f269065ed2c:   mov    %rdi,(%rax,%rsi,1)
>    0x00007f269065ed30:   je     0x00007f269065ed4e     
> 
> After:
>    0x00007f1370dcd782:   test   %edx,%edx
>    0x00007f1370dcd784:   movabs $0x7f12f64ddd68,%rax   ;   {metadata(method data for {method} …
>    0x00007f1370dcd78e:   mov    $0x138,%esi
>  ╭ 0x00007f1370dcd793:   je     0x00007f1370dcd79a        
>  │ 0x00007f1370dcd795:   mov    $0x148,%esi
>  ↘ 0x00007f1370dcd79a:   mov    (%rax,%rsi,1),%rdi        
>    0x00007f1370dcd79e:   lea    0x1(%rdi),%rdi
>    0x00007f1370dcd7a2:   mov    %rdi,(%rax,%rsi,1)       
>    0x00007f1370dcd7a6:   je     0x00007f1370dcd7c4 
> 
> 
> In the hunk above, this saves about 8 bytes. This leads to observable code space savings on larger tests, e.g. on `-Xcomp -XX:TieredStopAtLevel=... HelloWorld`.
> 
> 
> # Before
> tier1: nmethod code size         :   426448 bytes
> tier2: nmethod code size         :   463008 bytes
> tier3: nmethod code size         :   910656 bytes
> 
> # After
> tier1: nmethod code size         :   426448 bytes
> tier2: nmethod code size         :   463008 bytes
> tier3: nmethod code size         :   892448 bytes (-2.0%)
> 
> 
> Additional testing:
>  - [ ] Linux x86_64 fastdebug `tier1 tier2 tier3`
>  - [ ] Linux AArch64 fastdebug `tier1 tier2 tier3`

Marked as reviewed by iveresov (Reviewer).

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

PR Review: https://git.openjdk.org/jdk/pull/15612#pullrequestreview-1615024502


More information about the hotspot-compiler-dev mailing list