ipa-inline-transform.c (master_clone_with_noninline_clones_p): New.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 17 Oct 2014 19:53:18 +0000 (19:53 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 17 Oct 2014 19:53:18 +0000 (19:53 +0000)
* ipa-inline-transform.c (master_clone_with_noninline_clones_p): New.
(clone_inlined_nodes): Do not overwrite the clone if above predicate
returns true.

From-SVN: r216415

gcc/ChangeLog
gcc/ipa-inline-transform.c

index af39978c997a1d7ef1a707c93f662a3b35e40987..b2a8e7a2a6f2d3684a423a460ccf3418e5da3189 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-17  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * ipa-inline-transform.c (master_clone_with_noninline_clones_p): New.
+       (clone_inlined_nodes): Do not overwrite the clone if above predicate
+       returns true.
+
 2014-10-17  Ilya Tocar  <ilya.tocar@intel.com>
 
        * config/i386/i386.c (MAX_VECT_LEN): Move earlier.
index 4b0fcad396ff5c84c5a535514a1a50a64ff3cdf9..1cb4c0520e83d7fe121b6debcd0e8c6a57bafe0a 100644 (file)
@@ -122,6 +122,20 @@ can_remove_node_now_p (struct cgraph_node *node, struct cgraph_edge *e)
   return true;
 }
 
+/* Return true if NODE is a master clone with non-inline clones.  */
+
+static bool
+master_clone_with_noninline_clones_p (struct cgraph_node *node)
+{
+  if (node->clone_of)
+    return false;
+
+  for (struct cgraph_node *n = node->clones; n; n = n->next_sibling_clone)
+    if (n->decl != node->decl)
+      return true;
+
+  return false;
+}
 
 /* E is expected to be an edge being inlined.  Clone destination node of
    the edge and redirect it to the new clone.
@@ -155,7 +169,10 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
          /* Recursive inlining never wants the master clone to
             be overwritten.  */
          && update_original
-         && can_remove_node_now_p (e->callee, e))
+         && can_remove_node_now_p (e->callee, e)
+         /* We cannot overwrite a master clone with non-inline clones
+            until after these clones are materialized.  */
+         && !master_clone_with_noninline_clones_p (e->callee))
        {
          /* TODO: When callee is in a comdat group, we could remove all of it,
             including all inline clones inlined into it.  That would however