+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>
PR target/57615
pop_cfun ();
if (call_stmt
&& 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;
else
edge->call_stmt_cannot_inline_p = false;
if (edge->call_stmt)
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. */
initialize_inline_failed (edge);
return false. */
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;
unsigned int i, nargs;
&& !fold_convertible_p (DECL_ARG_TYPE (p), arg)))
return false;
}
+ if (args_count_match && p)
+ return false;
}
else if (parms)
{
}
/* 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. */
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;
&& !useless_type_conversion_p (TREE_TYPE (DECL_RESULT (callee)),
TREE_TYPE (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 true;
}
es->call_stmt_time
= estimate_num_insns (edge->call_stmt, &eni_time_weights);
if (edge->callee->symbol.decl
- && !gimple_check_call_matching_types (edge->call_stmt,
- edge->callee->symbol.decl))
+ && !gimple_check_call_matching_types (
+ edge->call_stmt, edge->callee->symbol.decl, false))
edge->call_stmt_cannot_inline_p = true;
}
timevar_pop (TV_INTEGRATION);
new_direct_edge->indirect_inlining_edge = 1;
if (new_direct_edge->call_stmt)
new_direct_edge->call_stmt_cannot_inline_p
- = !gimple_check_call_matching_types (new_direct_edge->call_stmt,
- new_direct_edge->callee->symbol.decl);
+ = !gimple_check_call_matching_types (
+ new_direct_edge->call_stmt,
+ new_direct_edge->callee->symbol.decl, false);
if (new_edges)
{
new_edges->safe_push (new_direct_edge);
extern void record_vars (tree);
extern bool gimple_seq_may_fallthru (gimple_seq);
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 */
check_ic_target (gimple call_stmt, struct cgraph_node *target)
{
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;
locus = gimple_location (call_stmt);