OSDN Git Service

* gcc.dg/altivec-16.c: Use cleanup-saved-temps.
[pf3gnuchains/gcc-fork.git] / gcc / profile.c
index 93d79d0..25d1471 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.
@@ -224,6 +224,7 @@ instrument_values (histogram_values values)
          abort ();
        }
     }
+  VEC_free (histogram_value, values);
 }
 \f
 
@@ -569,10 +570,13 @@ compute_branch_probabilities (void)
            }
        }
       /* Otherwise try to preserve the existing REG_BR_PROB probabilities
-         tree based profile guessing put into code.  */
+         tree based profile guessing put into code.  BB can be the
+        ENTRY_BLOCK, and it can have multiple (fake) successors in
+        EH cases, but it still has no code; don't crash in this case.  */
       else if (profile_status == PROFILE_ABSENT
               && !ir_type ()
               && EDGE_COUNT (bb->succs) > 1
+              && BB_END (bb)
               && (note = find_reg_note (BB_END (bb), REG_BR_PROB, 0)))
        {
          int prob = INTVAL (XEXP (note, 0));
@@ -638,7 +642,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)
@@ -685,21 +689,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++)
@@ -1049,10 +1064,10 @@ branch_prob (void)
 
              /* Notice GOTO expressions we eliminated while constructing the
                 CFG.  */
-             if (EDGE_COUNT (bb->succs) == 1 && EDGE_SUCC (bb, 0)->goto_locus)
+             if (single_succ_p (bb) && single_succ_edge (bb)->goto_locus)
                {
                  /* ??? source_locus type is marked deprecated in input.h.  */
-                 source_locus curr_location = EDGE_SUCC (bb, 0)->goto_locus;
+                 source_locus curr_location = single_succ_edge (bb)->goto_locus;
                  /* ??? The FILE/LINE API is inconsistent for these cases.  */
 #ifdef USE_MAPPED_LOCATION 
                  output_location (LOCATION_FILE (curr_location),