RFR: 8281453: New optimization: convert `~x` into `-1-x` when `~x` is used in an arithmetic expression [v12]

Quan Anh Mai qamai at openjdk.org
Thu Sep 29 14:40:26 UTC 2022


On Thu, 29 Sep 2022 02:53:20 GMT, Zhiqiang Zang <duke at openjdk.org> 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)`.
>> 
>> 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 and `~x` has only a single user. 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 redundant tests.

src/hotspot/share/opto/addnode.cpp line 891:

> 889:       if (is_used_in_only_arithmetic(this, T_INT)
> 890:           // used only once and contains arithmetic
> 891:           || (outcnt() == 1 && (in1->Opcode() == Op_AddI || in1->Opcode() == Op_SubI))) {

May I ask why do you need `outcnt() == 1` here, thanks.

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

PR: https://git.openjdk.org/jdk/pull/7376


More information about the hotspot-compiler-dev mailing list