RFR: 8139457: Array bases are aligned at HeapWord granularity

Roman Kennke rkennke at openjdk.org
Mon Nov 21 11:07:23 UTC 2022


On Thu, 10 Nov 2022 18:38:09 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

> RISC-V needs more work:
> 
> ```
> $  make images test TEST=runtime/FieldLayout
> #
> # A fatal error has been detected by the Java Runtime Environment:
> #
> #  Internal Error (0xe0000000), pid=454832, tid=454835
> #  stop: len is not a multiple of BytesPerWord
> #
> # JRE version: OpenJDK Runtime Environment (20.0) (fastdebug build 20-internal-adhoc.shade.shipilev-jdk)
> # Java VM: OpenJDK 64-Bit Server VM (fastdebug 20-internal-adhoc.shade.shipilev-jdk, mixed mode, tiered, compressed oops, g1 gc, linux-riscv64)
> # Problematic frame:
> # J 78 c1 java.util.Arrays.copyOfRange([BII)[B java.base at 20-internal (64 bytes) @ 0x0000003f84c8bf2c [0x0000003f84c8bdc0+0x000000000000016c]
> ```

Thanks for trying this. It may be enough to change the assert to check for BytesPerInt multiple instead. Something like the following:

`
diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
index 91833b662e2..107e4cfcedd 100644
--- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
+++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
@@ -4215,9 +4215,9 @@ void MacroAssembler::zero_memory(Register addr, Register len, Register tmp) {
 #ifdef ASSERT
   {
     Label L;
-    andi(t0, len, BytesPerWord - 1);
+    andi(t0, len, BytesPerInt - 1);
     beqz(t0, L);
-    stop("len is not a multiple of BytesPerWord");
+    stop("len is not a multiple of BytesPerInt");
     bind(L);
   }
 #endif // ASSERT
`

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

PR: https://git.openjdk.org/jdk/pull/11044


More information about the hotspot-dev mailing list