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

Vladimir Kozlov kvn at openjdk.org
Fri Sep 16 22:05:46 UTC 2022


On Wed, 9 Feb 2022 16:12:30 GMT, Quan Anh Mai <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 in an 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)`.
>> 
>> The results of the microbenchmark are as follows:
>> 
>> Baseline:                                                                                                                                         
>> Benchmark                         Mode  Cnt  Score    Error  Units
>> NotOpTransformation.baselineInt   avgt   60  0.439 ±  0.001  ns/op
>> NotOpTransformation.baselineLong  avgt   60  0.439 ±  0.001  ns/op
>> NotOpTransformation.testInt1      avgt   60  0.603 ±  0.001  ns/op
>> NotOpTransformation.testInt2      avgt   60  0.603 ±  0.001  ns/op
>> NotOpTransformation.testLong1     avgt   60  0.658 ±  0.001  ns/op
>> NotOpTransformation.testLong2     avgt   60  0.658 ±  0.001  ns/op
>> 
>> Patch:
>> Benchmark                         Mode  Cnt  Score    Error  Units
>> NotOpTransformation.baselineInt   avgt   60  0.439 ±  0.001  ns/op
>> NotOpTransformation.baselineLong  avgt   60  0.439 ±  0.001  ns/op
>> NotOpTransformation.testInt1      avgt   60  0.329 ±  0.001  ns/op
>> NotOpTransformation.testInt2      avgt   60  0.329 ±  0.001  ns/op
>> NotOpTransformation.testLong1     avgt   60  0.329 ±  0.001  ns/op
>> NotOpTransformation.testLong2     avgt   60  0.329 ±  0.001  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.

@merykitty can review it since he gave initial comment.

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

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


More information about the hotspot-compiler-dev mailing list