diff options
author | Richard Guenther <rguenther@suse.de> | 2011-11-09 13:43:02 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-11-09 13:43:02 +0000 |
commit | 03cb5f3988646680362082c19ddcba7c534d6a83 (patch) | |
tree | 524fa049f2662f6ef1b7960ace71e77bbaa25b55 /gcc | |
parent | c4ac6e9400db96df9e82434acc513060853ed2e1 (diff) | |
download | gcc-03cb5f3988646680362082c19ddcba7c534d6a83.zip gcc-03cb5f3988646680362082c19ddcba7c534d6a83.tar.gz gcc-03cb5f3988646680362082c19ddcba7c534d6a83.tar.bz2 |
re PR tree-optimization/51039 (ICE: in estimate_function_body_sizes, at ipa-inline-analysis.c:1977 with -finline-small-functions -fno-ipa-pure-const and passing incompatible function ptr)
2011-11-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51039
* tree-cfg.c (verify_gimple_call): Verify that
gimple_call_cannot_inline_p is returning a conservative
correct result according to gimple_check_call_matching_types.
* ipa-inline-analysis.c (estimate_function_body_sizes): Remove
code dealing with un-inlinablility.
* gimple-streamer-in.c (input_gimple_stmt): Update the
non-inlinable flag.
* gcc.dg/pr51039.c: New testcase.
From-SVN: r181205
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/gimple-streamer-in.c | 7 | ||||
-rw-r--r-- | gcc/ipa-inline-analysis.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr51039.c | 17 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 10 |
6 files changed, 50 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 20307dd..63da104 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,17 @@ 2011-11-09 Richard Guenther <rguenther@suse.de> PR tree-optimization/51039 + * tree-cfg.c (verify_gimple_call): Verify that + gimple_call_cannot_inline_p is returning a conservative + correct result according to gimple_check_call_matching_types. + * ipa-inline-analysis.c (estimate_function_body_sizes): Remove + code dealing with un-inlinablility. + * gimple-streamer-in.c (input_gimple_stmt): Update the + non-inlinable flag. + +2011-11-09 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/51039 * tree-inline.c (setup_one_parameter): Always perform a valid gimple type change. (declare_return_variable): Likewise. diff --git a/gcc/gimple-streamer-in.c b/gcc/gimple-streamer-in.c index fc6ceb4..862c5b0 100644 --- a/gcc/gimple-streamer-in.c +++ b/gcc/gimple-streamer-in.c @@ -219,11 +219,18 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in, } if (is_gimple_call (stmt)) { + tree fndecl; if (gimple_call_internal_p (stmt)) gimple_call_set_internal_fn (stmt, streamer_read_enum (ib, internal_fn, IFN_LAST)); else gimple_call_set_fntype (stmt, stream_read_tree (ib, data_in)); + /* Update the non-inlinable flag conservatively. */ + fndecl = gimple_call_fndecl (stmt); + if (fndecl + && !gimple_call_cannot_inline_p (stmt) + && !gimple_check_call_matching_types (stmt, fndecl)) + gimple_call_set_cannot_inline (stmt, true); } break; diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 1820b0c..91aa612 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -1961,20 +1961,6 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early) es->call_stmt_time = this_time; es->loop_depth = bb->loop_depth; edge_set_predicate (edge, &bb_predicate); - - /* Do not inline calls where we cannot triviall work around - mismatches in argument or return types. */ - if (edge->callee - && cgraph_function_or_thunk_node (edge->callee, NULL) - && !gimple_check_call_matching_types - (stmt, cgraph_function_or_thunk_node (edge->callee, - NULL)->decl)) - { - edge->call_stmt_cannot_inline_p = true; - gimple_call_set_cannot_inline (stmt, true); - } - else - gcc_assert (!gimple_call_cannot_inline_p (stmt)); } /* TODO: When conditional jump or swithc is known to be constant, but diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 66a534b..2d4a6aa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-09 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/51039 + * gcc.dg/pr51039.c: New testcase. + 2011-11-09 Jakub Jelinek <jakub@redhat.com> * lib/target-supports.exp (check_effective_target_vect_cond_mixed): diff --git a/gcc/testsuite/gcc.dg/pr51039.c b/gcc/testsuite/gcc.dg/pr51039.c new file mode 100644 index 0000000..863a6ff --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr51039.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O -finline-small-functions -fno-ipa-pure-const" } */ + +float baz (void) +{ + return 0; +} + +static inline int bar (int (*ibaz) (void)) +{ + return ibaz (); +} + +void foo (void) +{ + bar((int (*)(void))baz); +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index d81cc67..b733c88 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3227,6 +3227,16 @@ verify_gimple_call (gimple stmt) } } + /* Verify that if we have a direct call and the argument/return + types have mismatches the call is properly marked as noninlinable. */ + if (fndecl + && !gimple_call_cannot_inline_p (stmt) + && !gimple_check_call_matching_types (stmt, fndecl)) + { + error ("gimple call cannot be inlined but is not marked so"); + return true; + } + return false; } |