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

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

https://gcc.gnu.org/g:65724317b26eb16a3cd7279aacd68f4c85b355c0

commit r13-9693-g65724317b26eb16a3cd7279aacd68f4c85b355c0
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Nov 28 10:51:16 2024 +0100

    gimple-fold: Avoid ICEs with bogus declarations like const attribute no
snprintf [PR117358]

    When one puts incorrect const or pure attributes on declarations of various
    C APIs which have corresponding builtins (vs. what they actually do), we
can
    get tons of ICEs in gimple-fold.cc.

    The following patch fixes it by giving up gimple_fold_builtin_* folding
    if the functions don't have gimple_vdef (or for pure functions like
    bcmp/strchr/strstr gimple_vuse) when in SSA form (during gimplification
    they will surely have both of those NULL even when declared correctly,
    yet it is highly desirable to fold them).

    Or shall I replace
    !gimple_vdef (stmt) && gimple_in_ssa_p (cfun)
    tests with
    (gimple_call_flags (stmt) & (ECF_CONST | ECF_PURE | ECF_NOVOPS)) != 0
    and
    !gimple_vuse (stmt) && gimple_in_ssa_p (cfun)
    with
    (gimple_call_flags (stmt) & (ECF_CONST | ECF_NOVOPS)) != 0
    ?

    2024-11-28  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/117358
            * gimple-fold.cc (gimple_fold_builtin_memory_op): Punt if stmt has
no
            vdef in ssa form.
            (gimple_fold_builtin_bcmp): Punt if stmt has no vuse in ssa form.
            (gimple_fold_builtin_bcopy): Punt if stmt has no vdef in ssa form.
            (gimple_fold_builtin_bzero): Likewise.
            (gimple_fold_builtin_memset): Likewise.  Use return false instead
of
            return NULL_TREE.
            (gimple_fold_builtin_strcpy): Punt if stmt has no vdef in ssa form.
            (gimple_fold_builtin_strncpy): Likewise.
            (gimple_fold_builtin_strchr): Punt if stmt has no vuse in ssa form.
            (gimple_fold_builtin_strstr): Likewise.
            (gimple_fold_builtin_strcat): Punt if stmt has no vdef in ssa form.
            (gimple_fold_builtin_strcat_chk): Likewise.
            (gimple_fold_builtin_strncat): Likewise.
            (gimple_fold_builtin_strncat_chk): Likewise.
            (gimple_fold_builtin_string_compare): Likewise.
            (gimple_fold_builtin_fputs): Likewise.
            (gimple_fold_builtin_memory_chk): Likewise.
            (gimple_fold_builtin_stxcpy_chk): Likewise.
            (gimple_fold_builtin_stxncpy_chk): Likewise.
            (gimple_fold_builtin_stpcpy): Likewise.
            (gimple_fold_builtin_snprintf_chk): Likewise.
            (gimple_fold_builtin_sprintf_chk): Likewise.
            (gimple_fold_builtin_sprintf): Likewise.
            (gimple_fold_builtin_snprintf): Likewise.
            (gimple_fold_builtin_fprintf): Likewise.
            (gimple_fold_builtin_printf): Likewise.
            (gimple_fold_builtin_realloc): Likewise.

            * gcc.c-torture/compile/pr117358.c: New test.

    (cherry picked from commit 29032dfa57629d1713a97b17a785273823993a91)

Reply via email to