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:
parent
58aee036e8
commit
4de09b857e
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue