https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43374

--- Comment #11 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:f39e6b4f5cd4e5362cf4b1004a591df2c8b00304

commit r15-5671-gf39e6b4f5cd4e5362cf4b1004a591df2c8b00304
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Tue Nov 26 09:45:21 2024 +0100

    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  <ja...@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.

Reply via email to