Hi! The https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01645.html patch in the form it was committed as r263880 and later tweaks essentially replaced DECL_BUILT_IN with fndecl_built_in_p (or the further class and/or function code checks with it), but most importantly while it was perhaps intended earlier, fndecl_built_in_p doesn't include a non-NULL or TREE_CODE (node) == FUNCTION_DECL check. In the patch, some changes were 1 for 1, DECL_BUILT_IN replaced with fndecl_built_in_p, or there were is_builtin_fn (which included the FUNCTION_DECL check) replaced with FUNCTION_DECL check + fndecl_built_in_p. Another kind of changes were FUNCTION_DECL check + DECL_BUILT_IN being replaced with just fndecl_built_in_p. Most of them were after get_callee_fndecl or similar functions, which might be ok (that function and similar return NULL if not found or a FUNCTION_DECL, but for error_mark_node passed to it they actually return error_mark_node; shouldn't we change that to just NULL_TREE too?). But in the following spots I don't see anything that would guarantee it is a FUNCTION_DECL. As the testcase shows, in the gimple-fold.c case it can be e.g. a MEM_REF instead, I'm surprised it isn't e.g. a VAR_DECL in the free_lang_data case or lto case.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2019-10-31 Jakub Jelinek <ja...@redhat.com> PR middle-end/92231 * tree.h (fndecl_built_in_p): Use fndecl_built_in_p instead of DECL_BUILT_IN in comment. Remove redundant ()s around return argument. * tree.c (free_lang_data_in_decl): Check if var is FUNCTION_DECL before calling fndecl_built_in_p. * gimple-fold.c (gimple_fold_stmt_to_constant_1): Check if TREE_OPERAND (fn, 0) is a FUNCTION_DECL before calling fndecl_built_in_p on it. lto/ * lto-lang.c (handle_const_attribute): Don't call fndecl_built_in_p on *node that is not FUNCTION_DECL. testsuite/ * gcc.c-torture/compile/pr92231.c: New test. --- gcc/tree.h.jj 2019-10-30 10:49:31.044107888 +0100 +++ gcc/tree.h 2019-10-30 15:53:45.795389000 +0100 @@ -6125,12 +6125,12 @@ type_has_mode_precision_p (const_tree t) Note that it is different from the DECL_IS_BUILTIN accessor. For instance, user declared prototypes of C library functions are not - DECL_IS_BUILTIN but may be DECL_BUILT_IN. */ + DECL_IS_BUILTIN but may be fndecl_built_in_p. */ inline bool fndecl_built_in_p (const_tree node) { - return (DECL_BUILT_IN_CLASS (node) != NOT_BUILT_IN); + return DECL_BUILT_IN_CLASS (node) != NOT_BUILT_IN; } /* Return true if a FUNCTION_DECL NODE is a GCC built-in function @@ -6139,7 +6139,7 @@ fndecl_built_in_p (const_tree node) inline bool fndecl_built_in_p (const_tree node, built_in_class klass) { - return (fndecl_built_in_p (node) && DECL_BUILT_IN_CLASS (node) == klass); + return fndecl_built_in_p (node) && DECL_BUILT_IN_CLASS (node) == klass; } /* Return true if a FUNCTION_DECL NODE is a GCC built-in function --- gcc/tree.c.jj 2019-10-30 13:16:45.071247769 +0100 +++ gcc/tree.c 2019-10-30 15:09:00.418332790 +0100 @@ -5805,7 +5805,8 @@ free_lang_data_in_decl (tree decl, class while (*nextp) { tree var = *nextp; - if (fndecl_built_in_p (var)) + if (TREE_CODE (var) == FUNCTION_DECL + && fndecl_built_in_p (var)) *nextp = TREE_CHAIN (var); else nextp = &TREE_CHAIN (var); --- gcc/gimple-fold.c.jj 2019-10-30 10:49:36.171029125 +0100 +++ gcc/gimple-fold.c 2019-10-30 15:01:48.192933760 +0100 @@ -6439,6 +6439,7 @@ gimple_fold_stmt_to_constant_1 (gimple * fn = (*valueize) (gimple_call_fn (stmt)); if (TREE_CODE (fn) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL && fndecl_built_in_p (TREE_OPERAND (fn, 0)) && gimple_builtin_call_types_compatible_p (stmt, TREE_OPERAND (fn, 0))) --- gcc/lto/lto-lang.c.jj 2019-10-04 21:39:52.301012246 +0200 +++ gcc/lto/lto-lang.c 2019-10-30 15:12:35.599046537 +0100 @@ -305,7 +305,8 @@ handle_const_attribute (tree *node, tree tree ARG_UNUSED (args), int ARG_UNUSED (flags), bool * ARG_UNUSED (no_add_attrs)) { - if (!fndecl_built_in_p (*node)) + if (TREE_CODE (*node) != FUNCTION_DECL + || !fndecl_built_in_p (*node)) inform (UNKNOWN_LOCATION, "%s:%s: %E: %E", __FILE__, __func__, *node, name); tree type = TREE_TYPE (*node); --- gcc/testsuite/gcc.c-torture/compile/pr92231.c.jj 2019-10-30 15:52:00.464994680 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr92231.c 2019-10-30 15:51:40.506298935 +0100 @@ -0,0 +1,9 @@ +/* PR middle-end/92231 */ + +extern int bar (void); + +int +foo (void) +{ + return (&bar + 4096) (); +} Jakub