cgraph.c (cgraph_clone_edge): Make the scale gcov_type.
authorJan Hubicka <jh@suse.cz>
Sat, 24 Sep 2005 12:43:30 +0000 (14:43 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 24 Sep 2005 12:43:30 +0000 (12:43 +0000)
* cgraph.c (cgraph_clone_edge): Make the scale gcov_type.
(cgraph_clone_node): Likewise.
* cgraph.h (cgraph_clone_edge): Update prototype.
(cgraph_mark_inline_edge, cgraph_clone_inlined_nodes): Remove
duplicated prototypes; add updating argument.
* cgraphunit.c (verify_cgraph_node): Verify that counts are non-negative.
* ipa-inline.c (cgraph_clone_inlined_nodes): Allow clonning without
updating profile.
(cgraph_mark_inline_edge): Likewise.
(cgraph_mark_inline): Update use of cgraph_mark_inline_edge.
(cgraph_flatten_node): Likewise.
(cgraph_decide_recursive_inlining): Likewise.
(cgraph_decide_inlining_of_small_function): Likewise.
* tree-optimize.c (tree_rest_of_compilation): Likewise.

From-SVN: r104601

gcc/ChangeLog
gcc/cgraph.c
gcc/cgraph.h
gcc/cgraphunit.c
gcc/ipa-inline.c
gcc/tree-optimize.c

index 9327a19ea24565958ae6dab7fa93384ce2037df9..48bf6152168e652a4d785046fb1ccf2823cfd05c 100644 (file)
@@ -1,3 +1,20 @@
+2005-09-24  Jan Hubicka  <jh@suse.cz>
+
+       * cgraph.c (cgraph_clone_edge): Make the scale gcov_type.
+       (cgraph_clone_node): Likewise.
+       * cgraph.h (cgraph_clone_edge): Update prototype.
+       (cgraph_mark_inline_edge, cgraph_clone_inlined_nodes): Remove
+       duplicated prototypes; add updating argument.
+       * cgraphunit.c (verify_cgraph_node): Verify that counts are non-negative.
+       * ipa-inline.c (cgraph_clone_inlined_nodes): Allow clonning without
+       updating profile.
+       (cgraph_mark_inline_edge): Likewise.
+       (cgraph_mark_inline): Update use of cgraph_mark_inline_edge.
+       (cgraph_flatten_node): Likewise.
+       (cgraph_decide_recursive_inlining): Likewise.
+       (cgraph_decide_inlining_of_small_function): Likewise.
+       * tree-optimize.c (tree_rest_of_compilation): Likewise.
+
 2005-09-23  David Edelsohn  <edelsohn@gnu.org>
            Pete Steinmetz <steinmtz@us.ibm.com>
 
index 7a67f6d0da88a7e8e287abaa160f93ae9e8e5c95..32fbe3097391878eb90dd88f9a0c5e3dff92914d 100644 (file)
@@ -884,7 +884,7 @@ cgraph_function_possibly_inlined_p (tree decl)
 /* Create clone of E in the node N represented by CALL_EXPR the callgraph.  */
 struct cgraph_edge *
 cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
-                  tree call_stmt, int count_scale, int loop_nest,
+                  tree call_stmt, gcov_type count_scale, int loop_nest,
                   bool update_original)
 {
   struct cgraph_edge *new;
@@ -911,7 +911,7 @@ cgraph_clone_node (struct cgraph_node *n, gcov_type count, int loop_nest,
 {
   struct cgraph_node *new = cgraph_create_node ();
   struct cgraph_edge *e;
-  int count_scale;
+  gcov_type count_scale;
 
   new->decl = n->decl;
   new->origin = n->origin;
index ccb2cdd3b644bb90d942fbfd0bceaf1e0b518a4b..42a74f549b47efe0bb3644936f409ce215769af4 100644 (file)
@@ -242,7 +242,7 @@ struct cgraph_rtl_info *cgraph_rtl_info (tree);
 const char * cgraph_node_name (struct cgraph_node *);
 struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *,
                                        struct cgraph_node *,
-                                       tree, int, int, bool);
+                                       tree, gcov_type, int, bool);
 struct cgraph_node * cgraph_clone_node (struct cgraph_node *, gcov_type,
                                        int, bool);
 
@@ -276,8 +276,6 @@ bool cgraph_inline_p (struct cgraph_edge *, const char **reason);
 bool cgraph_preserve_function_body_p (tree);
 void verify_cgraph (void);
 void verify_cgraph_node (struct cgraph_node *);
-void cgraph_mark_inline_edge (struct cgraph_edge *e);
-void cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate);
 void cgraph_build_static_cdtor (char which, tree body, int priority);
 void cgraph_reset_static_var_maps (void);
 void init_cgraph (void);
@@ -290,7 +288,7 @@ int cgraph_postorder (struct cgraph_node **);
 
 /* In ipa-inline.c  */
 bool cgraph_decide_inlining_incrementally (struct cgraph_node *, bool);
-void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool);
-void cgraph_mark_inline_edge (struct cgraph_edge *);
+void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool, bool);
+void cgraph_mark_inline_edge (struct cgraph_edge *, bool);
 bool cgraph_default_inline_p (struct cgraph_node *, const char **);
 #endif  /* GCC_CGRAPH_H  */
index e357a25d9e413f40c49765b5410a648a35044313..181ee4e6329aedf9796bc22909bce19c1d75499a 100644 (file)
@@ -663,8 +663,18 @@ verify_cgraph_node (struct cgraph_node *node)
               cgraph_node_name (e->caller), cgraph_node_name (e->callee));
        error_found = true;
       }
+  if (node->count < 0)
+    {
+      error ("Execution count is negative");
+      error_found = true;
+    }
   for (e = node->callers; e; e = e->next_caller)
     {
+      if (e->count < 0)
+       {
+         error ("caller edge count is negative");
+         error_found = true;
+       }
       if (!e->inline_failed)
        {
          if (node->global.inlined_to
index 927813e2d7489f81548366e4a2483b2abf77f6ee..d91ca669765023dc6bf64a99174721a22a9cf4e7 100644 (file)
@@ -113,7 +113,7 @@ cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
    clones or re-using node originally representing out-of-line function call.
    */
 void
-cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate)
+cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, bool update_original)
 {
   struct cgraph_node *n;
 
@@ -131,7 +131,7 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate)
     }
    else if (duplicate)
     {
-      n = cgraph_clone_node (e->callee, e->count, e->loop_nest, true);
+      n = cgraph_clone_node (e->callee, e->count, e->loop_nest, update_original);
       cgraph_redirect_edge_callee (e, n);
     }
 
@@ -143,13 +143,15 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate)
   /* Recursively clone all bodies.  */
   for (e = e->callee->callees; e; e = e->next_callee)
     if (!e->inline_failed)
-      cgraph_clone_inlined_nodes (e, duplicate);
+      cgraph_clone_inlined_nodes (e, duplicate, update_original);
 }
 
-/* Mark edge E as inlined and update callgraph accordingly.  */
+/* Mark edge E as inlined and update callgraph accordingly. 
+   UPDATE_ORIGINAL specify whether profile of original function should be
+   updated. */
 
 void
-cgraph_mark_inline_edge (struct cgraph_edge *e)
+cgraph_mark_inline_edge (struct cgraph_edge *e, bool update_original)
 {
   int old_insns = 0, new_insns = 0;
   struct cgraph_node *to = NULL, *what;
@@ -161,7 +163,7 @@ cgraph_mark_inline_edge (struct cgraph_edge *e)
     DECL_POSSIBLY_INLINED (e->callee->decl) = true;
   e->callee->global.inlined = true;
 
-  cgraph_clone_inlined_nodes (e, true);
+  cgraph_clone_inlined_nodes (e, true, update_original);
 
   what = e->callee;
 
@@ -200,7 +202,7 @@ cgraph_mark_inline (struct cgraph_edge *edge)
       next = e->next_caller;
       if (e->caller == to && e->inline_failed)
        {
-          cgraph_mark_inline_edge (e);
+          cgraph_mark_inline_edge (e, true);
          if (e == edge)
            edge = next;
          times++;
@@ -520,7 +522,7 @@ cgraph_flatten_node (struct cgraph_node *node, htab_t cycles)
        {
          if (dump_file)
            fprintf (dump_file, " inlining %s", cgraph_node_name (e->callee));
-          cgraph_mark_inline_edge (e);
+          cgraph_mark_inline_edge (e, true);
          cgraph_flatten_node (e->callee, cycles);
        }
       else if (dump_file)
@@ -571,7 +573,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node)
   master_clone->needed = true;
   for (e = master_clone->callees; e; e = e->next_callee)
     if (!e->inline_failed)
-      cgraph_clone_inlined_nodes (e, true);
+      cgraph_clone_inlined_nodes (e, true, false);
 
   /* Do the inlining and update list of recursive call during process.  */
   while (!fibheap_empty (heap)
@@ -623,7 +625,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node)
          fprintf (dump_file, "\n");
        }
       cgraph_redirect_edge_callee (curr, master_clone);
-      cgraph_mark_inline_edge (curr);
+      cgraph_mark_inline_edge (curr, false);
       lookup_recursive_calls (node, curr->callee, heap);
       n++;
     }
@@ -808,7 +810,7 @@ cgraph_decide_inlining_of_small_functions (void)
              continue;
            }
          callee = edge->callee;
-         cgraph_mark_inline_edge (edge);
+         cgraph_mark_inline_edge (edge, true);
          update_callee_keys (heap, callee, updated_nodes);
        }
       where = edge->caller;
@@ -930,7 +932,7 @@ cgraph_decide_inlining (void)
          if (cgraph_recursive_inlining_p (e->caller, e->callee,
                                           &e->inline_failed))
            continue;
-         cgraph_mark_inline_edge (e);
+         cgraph_mark_inline_edge (e, true);
          if (dump_file)
            fprintf (dump_file, 
                     " Inlined into %s which now has %i insns.\n",
index 782982eaf51f8c0a6e4545cdd2b6586c0d3e83cf..0678889c7722cbf8a9bb6a6046b65fd78e48cf32 100644 (file)
@@ -375,7 +375,7 @@ tree_rest_of_compilation (tree fndecl)
          saved_node = cgraph_clone_node (node, node->count, 1, false);
          for (e = saved_node->callees; e; e = e->next_callee)
            if (!e->inline_failed)
-             cgraph_clone_inlined_nodes (e, true);
+             cgraph_clone_inlined_nodes (e, true, false);
        }
       cfun->saved_static_chain_decl = cfun->static_chain_decl;
       save_body (fndecl, &cfun->saved_args, &cfun->saved_static_chain_decl);