RFR: 8267239: C1: RangeCheckElimination for % operator

Yi Yang yyang at openjdk.java.net
Tue May 18 08:28:58 UTC 2021


% operator follows from this rule that the result of the remainder operation can be negative only if the dividend is negative, and can be positive only if the dividend is positive. Moreover, the magnitude of the result is always less than the magnitude of the divisor(See [LS 15.17.3](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.3)).
      
So if `y` is a constant integer and not equal to 0, then we can deduce the bound of remainder operation:
-  x % -y  ==> [0, y - 1] RCE
-  x % y   ==> [0, y - 1] RCE
-  -x % y  ==> [-y + 1, 0]
-  -x % -y ==> [-y + 1, 0]

Based on above rationale, we can apply RCE for the remainder operations whose dividend is constant integer and >= 0,  e.g.:


for(int i=0;i<1000;i++){
  int top5 = arr[i%5];  // Apply RCE if arr is a loop invariant
  ....
}


For more detailed RCE results, please check out the attachment on JBS, it was generated by ArithmeticRemRCE with additional flags -XX:+TraceRangeCheckElimination -XX:+PrintIR.

Testing:
- test/hotspot/jtreg/compiler/c1/(slowdebug)

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

Commit messages:
 - rce_opt

Changes: https://git.openjdk.java.net/jdk/pull/4083/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4083&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8267239
  Stats: 105 lines in 3 files changed: 94 ins; 10 del; 1 mod
  Patch: https://git.openjdk.java.net/jdk/pull/4083.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/4083/head:pull/4083

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


More information about the hotspot-compiler-dev mailing list