tree-sra.c (ipa_sra_preliminary_function_checks): Use DECL_ONE_ONLY to check if decl...
authorJan Hubicka <hubicka@ucw.cz>
Mon, 16 Mar 2015 19:39:14 +0000 (20:39 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 16 Mar 2015 19:39:14 +0000 (19:39 +0000)
* 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
gcc/ipa-split.c
gcc/tree-sra.c

index c849fd9aef8979511437529b70357ac4e29f9ae3..51650a2fcccc1a5a208c7e5d521f619c3deb46fd 100644 (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
index 7e68a87607644ad1a4c71e053c631cf4e75a4b02..564023810629bb6af33ed6487a288a6f75af05a5 100644 (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.  */
index a49e9504e125df6e7c23894ea35b0b0f00981386..91b72fbdc890b4d346fb084557386e5abd3f0e81 100644 (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)