[9] RFR(S): 8145754: PhaseIdealLoop::is_scaled_iv_plus_offset() does not match AddI
Tobias Hartmann
tobias.hartmann at oracle.com
Mon Dec 21 09:04:34 UTC 2015
Thanks, Vladimir!
Best,
Tobias
On 18.12.2015 20:00, Vladimir Kozlov wrote:
> Looks good.
>
> Thanks,
> Vladimir
>
> On 12/18/15 6:52 AM, Tobias Hartmann wrote:
>> Hi,
>>
>> please review the following patch.
>>
>> https://bugs.openjdk.java.net/browse/JDK-8145754
>> http://cr.openjdk.java.net/~thartmann/8145754/webrev.00/
>>
>> PhaseIdealLoop::is_scaled_iv_plus_offset() returns false if the expression is an AddI node with the scaled iv as second input because is_scaled_iv() is only invoked for exp->in(1). We need to check exp->in(2) as well like we do for the SubI node (and also in SWPointer::scaled_iv_plus_offset()).
>>
>> Background:
>> I caught this bug with my prototype fix for JDK-6675699 while investigating a regression with the SPECjvm2008 mpeg benchmark. It turned out that with my fix I was hitting the LoopUnrollLimit for loops in some hot methods and therefore the loops were not completely unrolled/removed. Compared to the baseline version, some RC predicates were not emitted and therefore range checks in the loop body were not eliminated. As a result, the loop body node count was too high for unrolling. The RC predicates were not added because IdealLoopTree::is_range_check_if() uses is_scaled_iv_plus_offset() which fails. I think the input nodes of the AddI node are swapped with my fix because the node indices are slightly different and commute() (see addnode.cpp) sorts inputs according to their index:
>> // Otherwise, sort inputs (commutativity) to help value numbering.
>> if( in1->_idx > in2->_idx ) {
>> add->swap_edges(1, 2);
>> return true;
>> }
>>
>> I verified that this also happens without my fix for JDK-6675699 by adding
>> assert(!is_scaled_iv(exp->in(2), iv, p_scale), "Found input at position 2!");
>> and running JPRT. As expected, we hit the assert.
>>
>> Thanks,
>> Tobias
>>
More information about the hotspot-compiler-dev
mailing list