From: Jakub Jelinek Date: Fri, 8 Nov 2019 18:58:14 +0000 (+0100) Subject: backport: re PR middle-end/92231 (ICE in gimple_fold_stmt_to_constant_1) X-Git-Tag: releases/gcc-9.3.0~410 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=66339b297149824c44265b3655aed34cc9ba6ed2;p=thirdparty%2Fgcc.git backport: re PR middle-end/92231 (ICE in gimple_fold_stmt_to_constant_1) Backported from mainline 2019-10-31 Jakub Jelinek 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-lang.c (handle_const_attribute): Don't call fndecl_built_in_p on *node that is not FUNCTION_DECL. * gcc.c-torture/compile/pr92231.c: New test. From-SVN: r277986 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 96a32d7681ae..de09391a66a5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,16 @@ Backported from mainline 2019-10-31 Jakub Jelinek + 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. + PR c++/90947 * tree.h (type_initializer_zero_p): Remove. * tree.c (type_initializer_zero_p): Remove. diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index f30818042ee2..d00f1e2b035e 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -6557,6 +6557,7 @@ gimple_fold_stmt_to_constant_1 (gimple *stmt, tree (*valueize) (tree), 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))) diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index c78f9c92a862..e381db79f170 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,12 @@ +2019-11-08 Jakub Jelinek + + Backported from mainline + 2019-10-31 Jakub Jelinek + + PR middle-end/92231 + * lto-lang.c (handle_const_attribute): Don't call fndecl_built_in_p + on *node that is not FUNCTION_DECL. + 2019-10-26 Jan Hubicka Backport from mainline diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index 5a35d4794c24..4ef228fcb458 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -303,7 +303,8 @@ handle_const_attribute (tree *node, tree ARG_UNUSED (name), 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 89f8907e413e..cd15635f2a74 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2019-11-08 Jakub Jelinek Backported from mainline + 2019-10-31 Jakub Jelinek + + PR middle-end/92231 + * gcc.c-torture/compile/pr92231.c: New test. + 2019-10-21 Jakub Jelinek PR c++/92015 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr92231.c b/gcc/testsuite/gcc.c-torture/compile/pr92231.c new file mode 100644 index 000000000000..1813add63c61 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr92231.c @@ -0,0 +1,9 @@ +/* PR middle-end/92231 */ + +extern int bar (void); + +int +foo (void) +{ + return (&bar + 4096) (); +} diff --git a/gcc/tree.c b/gcc/tree.c index 374131c74eaa..1549bde91473 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -5777,7 +5777,8 @@ free_lang_data_in_decl (tree decl, struct free_lang_data_d *fld) 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); diff --git a/gcc/tree.h b/gcc/tree.h index d650511c66f8..43dabd1a3bfa 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -5946,12 +5946,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 @@ -5960,7 +5960,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