RFR: 8328404: RISC-V: Fix potential crash in C2_MacroAssembler::arrays_equals
Gui Cao
gcao at openjdk.org
Tue Mar 19 04:00:15 UTC 2024
Hi, The current behavior of C2_MacroAssembler::arrays_equals always load longword before comparison.
When array[0] is aligned to 32-bit (especially after JDK-8139457 which tries to relax alignment
of array elements), the last longword load will exceed the array limit and may touch the next
word beyond object layout in heap memory. So this should bear a similar problem as JDK-8328138.
Proposed fix changes this behavior and aligns with handling in C2_MacroAssembler::string_equals,
which will check the number of remaining array elements before loading the next longword.
No obvious changes witnessed from the JMH numbers or benchmarks like SPECjbb2015.
Patch also removed the AvoidUnalignedAccesses check in C2_MacroAssembler::string_equals as we
don't see extra performance gain when setting AvoidUnalignedAccesses to false when testing the
JMH tests or benchmarks like SPECjbb2015 on three popular RISC-V hardware platforms. We can
consider adding it back if it turns out to be usefull on future new hardwares.
### Correctness test:
- [x] Run tier1-3, hotspot:tier4 tests on LicheePi 4A (release)
- [x] Run tier1-3, hotspot:tier4 tests on SOPHON SG2042 (release)
### JMH test:
#### 1. test/micro/org/openjdk/bench/java/util/ArraysEquals.java
1. SiFive unmatched
Before:
Benchmark Mode Cnt Score Error Units
ArraysEquals.testByteFalseBeginning avgt 12 37.804 ± 7.292 ns/op
ArraysEquals.testByteFalseEnd avgt 12 77.972 ± 3.208 ns/op
ArraysEquals.testByteFalseMid avgt 12 54.427 ± 6.436 ns/op
ArraysEquals.testByteTrue avgt 12 75.121 ± 5.172 ns/op
ArraysEquals.testCharFalseBeginning avgt 12 42.486 ± 6.526 ns/op
ArraysEquals.testCharFalseEnd avgt 12 122.208 ± 2.533 ns/op
ArraysEquals.testCharFalseMid avgt 12 83.891 ± 3.680 ns/op
ArraysEquals.testCharTrue avgt 12 122.096 ± 5.519 ns/op
After:
Benchmark Mode Cnt Score Error Units
ArraysEquals.testByteFalseBeginning avgt 12 32.638 ± 7.279 ns/op
ArraysEquals.testByteFalseEnd avgt 12 73.013 ± 8.081 ns/op
ArraysEquals.testByteFalseMid avgt 12 43.619 ± 6.104 ns/op
ArraysEquals.testByteTrue avgt 12 83.044 ± 8.207 ns/op
ArraysEquals.testCharFalseBeginning avgt 12 39.154 ± 5.233 ns/op
ArraysEquals.testCharFalseEnd avgt 12 122.072 ± 7.784 ns/op
ArraysEquals.testCharFalseMid avgt 12 67.831 ± 9.218 ns/op
ArraysEquals.testCharTrue avgt 12 129.873 ± 7.910 ns/op
2. LicheePi 4A
Before:
Benchmark Mode Cnt Score Error Units
ArraysEquals.testByteFalseBeginning avgt 12 24.198 ± 0.361 ns/op
ArraysEquals.testByteFalseEnd avgt 12 35.890 ± 4.388 ns/op
ArraysEquals.testByteFalseMid avgt 12 27.881 ± 0.828 ns/op
ArraysEquals.testByteTrue avgt 12 32.596 ± 1.529 ns/op
ArraysEquals.testCharFalseBeginning avgt 12 27.159 ± 1.878 ns/op
ArraysEquals.testCharFalseEnd avgt 12 66.668 ± 0.476 ns/op
ArraysEquals.testCharFalseMid avgt 12 32.748 ± 0.029 ns/op
ArraysEquals.testCharTrue avgt 12 66.951 ± 0.620 ns/op
After:
Benchmark Mode Cnt Score Error Units
ArraysEquals.testByteFalseBeginning avgt 12 22.394 ± 0.073 ns/op
ArraysEquals.testByteFalseEnd avgt 12 31.721 ± 0.052 ns/op
ArraysEquals.testByteFalseMid avgt 12 26.455 ± 0.027 ns/op
ArraysEquals.testByteTrue avgt 12 31.941 ± 0.040 ns/op
ArraysEquals.testCharFalseBeginning avgt 12 23.991 ± 0.031 ns/op
ArraysEquals.testCharFalseEnd avgt 12 53.336 ± 0.082 ns/op
ArraysEquals.testCharFalseMid avgt 12 31.744 ± 0.060 ns/op
ArraysEquals.testCharTrue avgt 12 60.493 ± 0.760 ns/op
3. SOPHON SG2042
Before:
Benchmark Mode Cnt Score Error Units
ArraysEquals.testByteFalseBeginning avgt 12 22.569 ± 0.025 ns/op
ArraysEquals.testByteFalseEnd avgt 12 29.629 ± 0.182 ns/op
ArraysEquals.testByteFalseMid avgt 12 25.582 ± 0.024 ns/op
ArraysEquals.testByteTrue avgt 12 29.587 ± 0.025 ns/op
ArraysEquals.testCharFalseBeginning avgt 12 23.609 ± 0.181 ns/op
ArraysEquals.testCharFalseEnd avgt 12 62.853 ± 0.247 ns/op
ArraysEquals.testCharFalseMid avgt 12 30.623 ± 0.185 ns/op
ArraysEquals.testCharTrue avgt 12 61.622 ± 0.856 ns/op
After:
Benchmark Mode Cnt Score Error Units
ArraysEquals.testByteFalseBeginning avgt 12 20.569 ± 0.018 ns/op
ArraysEquals.testByteFalseEnd avgt 12 29.646 ± 0.183 ns/op
ArraysEquals.testByteFalseMid avgt 12 24.832 ± 0.265 ns/op
ArraysEquals.testByteTrue avgt 12 29.682 ± 0.265 ns/op
ArraysEquals.testCharFalseBeginning avgt 12 22.663 ± 0.335 ns/op
ArraysEquals.testCharFalseEnd avgt 12 53.716 ± 0.197 ns/op
ArraysEquals.testCharFalseMid avgt 12 29.585 ± 0.021 ns/op
ArraysEquals.testCharTrue avgt 12 59.231 ± 0.213 ns/op
#### test/micro/org/openjdk/bench/java/lang/StringEquals.java
1. Sifive unmatched
Before:
Benchmark Mode Cnt Score Error Units
StringEquals.almostEqual avgt 15 40.143 ± 3.819 ns/op
StringEquals.almostEqualUTF16 avgt 15 40.154 ± 3.903 ns/op
StringEquals.different avgt 15 29.653 ± 4.452 ns/op
StringEquals.differentCoders avgt 15 19.452 ± 4.964 ns/op
StringEquals.equal avgt 15 41.975 ± 3.997 ns/op
StringEquals.equalsUTF16 avgt 15 43.959 ± 2.417 ns/op
After:
Benchmark Mode Cnt Score Error Units
StringEquals.almostEqual avgt 15 40.542 ± 4.384 ns/op
StringEquals.almostEqualUTF16 avgt 15 40.140 ± 4.947 ns/op
StringEquals.different avgt 15 24.935 ± 4.487 ns/op
StringEquals.differentCoders avgt 15 20.186 ± 5.149 ns/op
StringEquals.equal avgt 15 38.246 ± 4.405 ns/op
StringEquals.equalsUTF16 avgt 15 36.506 ± 4.278 ns/op
2. LicheePi 4A
Before:
Benchmark Mode Cnt Score Error Units
StringEquals.almostEqual avgt 15 26.797 ± 0.070 ns/op
StringEquals.almostEqualUTF16 avgt 15 26.796 ± 0.039 ns/op
StringEquals.different avgt 15 23.521 ± 0.050 ns/op
StringEquals.differentCoders avgt 15 20.237 ± 0.043 ns/op
StringEquals.equal avgt 15 31.150 ± 0.512 ns/op
StringEquals.equalsUTF16 avgt 15 30.699 ± 0.133 ns/op
After
Benchmark Mode Cnt Score Error Units
StringEquals.almostEqual avgt 15 26.433 ± 0.065 ns/op
StringEquals.almostEqualUTF16 avgt 15 26.580 ± 0.299 ns/op
StringEquals.different avgt 15 23.501 ± 0.042 ns/op
StringEquals.differentCoders avgt 15 20.243 ± 0.043 ns/op
StringEquals.equal avgt 15 31.944 ± 0.816 ns/op
StringEquals.equalsUTF16 avgt 15 32.699 ± 0.466 ns/op
3. SOPHON SG2042
Before:
Benchmark Mode Cnt Score Error Units
StringEquals.almostEqual avgt 15 25.279 ± 0.260 ns/op
StringEquals.almostEqualUTF16 avgt 15 25.623 ± 0.060 ns/op
StringEquals.different avgt 15 22.267 ± 0.510 ns/op
StringEquals.differentCoders avgt 15 19.072 ± 0.029 ns/op
StringEquals.equal avgt 15 30.157 ± 0.292 ns/op
StringEquals.equalsUTF16 avgt 15 30.152 ± 0.293 ns/op
After:
Benchmark Mode Cnt Score Error Units
StringEquals.almostEqual avgt 15 24.956 ± 0.261 ns/op
StringEquals.almostEqualUTF16 avgt 15 25.288 ± 0.074 ns/op
StringEquals.different avgt 15 22.588 ± 0.050 ns/op
StringEquals.differentCoders avgt 15 19.109 ± 0.150 ns/op
StringEquals.equal avgt 15 26.108 ± 0.047 ns/op
StringEquals.equalsUTF16 avgt 15 25.940 ± 0.263 ns/op
-------------
Commit messages:
- 8328404: RISC-V: Fix potential crash in C2_MacroAssembler::arrays_equals
Changes: https://git.openjdk.org/jdk/pull/18370/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=18370&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8328404
Stats: 159 lines in 3 files changed: 42 ins; 59 del; 58 mod
Patch: https://git.openjdk.org/jdk/pull/18370.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/18370/head:pull/18370
PR: https://git.openjdk.org/jdk/pull/18370
More information about the hotspot-compiler-dev
mailing list