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
This commit is contained in:
Richard Guenther 2011-11-09 13:43:02 +00:00 committed by Richard Biener
parent c4ac6e9400
commit 03cb5f3988
6 changed files with 50 additions and 14 deletions

View File

@ -1,3 +1,14 @@
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

View File

@ -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;

View File

@ -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

View File

@ -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):

View File

@ -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);
}

View File

@ -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;
}