From 7a161d5be3314a90bcb5870986edc8b230446c46 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 16 Mar 2015 20:39:14 +0100 Subject: [PATCH] tree-sra.c (ipa_sra_preliminary_function_checks): Use DECL_ONE_ONLY to check if decl is one only. * tree-sra.c (ipa_sra_preliminary_function_checks): Use DECL_ONE_ONLY to check if decl is one only. * ipa-split.c (consider_split): Limit splitt of one only functions. From-SVN: r221466 --- gcc/ChangeLog | 6 ++++++ gcc/ipa-split.c | 25 +++++++++++++++++++++++++ gcc/tree-sra.c | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c849fd9aef8..51650a2fccc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-03-16 Jan Hubicka + + * tree-sra.c (ipa_sra_preliminary_function_checks): Use + DECL_ONE_ONLY to check if decl is one only. + * ipa-split.c (consider_split): Limit splitt of one only functions. + 2015-03-16 Jakub Jelinek PR tree-optimization/65427 diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index 7e68a876076..56402381062 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -598,6 +598,31 @@ consider_split (struct split_point *current, bitmap non_ssa_vars, return; } + /* Splitting functions brings the target out of comdat group; this will + lead to code duplication if the function is reused by other unit. + Limit this duplication. This is consistent with limit in tree-sra.c + FIXME: with LTO we ought to be able to do better! */ + if (DECL_ONE_ONLY (current_function_decl) + && current->split_size >= (unsigned int) MAX_INLINE_INSNS_AUTO) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + " Refused: function is COMDAT and tail is too large\n"); + return; + } + /* For comdat functions also reject very small tails; those will likely get + inlined back and we do not want to risk the duplication overhead. + FIXME: with LTO we ought to be able to do better! */ + if (DECL_ONE_ONLY (current_function_decl) + && current->split_size + <= (unsigned int) PARAM_VALUE (PARAM_EARLY_INLINING_INSNS) / 2) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + " Refused: function is COMDAT and tail is too small\n"); + return; + } + /* FIXME: we currently can pass only SSA function parameters to the split arguments. Once parm_adjustment infrastructure is supported by cloning, we can pass more than that. */ diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index a49e9504e12..91b72fbdc89 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -5109,7 +5109,7 @@ ipa_sra_preliminary_function_checks (struct cgraph_node *node) return false; } - if ((DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl)) + if ((DECL_ONE_ONLY (node->decl) || DECL_EXTERNAL (node->decl)) && inline_summaries->get (node)->size >= MAX_INLINE_INSNS_AUTO) { if (dump_file) -- 2.30.2