RFR: 8250808: Re-associate loop invariants with other associative operations

Xiaohong Gong Xiaohong.Gong at arm.com
Thu Aug 6 02:43:24 UTC 2020


Hi,

Could you please help to review this simple patch?  It adds the re-association
for loop invariants with other associative operations in the C2 compiler.

JBS: https://bugs.openjdk.java.net/browse/JDK-8250808
Webrev: http://cr.openjdk.java.net/~xgong/rfr/8250808/webrev.00/

C2 has re-association of loop invariants. However, the current implementation
only supports the re-associations for add and subtract with 32-bits integer type.
For other associative expressions like multiplication and the logic operations,
the re-association is also applicable, and also for the operations with long type.

This patch adds the missing re-associations for other associative operations
together with the support for long type.

With this patch, the following expressions:
  (x * inv1) * inv2
  (x | inv1) | inv2
  (x & inv1) & inv2
  (x ^ inv1) ^ inv2         ; inv1, inv2 are invariants

can be re-associated to:
  x * (inv1 * inv2)         ; "inv1 * inv2" can be hoisted
  x | (inv1 | inv2)         ; "inv1 | inv2" can be hoisted
  x & (inv1 & inv2)       ; "inv1 & inv2" can be hoisted
  x ^ (inv1 ^ inv2)         ; "inv1 ^ inv2" can be hoisted

Performance:
Here is the micro benchmark:
http://cr.openjdk.java.net/~xgong/rfr/8250808/LoopInvariant.java

And the results on X86_64:
Before:
Benchmark                           (length)  Mode Cnt    Score        Error      Units
loopInvariantAddLong          1024      avgt   15   988.142    ±  0.110   ns/op
loopInvariantAndInt              1024      avgt   15   843.850    ±  0.522   ns/op
loopInvariantAndLong          1024      avgt   15   990.551    ± 10.458  ns/op
loopInvariantMulInt              1024      avgt   15  1209.003   ±  0.247   ns/op
loopInvariantMulLong          1024      avgt   15  1213.923   ±  0.438    ns/op
loopInvariantOrInt                1024      avgt   15   843.908    ±  0.132    ns/op
loopInvariantOrLong             1024      avgt   15   990.710   ± 10.484  ns/op
loopInvariantSubLong           1024      avgt   15   988.170   ±  0.159    ns/op
loopInvariantXorInt               1024      avgt   15   806.949   ±  7.860    ns/op
loopInvariantXorLong           1024      avgt   15   990.963   ±  8.321    ns/op

After:
Benchmark                           (length)  Mode  Cnt    Score       Error    Units
loopInvariantAddLong          1024      avgt   15   842.854   ±  9.036  ns/op
loopInvariantAndInt              1024      avgt   15   698.097   ±  0.916  ns/op
loopInvariantAndLong          1024      avgt   15   841.120   ±  0.118  ns/op
loopInvariantMulInt              1024      avgt   15   691.000   ±  7.696  ns/op
loopInvariantMulLong          1024      avgt   15   846.907   ±  0.189  ns/op
loopInvariantOrInt                1024      avgt   15   698.423   ±  4.969  ns/op
loopInvariantOrLong            1024      avgt   15   843.465   ± 10.196  ns/op
loopInvariantSubLong          1024      avgt   15   841.314   ±  2.906  ns/op
loopInvariantXorInt              1024      avgt   15   652.529   ±  0.556  ns/op
loopInvariantXorLong          1024      avgt   15   841.860   ±  2.491  ns/op

Results on AArch64:
Before:
Benchmark                          (length)  Mode  Cnt    Score        Error     Units
loopInvariantAddLong         1024      avgt    15   514.437    ± 0.351  ns/op
loopInvariantAndInt            1024      avgt     15   435.301    ± 0.415  ns/op
loopInvariantAndLong        1024      avgt     15   572.437    ± 0.057  ns/op
loopInvariantMulInt            1024      avgt     15  1154.544   ± 0.030  ns/op
loopInvariantMulLong        1024      avgt     15  1188.109   ± 0.299  ns/op
loopInvariantOrInt              1024      avgt     15   435.605    ± 0.977  ns/op
loopInvariantOrLong          1024      avgt     15   572.475     ± 0.093  ns/op
loopInvariantSubLong        1024      avgt     15   514.340    ± 0.154  ns/op
loopInvariantXorInt            1024      avgt     15   426.186    ± 0.105  ns/op
loopInvariantXorLong        1024      avgt     15   572.505    ± 0.259  ns/op

After:
Benchmark                        (length)  Mode  Cnt    Score       Error    Units
loopInvariantAddLong       1024     avgt     15   508.179   ± 0.108  ns/op
loopInvariantAndInt           1024    avgt     15   394.706   ± 0.199  ns/op
loopInvariantAndLong       1024    avgt     15   434.443   ± 0.247  ns/op
loopInvariantMulInt           1024    avgt     15   762.477   ± 0.079  ns/op
loopInvariantMulLong       1024    avgt     15   775.975   ± 0.159  ns/op
loopInvariantOrInt             1024    avgt     15   394.657   ± 0.156  ns/op
loopInvariantOrLong         1024    avgt     15   434.428   ± 0.282  ns/op
loopInvariantSubLong       1024    avgt     15   507.475   ± 0.151  ns/op
loopInvariantXorInt           1024    avgt     15   396.000   ± 0.011  ns/op
loopInvariantXorLong       1024    avgt     15   434.255   ± 0.099  ns/op

Tests:
Tested jtreg hotspot::hotspot_all_no_apps,jdk::jdk_core,langtools::tier1
and jcstress:tests-custom, and all tests pass without new failure.

Thanks,
Xiaohong Gong



More information about the hotspot-compiler-dev mailing list