]> git.ipfire.org Git - thirdparty/gcc.git/commit
Only allow (int)trunc(x) to (int)x simplification with -ffp-int-builtin-inexact ...
authorXi Ruoyao <xry111@xry111.site>
Fri, 24 Nov 2023 03:08:19 +0000 (11:08 +0800)
committerXi Ruoyao <xry111@xry111.site>
Tue, 12 Dec 2023 11:21:57 +0000 (19:21 +0800)
commit99182ea09f10beca8445396cbab491899536f5c3
treed46fecc89e464b5287886d9c79fab280f0134d03
parent0640bc76cd0937069bdeea71aa9e1076d633ed97
Only allow (int)trunc(x) to (int)x simplification with -ffp-int-builtin-inexact [PR107723]

With -fno-fp-int-builtin-inexact, trunc is not allowed to raise
FE_INEXACT and it should produce an integral result (if the input is not
NaN or Inf).  Thus FE_INEXACT should not be raised.

But (int)x may raise FE_INEXACT when x is a non-integer, non-NaN, and
non-Inf value.  C23 recommends to do so in a footnote.

Thus we should not simplify (int)trunc(x) to (int)x if
-fno-fp-int-builtin-inexact is in-effect.

gcc/ChangeLog:

PR middle-end/107723
* convert.cc (convert_to_integer_1) [case BUILT_IN_TRUNC]: Break
early if !flag_fp_int_builtin_inexact and flag_trapping_math.

gcc/testsuite/ChangeLog:

PR middle-end/107723
* gcc.dg/torture/builtin-fp-int-inexact-trunc.c: New test.
gcc/convert.cc
gcc/testsuite/gcc.dg/torture/builtin-fp-int-inexact-trunc.c [new file with mode: 0644]