RFR: 8281453: New optimization: convert "c-(~x)" into "x+(c+1)" and "~(c-x)" into "x+(-c-1)"

Quan Anh Mai duke at openjdk.java.net
Wed Feb 9 16:16:09 UTC 2022


On Tue, 8 Feb 2022 05:51:37 GMT, Zhiqiang Zang <duke at openjdk.java.net> wrote:

> 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)`.
> 
> The results of the microbenchmark are as follows:
> 
> Baseline:                                                                                                                                         
> Benchmark                        Mode  Cnt  Score   Error  Units
> SubIdealCMinusNotX.baselineInt   avgt   60  0.504 ± 0.011  ns/op
> SubIdealCMinusNotX.baselineLong  avgt   60  0.484 ± 0.004  ns/op
> SubIdealCMinusNotX.testInt1      avgt   60  0.779 ± 0.004  ns/op
> SubIdealCMinusNotX.testInt2      avgt   60  0.896 ± 0.004  ns/op
> SubIdealCMinusNotX.testLong1     avgt   60  0.722 ± 0.004  ns/op
> SubIdealCMinusNotX.testLong2     avgt   60  0.720 ± 0.005  ns/op
> 
> Patch:
> Benchmark                        Mode  Cnt  Score   Error  Units
> SubIdealCMinusNotX.baselineInt   avgt   60  0.487 ± 0.009  ns/op
> SubIdealCMinusNotX.baselineLong  avgt   60  0.486 ± 0.009  ns/op
> SubIdealCMinusNotX.testInt1      avgt   60  0.372 ± 0.010  ns/op
> SubIdealCMinusNotX.testInt2      avgt   60  0.365 ± 0.003  ns/op
> SubIdealCMinusNotX.testLong1     avgt   60  0.369 ± 0.004  ns/op
> SubIdealCMinusNotX.testLong2     avgt   60  0.399 ± 0.016  ns/op

Since `~x == -1 - x` and these 2 operations' costs are essentially the same. It would be much easier if you just check whether the not result is used in an arithmetic operation and transform the former to the latter. The reverse is also true, if you find a `-1 - x` being fed into a bitwise just transform it to a `~x` then.
Thanks.

-------------

PR: https://git.openjdk.java.net/jdk/pull/7376


More information about the hotspot-compiler-dev mailing list