(Please) Re: Request for review (S): 6833879 Assigning positive zero is ignored when old value is negative zero
Changpeng Fang
Changpeng.Fang at Sun.COM
Mon May 4 16:42:17 PDT 2009
On 05/04/09 16:33, Tom Rodriguez wrote:
> Actually we can allow this transformation when the value being tested
> is any constant besides 0.0, right?
>
I think for floating point, the cases that t==f?t:f is very limited
so, disabling this identity optimization would have limited performance
impact
for java programs. And this is also the reason we
don't bother to recognize the non-zero constant cases.
Thanks,
Changpeng
> tom
>
> On May 4, 2009, at 4:23 PM, Tom Rodriguez wrote:
>
>> It feels a bit extreme but I don't see how we can ignore that it
>> produces the wrong result dynamically.
>>
>> tom
>>
>> On May 4, 2009, at 2:44 PM, Changpeng Fang wrote:
>>
>>> On 05/01/09 11:30, Changpeng Fang wrote:
>>>
>>> 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
>>>
>>>
>>>> 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