[9] RFR(S): 8043284: Optimize signed integer comparison

Tobias Hartmann tobias.hartmann at oracle.com
Tue Aug 5 07:55:25 UTC 2014


Hi Vladimir,

thanks for the review.

> The second condition is still in webrev:
>
> >> sub_tr1 == TypeInt::CC_GT && sub_tr2 == TypeInt::CC_LT

Sorry, I forgot to update the webrev after removing the condition.

As Rickard suggested, I moved the code into a separate method called 
'fold_cmpI'. If you think that the method has too many arguments, we 
could reduce them to '(PhaseGVN* phase, Node* cmp)' and re-compute the 
other values locally.

New webrev: http://cr.openjdk.java.net/~thartmann/8043284/webrev.02/

Thanks,
Tobias

>
> Thanks,
> Vladimir
>
> On 8/4/14 7:41 AM, Tobias Hartmann wrote:
>> Hi Vladimir,
>>
>> thanks for the review. Please see comments inline.
>>
>> On 31.07.2014 18:43, Vladimir Kozlov wrote:
>>> You missed cop == Op_CmpI check.
>>
>> Thanks, I added the check.
>>
>>> And add checks for r0 and r1 != TypeInt::INT (no bottom type) in 
>>> addition to != NULL.
>>
>> Done.
>>
>>> You don't need t2 because there is already cmp2_type. Check 
>>> cmp2_type for != TypeInt::INT too.
>>
>> Done.
>>
>>> Use as_Sub() (which is cast) instead of isa_Sub() because there is 
>>> is_Sub() check at the beginning already.
>>
>> Done.
>>
>>> I don't see how second condition could happen because tr1 < tr2:
>>>
>>> sub_tr1 == TypeInt::CC_GT && sub_tr2 == TypeInt::CC_LT
>>
>> Of course, you are right. I removed the second condition.
>>
>>> Instead of ConINode::make() you can use phase->intcon().
>>
>> I first used phase->intcon() but this method may return a cached 
>> ConINode and hit the assert "Idealize should return new
>> nodes, use Identity to return old nodes" in 
>> 'PhaseIterGVN::transform_old()'. That's why I directly create the 
>> ConINode.
>>
>> New webrev: http://cr.openjdk.java.net/~thartmann/8043284/webrev.01/
>>
>> Thanks,
>> Tobias
>>
>>>
>>> Thanks,
>>> Vladimir
>>>
>>> On 7/31/14 5:35 AM, Tobias Hartmann wrote:
>>>> Hi,
>>>>
>>>> please review the following patch that fixes JDK-8043284.
>>>>
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8043284
>>>> Webrev: http://cr.openjdk.java.net/~thartmann/8043284/webrev.00/
>>>>
>>>> == Problem ==
>>>> Similar to the previous implementation of unsigned integer 
>>>> comparison (see JDK- 8042786), signed integer comparison does
>>>> only consider the general integer range [MinInt, MaxInt] instead of 
>>>> two ranges when comparing the result of an
>>>> overflowing AddI/SubI. However, there are situations where one can 
>>>> prove that both resulting ranges are unequal to the
>>>> tested value (see 'TestIntegerComparison::testSigned' in the 
>>>> webrev). In this case the comparison can be optimized.
>>>>
>>>> == Solution ==
>>>> Similar to the fix for JDK-8042786 we compute both type ranges if 
>>>> the add/sub overflows and compare them to the tested
>>>> value. If we can prove that the value is always unequal, we replace 
>>>> the BoolNode by true or false (depending on the
>>>> test).
>>>> A jtreg test is added that triggers both the unsigned as well as 
>>>> the signed optimization.
>>>>
>>>> == Testing ==
>>>> - Jtreg test (TestIntegerComparison)
>>>> - JPRT
>>>>
>>>> Thanks,
>>>> Tobias
>>



More information about the hotspot-compiler-dev mailing list