RFR: 8289996: Fix array range check hoisting for some scaled loop iv [v3]

Tobias Hartmann thartmann at openjdk.org
Mon Jul 25 12:55:04 UTC 2022


On Fri, 22 Jul 2022 03:57:22 GMT, Pengfei Li <pli at openjdk.org> wrote:

>> Recently we found some array range checks in loops are not hoisted by
>> C2's loop predication phase as expected. Below is a typical case.
>> 
>>   for (int i = 0; i < size; i++) {
>>     b[3 * i] = a[3 * i];
>>   }
>> 
>> Ideally, C2 can hoist the range check of an array access in loop if the
>> array index is a linear function of the loop's induction variable (iv).
>> Say, range check in `arr[exp]` can be hoisted if
>> 
>>   exp = k1 * iv + k2 + inv
>> 
>> where `k1` and `k2` are compile-time constants, and `inv` is an optional
>> loop invariant. But in above case, C2 igvn does some strength reduction
>> on the `MulINode` used to compute `3 * i`. It results in the linear index
>> expression not being recognized. So far we found 2 ideal transformations
>> that may affect linear expression recognition. They are
>> 
>> - `k * iv` --> `iv << m + iv << n` if k is the sum of 2 pow-of-2 values
>> - `k * iv` --> `iv << m - iv` if k+1 is a pow-of-2 value
>> 
>> To avoid range check hoisting and further optimizations being broken, we
>> have tried improving the linear recognition. But after some experiments,
>> we found complex and recursive pattern match does not always work well.
>> In this patch we propose to defer these 2 ideal transformations to the
>> phase of post loop igvn. In other words, these 2 strength reductions can
>> only be done after all loop optimizations are over.
>> 
>> Tested hotspot::hotspot_all_no_apps, jdk::tier1~3 and langtools::tier1.
>> We also tested the performance via JMH and see obvious improvement.
>> 
>> Benchmark                        Improvement
>> RangeCheckHoisting.ivScaled3          +21.2%
>> RangeCheckHoisting.ivScaled7           +6.6%
>
> Pengfei Li has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Address more comments

Looks good to me. I resubmitted testing and will report back once it passed.

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

Marked as reviewed by thartmann (Reviewer).

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


More information about the hotspot-compiler-dev mailing list