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
This commit is contained in:
Jan Hubicka 2015-03-16 20:39:14 +01:00 committed by Jan Hubicka
parent f8c29d9839
commit 7a161d5be3
3 changed files with 32 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2015-03-16 Jan Hubicka <hubicka@ucw.cz>
* 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 <jakub@redhat.com>
PR tree-optimization/65427

View File

@ -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. */

View File

@ -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)