ipa-inline-analysis.c (compute_inline_parameters): Be more reailistic on estimating thunk bodies...
* ipa-inline-analysis.c (compute_inline_parameters): Be more reailistic on estimating thunk bodies; do not set inline_failed to CIF_THUNK for calls from thunk. * ipa-inline-transform.c (inline_call): When inlining into thunk produce gimple body. (preserve_function_body_p): No need to preserve function body * cif-codes.def (CIF_THUNK): Remove. * cgraphclones.c (duplicate_thunk_for_node): Thunks calls are inlinable. * g++.dg/ipa/ivinline-7.C: Do not xfail. * g++.dg/ipa/ivinline-9.C: Do not xfail. From-SVN: r236274
This commit is contained in:
parent
c1d854fb24
commit
0b9004ed56
|
@ -1,3 +1,14 @@
|
|||
2016-05-16 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* ipa-inline-analysis.c (compute_inline_parameters): Be more reailistic
|
||||
on estimating thunk bodies; do not set inline_failed to CIF_THUNK for
|
||||
calls from thunk.
|
||||
* ipa-inline-transform.c (inline_call): When inlining into thunk produce
|
||||
gimple body.
|
||||
(preserve_function_body_p): No need to preserve function body
|
||||
* cif-codes.def (CIF_THUNK): Remove.
|
||||
* cgraphclones.c (duplicate_thunk_for_node): Thunks calls are inlinable.
|
||||
|
||||
2016-05-16 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* tree-inline.c (expand_call_inline): recurse after inlining thunk.
|
||||
|
|
|
@ -3324,7 +3324,7 @@ cgraph_node::verify_node (void)
|
|||
error ("More than one edge out of thunk node");
|
||||
error_found = true;
|
||||
}
|
||||
if (gimple_has_body_p (decl))
|
||||
if (gimple_has_body_p (decl) && !global.inlined_to)
|
||||
{
|
||||
error ("Thunk is not supposed to have body");
|
||||
error_found = true;
|
||||
|
|
|
@ -337,8 +337,6 @@ duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node)
|
|||
|
||||
cgraph_edge *e = new_thunk->create_edge (node, NULL, 0,
|
||||
CGRAPH_FREQ_BASE);
|
||||
e->call_stmt_cannot_inline_p = true;
|
||||
e->inline_failed = CIF_THUNK;
|
||||
symtab->call_edge_duplication_hooks (thunk->callees, e);
|
||||
symtab->call_cgraph_duplication_hooks (thunk, new_thunk);
|
||||
return new_thunk;
|
||||
|
|
|
@ -95,10 +95,6 @@ DEFCIFCODE(MISMATCHED_ARGUMENTS, CIF_FINAL_ERROR,
|
|||
DEFCIFCODE(LTO_MISMATCHED_DECLARATIONS, CIF_FINAL_ERROR,
|
||||
N_("mismatched declarations during linktime optimization"))
|
||||
|
||||
/* Caller is thunk. */
|
||||
DEFCIFCODE(THUNK, CIF_FINAL_ERROR,
|
||||
N_("thunk call"))
|
||||
|
||||
/* Call was originally indirect. */
|
||||
DEFCIFCODE(ORIGINALLY_INDIRECT_CALL, CIF_FINAL_NORMAL,
|
||||
N_("originally indirect function call not considered for inlining"))
|
||||
|
|
|
@ -2932,11 +2932,13 @@ compute_inline_parameters (struct cgraph_node *node, bool early)
|
|||
struct inline_edge_summary *es = inline_edge_summary (node->callees);
|
||||
struct predicate t = true_predicate ();
|
||||
|
||||
node->callees->inline_failed = CIF_THUNK;
|
||||
node->local.can_change_signature = false;
|
||||
es->call_stmt_size = INLINE_SIZE_SCALE;
|
||||
es->call_stmt_time = INLINE_TIME_SCALE;
|
||||
account_size_time (info, INLINE_SIZE_SCALE * 2, INLINE_TIME_SCALE * 2, &t);
|
||||
es->call_stmt_size = eni_size_weights.call_cost;
|
||||
es->call_stmt_time = eni_time_weights.call_cost;
|
||||
account_size_time (info, INLINE_SIZE_SCALE * 2,
|
||||
INLINE_TIME_SCALE * 2, &t);
|
||||
t = not_inlined_predicate ();
|
||||
account_size_time (info, 2 * INLINE_SIZE_SCALE, 0, &t);
|
||||
inline_update_overall_summary (node);
|
||||
info->self_size = info->size;
|
||||
info->self_time = info->time;
|
||||
|
|
|
@ -314,12 +314,20 @@ inline_call (struct cgraph_edge *e, bool update_original,
|
|||
/* Don't even think of inlining inline clone. */
|
||||
gcc_assert (!callee->global.inlined_to);
|
||||
|
||||
e->inline_failed = CIF_OK;
|
||||
DECL_POSSIBLY_INLINED (callee->decl) = true;
|
||||
|
||||
to = e->caller;
|
||||
if (to->global.inlined_to)
|
||||
to = to->global.inlined_to;
|
||||
if (to->thunk.thunk_p)
|
||||
{
|
||||
if (in_lto_p)
|
||||
to->get_untransformed_body ();
|
||||
to->expand_thunk (false, true);
|
||||
e = to->callees;
|
||||
}
|
||||
|
||||
|
||||
e->inline_failed = CIF_OK;
|
||||
DECL_POSSIBLY_INLINED (callee->decl) = true;
|
||||
|
||||
if (DECL_FUNCTION_PERSONALITY (callee->decl))
|
||||
DECL_FUNCTION_PERSONALITY (to->decl)
|
||||
|
@ -580,7 +588,7 @@ preserve_function_body_p (struct cgraph_node *node)
|
|||
gcc_assert (!node->alias && !node->thunk.thunk_p);
|
||||
|
||||
/* Look if there is any clone around. */
|
||||
if (node->clones)
|
||||
if (node->clones && !node->clones->thunk.thunk_p)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2016-05-16 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* g++.dg/ipa/ivinline-7.C: Do not xfail.
|
||||
* g++.dg/ipa/ivinline-9.C: Do not xfail.
|
||||
|
||||
2016-05-16 Matthew Wahab <matthew.wahab@arm.com>
|
||||
|
||||
* g++.dg/ext/arm-fp16/fp16-param-1.c: Update expected output. Add
|
||||
|
|
|
@ -76,4 +76,4 @@ int main (int argc, char *argv[])
|
|||
}
|
||||
|
||||
/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::.*foo" "inline" } } */
|
||||
/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */
|
||||
|
|
|
@ -90,4 +90,4 @@ int main (int argc, char *argv[])
|
|||
}
|
||||
|
||||
/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::.*foo" "inline" } } */
|
||||
/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */
|
||||
|
|
Loading…
Reference in New Issue