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