tree-flow.h (gimple_check_call_matching_types): Add new argument.

2013-06-15  Dehao Chen  <dehao@google.com>

	* tree-flow.h (gimple_check_call_matching_types): Add new argument.
	* gimple-low.c (gimple_check_call_matching_types): Likewise.
	(gimple_check_call_args): Likewise.
	* value-prof.c (check_ic_target): Likewise.
	* ipa-inline.c (early_inliner): Likewise.
	* ipa-prop.c (update_indirect_edges_after_inlining): Likewise.
	* cgraph.c (cgraph_create_edge_1): Likewise.
	(cgraph_make_edge_direct): Likewise.

From-SVN: r200125
This commit is contained in:
Dehao Chen 2013-06-15 16:56:01 +00:00 committed by Dehao Chen
parent 58aee036e8
commit 4de09b857e
7 changed files with 30 additions and 12 deletions

View File

@ -1,3 +1,14 @@
2013-06-15 Dehao Chen <dehao@google.com>
* tree-flow.h (gimple_check_call_matching_types): Add new argument.
* gimple-low.c (gimple_check_call_matching_types): Likewise.
(gimple_check_call_args): Likewise.
* value-prof.c (check_ic_target): Likewise.
* ipa-inline.c (early_inliner): Likewise.
* ipa-prop.c (update_indirect_edges_after_inlining): Likewise.
* cgraph.c (cgraph_create_edge_1): Likewise.
(cgraph_make_edge_direct): Likewise.
2013-06-14 Michael Meissner <meissner@linux.vnet.ibm.com> 2013-06-14 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/57615 PR target/57615

View File

@ -818,7 +818,8 @@ cgraph_create_edge_1 (struct cgraph_node *caller, struct cgraph_node *callee,
pop_cfun (); pop_cfun ();
if (call_stmt if (call_stmt
&& callee && callee->symbol.decl && callee && callee->symbol.decl
&& !gimple_check_call_matching_types (call_stmt, callee->symbol.decl)) && !gimple_check_call_matching_types (call_stmt, callee->symbol.decl,
false))
edge->call_stmt_cannot_inline_p = true; edge->call_stmt_cannot_inline_p = true;
else else
edge->call_stmt_cannot_inline_p = false; edge->call_stmt_cannot_inline_p = false;
@ -1018,7 +1019,8 @@ cgraph_make_edge_direct (struct cgraph_edge *edge, struct cgraph_node *callee)
if (edge->call_stmt) if (edge->call_stmt)
edge->call_stmt_cannot_inline_p edge->call_stmt_cannot_inline_p
= !gimple_check_call_matching_types (edge->call_stmt, callee->symbol.decl); = !gimple_check_call_matching_types (edge->call_stmt, callee->symbol.decl,
false);
/* We need to re-determine the inlining status of the edge. */ /* We need to re-determine the inlining status of the edge. */
initialize_inline_failed (edge); initialize_inline_failed (edge);

View File

@ -204,7 +204,7 @@ struct gimple_opt_pass pass_lower_cf =
return false. */ return false. */
static bool static bool
gimple_check_call_args (gimple stmt, tree fndecl) gimple_check_call_args (gimple stmt, tree fndecl, bool args_count_match)
{ {
tree parms, p; tree parms, p;
unsigned int i, nargs; unsigned int i, nargs;
@ -243,6 +243,8 @@ gimple_check_call_args (gimple stmt, tree fndecl)
&& !fold_convertible_p (DECL_ARG_TYPE (p), arg))) && !fold_convertible_p (DECL_ARG_TYPE (p), arg)))
return false; return false;
} }
if (args_count_match && p)
return false;
} }
else if (parms) else if (parms)
{ {
@ -271,11 +273,13 @@ gimple_check_call_args (gimple stmt, tree fndecl)
} }
/* Verify if the type of the argument and lhs of CALL_STMT matches /* Verify if the type of the argument and lhs of CALL_STMT matches
that of the function declaration CALLEE. that of the function declaration CALLEE. If ARGS_COUNT_MATCH is
true, the arg count needs to be the same.
If we cannot verify this or there is a mismatch, return false. */ If we cannot verify this or there is a mismatch, return false. */
bool bool
gimple_check_call_matching_types (gimple call_stmt, tree callee) gimple_check_call_matching_types (gimple call_stmt, tree callee,
bool args_count_match)
{ {
tree lhs; tree lhs;
@ -285,7 +289,7 @@ gimple_check_call_matching_types (gimple call_stmt, tree callee)
&& !useless_type_conversion_p (TREE_TYPE (DECL_RESULT (callee)), && !useless_type_conversion_p (TREE_TYPE (DECL_RESULT (callee)),
TREE_TYPE (lhs)) TREE_TYPE (lhs))
&& !fold_convertible_p (TREE_TYPE (DECL_RESULT (callee)), lhs)) && !fold_convertible_p (TREE_TYPE (DECL_RESULT (callee)), lhs))
|| !gimple_check_call_args (call_stmt, callee)) || !gimple_check_call_args (call_stmt, callee, args_count_match))
return false; return false;
return true; return true;
} }

View File

@ -2054,8 +2054,8 @@ early_inliner (void)
es->call_stmt_time es->call_stmt_time
= estimate_num_insns (edge->call_stmt, &eni_time_weights); = estimate_num_insns (edge->call_stmt, &eni_time_weights);
if (edge->callee->symbol.decl if (edge->callee->symbol.decl
&& !gimple_check_call_matching_types (edge->call_stmt, && !gimple_check_call_matching_types (
edge->callee->symbol.decl)) edge->call_stmt, edge->callee->symbol.decl, false))
edge->call_stmt_cannot_inline_p = true; edge->call_stmt_cannot_inline_p = true;
} }
timevar_pop (TV_INTEGRATION); timevar_pop (TV_INTEGRATION);

View File

@ -2468,8 +2468,9 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
new_direct_edge->indirect_inlining_edge = 1; new_direct_edge->indirect_inlining_edge = 1;
if (new_direct_edge->call_stmt) if (new_direct_edge->call_stmt)
new_direct_edge->call_stmt_cannot_inline_p new_direct_edge->call_stmt_cannot_inline_p
= !gimple_check_call_matching_types (new_direct_edge->call_stmt, = !gimple_check_call_matching_types (
new_direct_edge->callee->symbol.decl); new_direct_edge->call_stmt,
new_direct_edge->callee->symbol.decl, false);
if (new_edges) if (new_edges)
{ {
new_edges->safe_push (new_direct_edge); new_edges->safe_push (new_direct_edge);

View File

@ -464,7 +464,7 @@ extern void record_vars_into (tree, tree);
extern void record_vars (tree); extern void record_vars (tree);
extern bool gimple_seq_may_fallthru (gimple_seq); extern bool gimple_seq_may_fallthru (gimple_seq);
extern bool gimple_stmt_may_fallthru (gimple); extern bool gimple_stmt_may_fallthru (gimple);
extern bool gimple_check_call_matching_types (gimple, tree); extern bool gimple_check_call_matching_types (gimple, tree, bool);
/* In tree-ssa.c */ /* In tree-ssa.c */

View File

@ -1231,7 +1231,7 @@ static bool
check_ic_target (gimple call_stmt, struct cgraph_node *target) check_ic_target (gimple call_stmt, struct cgraph_node *target)
{ {
location_t locus; location_t locus;
if (gimple_check_call_matching_types (call_stmt, target->symbol.decl)) if (gimple_check_call_matching_types (call_stmt, target->symbol.decl, true))
return true; return true;
locus = gimple_location (call_stmt); locus = gimple_location (call_stmt);