RFR: 8367066: RISC-V: refine register selection in MacroAssembler:: decode_klass_not_null

Hamlin Li mli at openjdk.org
Mon Sep 8 12:52:10 UTC 2025


On Mon, 8 Sep 2025 11:30:46 GMT, Fei Yang <fyang at openjdk.org> wrote:

> Hi, seems we can further eliminate the use of `t0` replacing it with `tmp`. How about we go like this?
> 
> ```
> diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
> index 1436bc02113..89e615b1cbb 100644
> --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
> +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
> @@ -3402,6 +3402,8 @@ void MacroAssembler::decode_klass_not_null(Register r, Register tmp) {
> 
>  void MacroAssembler::decode_klass_not_null(Register dst, Register src, Register tmp) {
>    assert(UseCompressedClassPointers, "should only be used for compressed headers");
> +  assert_different_registers(src, tmp);
> +  assert_different_registers(dst, tmp);
> 
>    if (CompressedKlassPointers::base() == nullptr) {
>      if (CompressedKlassPointers::shift() != 0) {
> @@ -3421,7 +3423,7 @@ void MacroAssembler::decode_klass_not_null(Register dst, Register src, Register
>    mv(xbase, (uintptr_t)CompressedKlassPointers::base());
> 
>    if (CompressedKlassPointers::shift() != 0) {
> -    Register t = src == dst ? dst : t0;
> +    Register t = dst == xbase ? tmp : dst;
>      assert_different_registers(t, xbase);
>      shadd(dst, src, xbase, t, CompressedKlassPointers::shift());
>    } else {
> ```

I applied your suggested patch, and it trigger an assert at `assert_different_registers(dst, tmp);`,

assert(regs[i] != regs[j]) failed: regs[0] and regs[1] are both: t2

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

PR Comment: https://git.openjdk.org/jdk/pull/27138#issuecomment-3266152717


More information about the hotspot-dev mailing list