From 46729204a4bd1c5aad4856d9a4f20da54c586241 Mon Sep 17 00:00:00 2001 From: hubicka Date: Mon, 16 May 2016 10:10:28 +0000 Subject: * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@236274 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 11 +++++++++++ gcc/cgraph.c | 2 +- gcc/cgraphclones.c | 2 -- gcc/cif-code.def | 4 ---- gcc/ipa-inline-analysis.c | 10 ++++++---- gcc/ipa-inline-transform.c | 16 ++++++++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ipa/ivinline-7.C | 2 +- gcc/testsuite/g++.dg/ipa/ivinline-9.C | 2 +- 9 files changed, 37 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23f03a7df35..7f70b9c6967 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2016-05-16 Jan Hubicka + + * 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 * tree-inline.c (expand_call_inline): recurse after inlining thunk. diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 0c6ff93d625..6fcdbddb7fc 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -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; diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 43ee7352e5b..97eb927c01b 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -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; diff --git a/gcc/cif-code.def b/gcc/cif-code.def index f112e962aad..196151fe8d2 100644 --- a/gcc/cif-code.def +++ b/gcc/cif-code.def @@ -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")) diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 17b21d17c5f..82d1774abcb 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -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; diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index 759617bb72f..1e6e108b9db 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1598857f712..c5f151f7fe4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-16 Jan Hubicka + + * g++.dg/ipa/ivinline-7.C: Do not xfail. + * g++.dg/ipa/ivinline-9.C: Do not xfail. + 2016-05-16 Matthew Wahab * g++.dg/ext/arm-fp16/fp16-param-1.c: Update expected output. Add diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-7.C b/gcc/testsuite/g++.dg/ipa/ivinline-7.C index b725db5cb1d..a7b41e7bd59 100644 --- a/gcc/testsuite/g++.dg/ipa/ivinline-7.C +++ b/gcc/testsuite/g++.dg/ipa/ivinline-7.C @@ -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" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-9.C b/gcc/testsuite/g++.dg/ipa/ivinline-9.C index f6110c10076..41b2381877a 100644 --- a/gcc/testsuite/g++.dg/ipa/ivinline-9.C +++ b/gcc/testsuite/g++.dg/ipa/ivinline-9.C @@ -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" } } */ -- cgit v1.2.3