]> git.ipfire.org Git - thirdparty/gcc.git/commit
builtins: Fix up DFP ICEs on __builtin_is{inf,finite,normal} [PR43374]
authorJakub Jelinek <jakub@redhat.com>
Tue, 26 Nov 2024 08:45:21 +0000 (09:45 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 26 Nov 2024 08:46:19 +0000 (09:46 +0100)
commitf39e6b4f5cd4e5362cf4b1004a591df2c8b00304
tree6415aded64465f7142b747d323114dbe1476acf3
parent014b135672717d23706d5e2554d49d7cf2200fa5
builtins: Fix up DFP ICEs on __builtin_is{inf,finite,normal} [PR43374]

__builtin_is{inf,finite,normal} builtins ICE on _Decimal{32,64,128,64x}
operands unless those operands are constant.

The problem is that we fold the builtins to comparisons with the largest
finite number, but
a) get_max_float was only handling binary floats
b) real_from_string again assumes binary float
and so we were ICEing in the build_real called after the two calls.

This patch adds decimal handling into get_max_float (well, moves it
from c-cppbuiltin.cc which was printing those for __DEC{32,64,128}_MAX__
macros) and uses real_from_string3 (perhaps it is time to rename it
to just real_from_string now that we can use function overloading)
so that it handles both binary and decimal floats.

2024-11-26  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/43374
gcc/
* real.cc (get_max_float): Handle decimal float.
* builtins.cc (fold_builtin_interclass_mathfn): Use
real_from_string3 rather than real_from_string.  Use
"1E%d" format string rather than "0x1p%d" for decimal
float minimum.
gcc/c-family/
* c-cppbuiltin.cc (builtin_define_decimal_float_constants): Use
get_max_float.
gcc/testsuite/
* gcc.dg/dfp/pr43374.c: New test.
gcc/builtins.cc
gcc/c-family/c-cppbuiltin.cc
gcc/real.cc
gcc/testsuite/gcc.dg/dfp/pr43374.c [new file with mode: 0644]