RFR: 8281453: New optimization: convert `~x` into `-1-x` when `~x` is used in an arithmetic expression [v15]
Zhiqiang Zang
duke at openjdk.org
Thu Sep 29 20:52:41 UTC 2022
> Similar to `(~x)+c` -> `(c-1)-x` and `~(x+c)` -> `(-c-1)-x` in #6858, we can also introduce similar optimizations for subtraction, `c-(~x)` -> `x+(c+1)` and `~(c-x)` -> `x+(-c-1)`.
>
> To generalize, I convert `~x` into `-1-x` when `~x` is used only in arithmetic expression. For example, `c-(~x)` will be converted into `c-(-1-x)` which will match other pattern and will be transformed again in next iteration and finally become `x+(c+1)`.
>
> Also the conversion from `~x` into `-1-x` happens when `x` is an arithmetic expression itself. For example, `~(x+c)` will be transformed into `-1-(x+c)` and eventually `(-c-1)-x`.
>
> The results of the microbenchmark are as follows:
>
> Baseline:
> Benchmark Mode Cnt Score Error Units
> NotOpTransformation.baselineInt avgt 60 0.448 ± 0.002 ns/op
> NotOpTransformation.baselineLong avgt 60 0.448 ± 0.002 ns/op
> NotOpTransformation.testInt1 avgt 60 0.615 ± 0.003 ns/op
> NotOpTransformation.testInt2 avgt 60 0.838 ± 0.004 ns/op
> NotOpTransformation.testLong1 avgt 60 0.671 ± 0.003 ns/op
> NotOpTransformation.testLong2 avgt 60 0.670 ± 0.003 ns/op
>
> Patch:
> Benchmark Mode Cnt Score Error Units
> NotOpTransformation.baselineInt avgt 60 0.451 ± 0.003 ns/op
> NotOpTransformation.baselineLong avgt 60 0.447 ± 0.002 ns/op
> NotOpTransformation.testInt1 avgt 60 0.334 ± 0.002 ns/op
> NotOpTransformation.testInt2 avgt 60 0.334 ± 0.002 ns/op
> NotOpTransformation.testLong1 avgt 60 0.334 ± 0.002 ns/op
> NotOpTransformation.testLong2 avgt 60 0.335 ± 0.002 ns/op
Zhiqiang Zang has updated the pull request incrementally with one additional commit since the last revision:
remove one use check for long as well.
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/7376/files
- new: https://git.openjdk.org/jdk/pull/7376/files/d7183474..91407ddf
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=7376&range=14
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=7376&range=13-14
Stats: 12 lines in 2 files changed: 9 ins; 0 del; 3 mod
Patch: https://git.openjdk.org/jdk/pull/7376.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/7376/head:pull/7376
PR: https://git.openjdk.org/jdk/pull/7376
More information about the hotspot-compiler-dev
mailing list