aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-11-09 13:43:02 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-11-09 13:43:02 +0000
commit03cb5f3988646680362082c19ddcba7c534d6a83 (patch)
tree524fa049f2662f6ef1b7960ace71e77bbaa25b55 /gcc
parentc4ac6e9400db96df9e82434acc513060853ed2e1 (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/gimple-streamer-in.c7
-rw-r--r--gcc/ipa-inline-analysis.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr51039.c17
-rw-r--r--gcc/tree-cfg.c10
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;
}