This fixes PR46188 on the 4.5 branch by backporting rev. 159907.  Instead
of carrying over the checking bits I simply removed them on the branch
(they had one trivial fallout originally, PR44295).

Bootstrapped and tested on x86_64-unknown-linux-gnu, {,-m32} for
all languages including Ada and Objective-C++ with checking enabled.

I wasn't able to distill a testcase without output to stdout.

Installed on the branch.

Richard.

2011-04-19  Richard Guenther  <rguent...@suse.de>

        PR tree-optimization/46188
        Backported from 4.6 branch
        2010-05-26  Jan Hubicka  <j...@suse.cz>

        * cgraphunit.c (clone_of_p): Remove.
        (verify_cgraph_node): Do not verify clones.
        (cgraph_materialize_all_clones): Do no redirection here.
        * ipa-inline.c (inline_transform): Do redirection here.

Index: gcc/cgraphunit.c
===================================================================
--- gcc/cgraphunit.c    (revision 172653)
+++ gcc/cgraphunit.c    (working copy)
@@ -553,15 +553,6 @@ cgraph_mark_if_needed (tree decl)
     cgraph_mark_needed_node (node);
 }
 
-/* Return TRUE if NODE2 is equivalent to NODE or its clone.  */
-static bool
-clone_of_p (struct cgraph_node *node, struct cgraph_node *node2)
-{
-  while (node != node2 && node2)
-    node2 = node2->clone_of;
-  return node2 != NULL;
-}
-
 /* Verify cgraph nodes of given cgraph node.  */
 void
 verify_cgraph_node (struct cgraph_node *node)
@@ -777,16 +768,6 @@ verify_cgraph_node (struct cgraph_node *
                            debug_tree (e->callee->decl);
                            error_found = true;
                          }
-                       else if (!node->global.inlined_to
-                                && !e->callee->global.inlined_to
-                                && !clone_of_p (cgraph_node (decl), e->callee))
-                         {
-                           error ("edge points to wrong declaration:");
-                           debug_tree (e->callee->decl);
-                           fprintf (stderr," Instead of:");
-                           debug_tree (decl);
-                           error_found = true;
-                         }
                        e->aux = (void *)1;
                      }
                    else
@@ -2397,30 +2378,7 @@ cgraph_materialize_all_clones (void)
     if (!node->analyzed && node->callees)
       cgraph_node_remove_callees (node);
   if (cgraph_dump_file)
-    fprintf (cgraph_dump_file, "Updating call sites\n");
-  for (node = cgraph_nodes; node; node = node->next)
-    if (node->analyzed && !node->clone_of
-       && gimple_has_body_p (node->decl))
-      {
-        struct cgraph_edge *e;
-
-       current_function_decl = node->decl;
-        push_cfun (DECL_STRUCT_FUNCTION (node->decl));
-       for (e = node->callees; e; e = e->next_callee)
-         cgraph_redirect_edge_call_stmt_to_callee (e);
-       pop_cfun ();
-       current_function_decl = NULL;
-#ifdef ENABLE_CHECKING
-        verify_cgraph_node (node);
-#endif
-      }
-  if (cgraph_dump_file)
     fprintf (cgraph_dump_file, "Materialization Call site updates done.\n");
-  /* All changes to parameters have been performed.  In order not to
-     incorrectly repeat them, we simply dispose of the bitmaps that drive the
-     changes. */
-  for (node = cgraph_nodes; node; node = node->next)
-    node->clone.combined_args_to_skip = NULL;
 #ifdef ENABLE_CHECKING
   verify_cgraph ();
 #endif
Index: gcc/ipa-inline.c
===================================================================
--- gcc/ipa-inline.c    (revision 172653)
+++ gcc/ipa-inline.c    (working copy)
@@ -2092,6 +2092,7 @@ inline_transform (struct cgraph_node *no
 {
   unsigned int todo = 0;
   struct cgraph_edge *e;
+  bool inline_p = false;
 
   /* FIXME: Currently the passmanager is adding inline transform more than 
once to some
      clones.  This needs revisiting after WPA cleanups.  */
@@ -2104,10 +2105,13 @@ inline_transform (struct cgraph_node *no
     save_inline_function_body (node);
 
   for (e = node->callees; e; e = e->next_callee)
-    if (!e->inline_failed || warn_inline)
-      break;
+    {
+      cgraph_redirect_edge_call_stmt_to_callee (e);
+      if (!e->inline_failed || warn_inline)
+       inline_p = true;
+    }
 
-  if (e)
+  if (inline_p)
     {
       timevar_push (TV_INTEGRATION);
       todo = optimize_inline_calls (current_function_decl);

Reply via email to