[PATCH] PR 61876: Do not convert cast + __builtin_round into __builtin_lround unless -fno-math-errno is used

Kyrill Tkachov kyrylo.tkachov@arm.com
Thu Jul 24 13:08:00 GMT 2014


On 24/07/14 13:51, Richard Biener wrote:
> On Thu, Jul 24, 2014 at 2:36 PM, Kyrill Tkachov <kyrylo.tkachov@arm.com> wrote:
>> Hi all,
>>
>> This fixes PR 61876 by not converting the round + cast into an lround unless
>> -fno-math-errno is specified.
>> This is because lround can potentially set math errno whereas round + cast
>> doesn't, so the transformation isn't universally valid.
>>
>> This will cause the tests:
>> gcc.target/aarch64/fcvt_double_long.c
>> gcc.target/aarch64/fcvt_double_ulong.c
>>
>> to start passing on aarch64-linux.
>>
>> aarch64 and x86 bootstrap and regtest looks fine.
>>
>> Ok for trunk?
> Ok.  Does this really only apply to the round() case and not to all
> the others (floor, ceil, rint) as well?
Thanks for the review,

 From what I understand only lround and lrint are defined in the C standard.
There is no lfloor for example, the builtin lfloor in gcc is just an 
extension.
Do we have defined semantics for lfloor somewhere?

The lrint case seems to be similar to the lround case (the documentation 
say the same thing in the Errors section). I can whip up a patch to 
guard that transformation as well...

Kyrill

>
> Thanks,
> Richard.
>
>> 2014-06-23  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
>>
>>      PR middle-end/61876
>>      * convert.c (convert_to_integer): Do not convert BUILT_IN_ROUND and cast
>>      when flat_errno_math is on.




More information about the Gcc-patches mailing list