Request for review (S): 6833879 Assigning positive zero is ignored when old value is negative zero

Changpeng Fang Changpeng.Fang at Sun.COM
Fri May 1 11:30:52 PDT 2009


http://cr.openjdk.java.net/~cfang/6833879/webrev.01/

I have updated the fix to disable the identity optimization for all 
floating point
comparison  (i.e.,  is_cmove_id always returns NULL for flaot and double).


Thanks,

Changpeng



On 04/29/09 12:32, Tom Rodriguez wrote:
> BTW, you can use TypeF::ZERO and TypeD::ZERO to check for positive 
> zero constants instead of breaking them down, as in phase->type(f) == 
> TypeF::ZERO.  I don't think this fix is sufficient.  It has the same 
> problem for "if (v == -0.0f) v == -0.0f" and as you said originally it 
> won't work right dynamically either.
>
> tom
>
> On Apr 29, 2009, at 10:59 AM, Changpeng Fang wrote:
>
>> http://cr.openjdk.java.net/~cfang/6833879/webrev.00/
>>
>> Problem:
>> For the following case:
>> public static double normalize(float v) {
>>       if (v == 0.0f) v = 0.0f;
>>       return v;
>> }
>> If -0.0 is passed, 0.0 is expected to be returned (it is the case for 
>> the interpreter). However,
>> PhiNode::Identity optimized away the "if and assignment" statement 
>> and the server vm
>> return -0.0.
>>
>> Proposed Solution:
>> Don't perform this kind of identity optimization if either true path 
>> or false path is constant
>> 0.0 or (-0.0)
>>
>> Open Issue:
>> When the true path or false path is not constant, it may still be 0.0 
>> (-0.0) at run time.
>> Do we have to turn off this identity optimization completely  for 
>> float  and double (except
>> for constant non-zeros)?
>> Tests: Passed the test case in the CR report.
>>
>> Thanks,
>>
>> Changpeng
>




More information about the hotspot-compiler-dev mailing list