RFR: 8286104: use aggressive liveness for unstable_if traps [v15]
Xin Liu
xliu at openjdk.org
Wed Jun 29 05:23:40 UTC 2022
> I found that some phi nodes are useful because its uses are uncommon_trap nodes. In worse case, it would hinder boxing object eliminating and scalar replacement. Test.java of JDK-8286104 reveals this issue. This patch allows c2 parser to collect liveness based on next bci for unstable_if traps. In most cases, next bci is closer to exits, so live locals are diminishing. It helps to reduce the number of inputs of unstable_if traps.
>
> This is not a REDO of Optimization of Box nodes in uncommon_trap(JDK-8261137). Two patches are orthogonal. I adapt test from [TestEliminateBoxInDebugInfo.java](https://github.com/openjdk/jdk/pull/2401/files#diff-49b2e38825aa4c28ca196bdc70c3cbecc2e835c2899f4f393527df4796b177ea), so part of credit goes to the original author. I found that Scalar replacement can take care of the object `Integer ii = Integer.valueOf(value)` in original test even it can't be removed by later inliner. I tweak the profiling data of Integer.valueOf() to hinder scalar replacement.
>
> This patch can cover the problem discovered by JDK-8261137. I ran the microbench and got 9x speedup on x86_64. It's almost same as JDK-8261137. Besides runtime, the codecache utilization reduces from 1648 bytes to 1192 bytes, or 27.6%
>
> Before:
>
> Benchmark Mode Cnt Score Error Units
> MyBenchmark.testMethod avgt 10 32.776 ± 0.075 us/op
>
> Compiled method (c2) 281 636 4 MyBenchmark::testMethod (50 bytes)
> total in heap [0x00007fa1e49ab510,0x00007fa1e49abb80] = 1648
> relocation [0x00007fa1e49ab670,0x00007fa1e49ab6b0] = 64
> main code [0x00007fa1e49ab6c0,0x00007fa1e49ab940] = 640
> stub code [0x00007fa1e49ab940,0x00007fa1e49ab968] = 40
> oops [0x00007fa1e49ab968,0x00007fa1e49ab978] = 16
> metadata [0x00007fa1e49ab978,0x00007fa1e49ab990] = 24
> scopes data [0x00007fa1e49ab990,0x00007fa1e49aba60] = 208
> scopes pcs [0x00007fa1e49aba60,0x00007fa1e49abb30] = 208
> dependencies [0x00007fa1e49abb30,0x00007fa1e49abb38] = 8
> handler table [0x00007fa1e49abb38,0x00007fa1e49abb68] = 48
> nul chk table [0x00007fa1e49abb68,0x00007fa1e49abb80] = 24
>
> After:
>
> Benchmark Mode Cnt Score Error Units
> MyBenchmark.testMethod avgt 10 3.656 ± 0.006 us/op
>
> Compiled method (c2) 288 633 4 MyBenchmark::testMethod (50 bytes)
> total in heap [0x00007f35189ab010,0x00007f35189ab4b8] = 1192
> relocation [0x00007f35189ab170,0x00007f35189ab1a0] = 48
> main code [0x00007f35189ab1a0,0x00007f35189ab360] = 448
> stub code [0x00007f35189ab360,0x00007f35189ab388] = 40
> oops [0x00007f35189ab388,0x00007f35189ab390] = 8
> metadata [0x00007f35189ab390,0x00007f35189ab398] = 8
> scopes data [0x00007f35189ab398,0x00007f35189ab408] = 112
> scopes pcs [0x00007f35189ab408,0x00007f35189ab488] = 128
> dependencies [0x00007f35189ab488,0x00007f35189ab490] = 8
> handler table [0x00007f35189ab490,0x00007f35189ab4a8] = 24
> nul chk table [0x00007f35189ab4a8,0x00007f35189ab4b8] = 16
> ```
>
> Testing
> I ran tier1 test with and without `-XX:+DeoptimizeALot`. No regression has been found yet.
Xin Liu has updated the pull request incrementally with one additional commit since the last revision:
restore the option OptimizeUnstableIf to diagnostic.
also update commments.
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/8545/files
- new: https://git.openjdk.org/jdk/pull/8545/files/49bcc410..ed20a826
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=8545&range=14
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=8545&range=13-14
Stats: 15 lines in 4 files changed: 4 ins; 6 del; 5 mod
Patch: https://git.openjdk.org/jdk/pull/8545.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/8545/head:pull/8545
PR: https://git.openjdk.org/jdk/pull/8545
More information about the hotspot-compiler-dev
mailing list