OSDN Git Service

2005-06-03 Jerry DeLisle <jvdelisle@verizon.net>
[pf3gnuchains/gcc-fork.git] / gcc / profile.c
index b879aa0..b1514a5 100644 (file)
@@ -1,6 +1,6 @@
 /* Calculate branch probabilities, and basic block execution counts.
    Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004  Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2004, 2005  Free Software Foundation, Inc.
    Contributed by James E. Wilson, UC Berkeley/Cygnus Support;
    based on some ideas from Dain Samples of UC Berkeley.
    Further mangling by Bob Manson, Cygnus Support.
@@ -150,8 +150,7 @@ instrument_edges (struct edge_list *el)
 
          if (!inf->ignore && !inf->on_tree)
            {
-             if (e->flags & EDGE_ABNORMAL)
-               abort ();
+             gcc_assert (!(e->flags & EDGE_ABNORMAL));
              if (dump_file)
                fprintf (dump_file, "Edge %d to %d instrumented%s\n",
                         e->src->index, e->dest->index,
@@ -197,7 +196,7 @@ instrument_values (histogram_values values)
          break;
 
        default:
-         abort ();
+         gcc_unreachable ();
        }
       if (!coverage_counter_alloc (t, hist->n_counters))
        continue;
@@ -221,9 +220,10 @@ instrument_values (histogram_values values)
          break;
 
        default:
-         abort ();
+         gcc_unreachable ();
        }
     }
+  VEC_free (histogram_value, heap, values);
 }
 \f
 
@@ -429,8 +429,7 @@ compute_branch_probabilities (void)
                  /* Calculate count for remaining edge by conservation.  */
                  total = bb->count - total;
 
-                 if (! e)
-                   abort ();
+                 gcc_assert (e);
                  EDGE_INFO (e)->count_valid = 1;
                  e->count = total;
                  bi->succ_count--;
@@ -457,8 +456,7 @@ compute_branch_probabilities (void)
                  /* Calculate count for remaining edge by conservation.  */
                  total = bb->count - total + e->count;
 
-                 if (! e)
-                   abort ();
+                 gcc_assert (e);
                  EDGE_INFO (e)->count_valid = 1;
                  e->count = total;
                  bi->pred_count--;
@@ -480,8 +478,7 @@ compute_branch_probabilities (void)
      succ and pred count of zero.  */
   FOR_EACH_BB (bb)
     {
-      if (BB_INFO (bb)->succ_count || BB_INFO (bb)->pred_count)
-       abort ();
+      gcc_assert (!BB_INFO (bb)->succ_count && !BB_INFO (bb)->pred_count);
     }
 
   /* For every edge, calculate its branch probability and add a reg_note
@@ -641,7 +638,7 @@ compute_branch_probabilities (void)
 }
 
 /* Load value histograms values whose description is stored in VALUES array
-   from .da file.  */
+   from .gcda file.  */
 
 static void
 compute_value_histograms (histogram_values values)
@@ -688,21 +685,32 @@ compute_value_histograms (histogram_values values)
       hist = VEC_index (histogram_value, values, i);
       t = (int) hist->type;
 
-      /* FIXME: make this work for trees.  */
+      aact_count = act_count[t];
+      act_count[t] += hist->n_counters;
+
       if (!ir_type ())
        {
-         aact_count = act_count[t];
-         act_count[t] += hist->n_counters;
          for (j = hist->n_counters; j > 0; j--)
            hist_list = alloc_EXPR_LIST (0, GEN_INT (aact_count[j - 1]), 
                                        hist_list);
-             hist_list = alloc_EXPR_LIST (0, 
-                           copy_rtx ((rtx) hist->value), hist_list);
+         hist_list = alloc_EXPR_LIST (0, 
+                       copy_rtx (hist->hvalue.rtl.value), hist_list);
          hist_list = alloc_EXPR_LIST (0, GEN_INT (hist->type), hist_list);
-             REG_NOTES ((rtx) hist->insn) =
-                 alloc_EXPR_LIST (REG_VALUE_PROFILE, hist_list,
-                                  REG_NOTES ((rtx) hist->insn));
+         REG_NOTES (hist->hvalue.rtl.insn) =
+             alloc_EXPR_LIST (REG_VALUE_PROFILE, hist_list,
+                              REG_NOTES (hist->hvalue.rtl.insn));
        }
+      else
+       {
+         tree stmt = hist->hvalue.tree.stmt;
+         stmt_ann_t ann = get_stmt_ann (stmt);
+         hist->hvalue.tree.next = ann->histograms;
+         ann->histograms = hist;
+         hist->hvalue.tree.counters = 
+               xmalloc (sizeof (gcov_type) * hist->n_counters);
+         for (j = 0; j < hist->n_counters; j++)
+           hist->hvalue.tree.counters[j] = aact_count[j];
+       }
     }
 
   for (t = 0; t < GCOV_N_VALUE_COUNTERS; t++)
@@ -1104,8 +1112,7 @@ branch_prob (void)
 
       n_instrumented = instrument_edges (el);
 
-      if (n_instrumented != num_instrumented)
-       abort ();
+      gcc_assert (n_instrumented == num_instrumented);
 
       if (flag_profile_values)
        instrument_values (values);
@@ -1134,6 +1141,7 @@ branch_prob (void)
   free_edge_list (el);
   if (flag_branch_probabilities)
     profile_status = PROFILE_READ;
+  coverage_end_function ();
 }
 \f
 /* Union find algorithm implementation for the basic blocks using
@@ -1165,8 +1173,7 @@ union_groups (basic_block bb1, basic_block bb2)
 
   /* ??? I don't have a place for the rank field.  OK.  Lets go w/o it,
      this code is unlikely going to be performance problem anyway.  */
-  if (bb1g == bb2g)
-    abort ();
+  gcc_assert (bb1g != bb2g);
 
   bb1g->aux = bb2g;
 }
@@ -1310,9 +1317,8 @@ end_branch_prob (void)
 void
 tree_register_profile_hooks (void)
 {
+  gcc_assert (ir_type ());
   profile_hooks = &tree_profile_hooks;
-  if (!ir_type ())
-    abort ();
 }
 
 /* Set up hooks to enable RTL-based profiling.  */
@@ -1320,7 +1326,6 @@ tree_register_profile_hooks (void)
 void
 rtl_register_profile_hooks (void)
 {
+  gcc_assert (!ir_type ());
   profile_hooks = &rtl_profile_hooks;
-  if (ir_type ())
-    abort ();
 }