RFR: 8305895: Implement JEP 450: Compact Object Headers (Experimental) [v46]
Roman Kennke
rkennke at openjdk.org
Mon Oct 21 18:04:53 UTC 2024
On Mon, 21 Oct 2024 13:53:58 GMT, Roman Kennke <rkennke at openjdk.org> wrote:
>> Roman Kennke has updated the pull request incrementally with one additional commit since the last revision:
>>
>> Compact header riscv (#3)
>>
>> Implement compact headers on RISCV
>> ---------
>>
>> Co-authored-by: hamlin <hamlin at rivosinc.com>
>
>> I've managed to reproduce the ECoreIndexOf crash locally by running with -XX:+UseSerialGC -XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders. The crash happens on line 773 when reading past the needle.
>>
>> ```
>> │ 762 __ movq(index, needle_len);
>> │
>> │ 763 __ andq(index, 0xf); // nLen % 16
>> │ 764 __ movq(offset, 0x10);
>> │ 765 __ subq(offset, index); // 16 - (nLen % 16)
>> │ 766 __ movq(index, offset);
>> │ 767 __ shlq(offset, 1); // * 2
>> │ 768 __ negq(index); // -(16 - (nLen % 16))
>> │
>> │ 769 __ xorq(wr_index, wr_index);
>> │ 770
>> │ 771 __ bind(L_top);
>> │ 772 // load needle and expand
>> │ 773 __ vpmovzxbw(xmm0, Address(needle, index, Address::times_1), Assembler::AVX_256bit);
>> ```
>>
>> We're reading this address:
>>
>> ```
>> (SEGV_MAPERR), si_addr: 0x00000007cffffffe
>> ```
>>
>> which is just before the start of the heap:
>>
>> ```
>> Heap address: 0x00000007d0000000, size: 768 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
>> ```
>>
>> When this crashed I had:
>>
>> ```
>> needle: 0x00000007d000000c
>> needle_len = 0x12
>> index = 0xfffffffffffffffe
>> ```
>>
>> There has been previous fix to not read past the haystack: Fix header < 16 bytes in indexOf intrinsic, by @sviswa7 [f65ef5d](https://github.com/openjdk/jdk/commit/f65ef5dc325212155a50a2fc3a7f4aad18b8d9d0)
>>
>> maybe we need something similar for the needle.
>
> @sviswa7 @vpaprotsk could you have a look? If we can have a reasonable fix for this soon, we could ship it in this PR, otherwise I'd defer it to a follow-up issue and disable indexOf intrinsic when running with +UseCompactObjectHeaders.
> @rkennke Could you post the full command you used please? And perhaps also the seed that gets printed.. having trouble getting it to fail..
>
> So far I added a few options and perrmitations of: `./build/linux-x86_64-server-fastdebug/images/jdk/bin/java -Xcomp -XX:-TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:+EnableX86ECoreOpts -XX:+UseSerialGC -XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders test/jdk/java/lang/StringBuffer/ECoreIndexOf.java` and lo luck.. IndexOf.java test checks "all interesting" lengths of haystack and needle and can't get it to fail either.
I could reproduce on 3rd try with a fastdebug build with:
make test TEST=java/lang/StringBuffer/ECoreIndexOf.java TEST_VM_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders -XX:+UseSerialGC"
It prints:
Seed set to 636754923980405411
It probably depends on GC operation: It would only fail when the array happens to be the very first object in the heap. The relevant GC/heap configs would be:
InitialHeapSize = 805306368
MaxHeapSize = 805306368
MaxNewSize = 268435456
So you should probably also add `-Xmx805306368 -Xms805306368 -Xmn268435456`
-------------
PR Comment: https://git.openjdk.org/jdk/pull/20677#issuecomment-2427375886
More information about the hotspot-gc-dev
mailing list