From 6773658a809fbebcdb68483cb929207150ac7e5f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 31 Oct 2019 11:04:47 +0100 Subject: [PATCH] re PR middle-end/92231 (ICE in gimple_fold_stmt_to_constant_1) 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. From-SVN: r277660 --- gcc/ChangeLog | 12 ++++++++++++ gcc/gimple-fold.c | 1 + gcc/lto/ChangeLog | 6 ++++++ gcc/lto/lto-lang.c | 3 ++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr92231.c | 9 +++++++++ gcc/tree.c | 3 ++- gcc/tree.h | 6 +++--- 8 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr92231.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc1df777c49..8265f4ce365 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +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. + 2019-10-31 Andre Vieira * params.def (PARAM_VECT_EPILOGUES_NOMASK): Enable by default. diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 1b7e7edfa8c..dc3d2286aa1 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -6439,6 +6439,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 a20e2d496fe..d5c1373863c 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,9 @@ +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-30 Martin Liska PR lto/91393 diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index 0d781da5768..3e37c37fa46 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -305,7 +305,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 7f8acf8b52b..925768189f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-10-31 Jakub Jelinek + + PR middle-end/92231 + * gcc.c-torture/compile/pr92231.c: New test. + 2019-10-31 Andre Vieira * gcc.dg/vect/vect-epilogues.c: New test. 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 00000000000..1813add63c6 --- /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 3866804b99d..741f7a2ce65 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -5805,7 +5805,8 @@ free_lang_data_in_decl (tree decl, class 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 18d6c0e0c21..81351548ecd 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -6119,12 +6119,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 @@ -6133,7 +6133,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 -- 2.30.2