On November 10, 2015 6:29:36 PM GMT+01:00, Joseph Myers 
<jos...@codesourcery.com> wrote:
>On Tue, 10 Nov 2015, Richard Biener wrote:
>
>> Looks ok but I wonder if this is dead code with
>> 
>> (for pows (POW)
>>      sqrts (SQRT)
>>      cbrts (CBRT)
>>  (simplify
>>   (pows @0 REAL_CST@1)
>>   (with {
>>     const REAL_VALUE_TYPE *value = TREE_REAL_CST_PTR (@1);
>>     REAL_VALUE_TYPE tmp;
>>    }
>>    (switch
>> ...
>>     /* pow(x,0.5) -> sqrt(x).  */
>>     (if (flag_unsafe_math_optimizations
>>          && canonicalize_math_p ()
>>          && real_equal (value, &dconsthalf))
>>      (sqrts @0))
>> 
>> also wondering here about canonicalize_math_p (), I'd expected the
>> reverse transform as canonicalization.  Also wondering about
>> flag_unsafe_math_optimizations (missing from the vectorizer pattern).
>
>pow(x,0.5) -> sqrt(x) is unsafe because: pow (-0, 0.5) is specified in 
>Annex F to be +0 but sqrt (-0) is -0; pow (-Inf, 0.5) is specified in 
>Annex F to be +Inf, but sqrt (-Inf) is NaN with "invalid" exception 
>raised.  I think it's safe in other cases

So it's safe with no signed zeros and finite math rather than unsafe.  The 
reverse would be unsafe in addition (not fully specified and rounded).

 (the reverse of course is not
>
>safe, sqrt is a fully-specified correctly-rounded IEEE operation and
>pow 
>isn't).


Reply via email to