On 24/07/14 13:51, Richard Biener wrote:
On Thu, Jul 24, 2014 at 2:36 PM, Kyrill Tkachov <kyrylo.tkac...@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.tkac...@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.


Reply via email to