Integrated: 8267239: C1: RangeCheckElimination for % operator if divisor is IntConstant
Yi Yang
yyang at openjdk.java.net
Wed May 19 09:08:48 UTC 2021
On Tue, 18 May 2021 08:20:09 GMT, Yi Yang <yyang at openjdk.org> wrote:
> % 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)
This pull request has now been integrated.
Changeset: 0cf7e578
Author: Yi Yang <yyang at openjdk.org>
Committer: Tobias Hartmann <thartmann at openjdk.org>
URL: https://git.openjdk.java.net/jdk/commit/0cf7e5784b4ddb70c8674a814527d3e0c315a1ec
Stats: 109 lines in 3 files changed: 99 ins; 10 del; 0 mod
8267239: C1: RangeCheckElimination for % operator if divisor is IntConstant
Reviewed-by: thartmann, neliasso
-------------
PR: https://git.openjdk.java.net/jdk/pull/4083
More information about the hotspot-compiler-dev
mailing list