RFR: 8315843: C1: Use MDO offsets as int consts instead of intptr consts
Quan Anh Mai
qamai at openjdk.org
Thu Sep 7 09:15:41 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`
How about hiding `Assembler::mov64` in `MacroAssembler` with a method that conditionally uses equivalent instructions (`movl`, `movq`) if feasible. I remember there is some places in C2 where we use `mov64(r, -1)` which may be benefit from this, too.
Thanks.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/15612#issuecomment-1709785022
More information about the hotspot-compiler-dev
mailing list