profile.c (branch_prob): Call to init_edge_profiler added.
authorAndreas Krebbel <krebbel1@de.ibm.com>
Thu, 28 Oct 2004 16:19:26 +0000 (16:19 +0000)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 28 Oct 2004 16:19:26 +0000 (16:19 +0000)
* profile.c (branch_prob): Call to init_edge_profiler added.
* rtl-profile.c (rtl_init_edge_profiler): New function.
(rtl_gen_edge_profiler): Replaced call to insert_insn_on_edge with
call to safe_insert_insn_on_edge.
(rtl_profile_hooks): rtl_init_edge_profiler added.
* tree-profile.c (tree_init_edge_profiler): New function.
(tree_profile_hooks): tree_init_edge_profiler added.
* value-prof.h (profile_hooks) init_edge_profiler prototype added.

From-SVN: r89764

gcc/ChangeLog
gcc/profile.c
gcc/rtl-profile.c
gcc/tree-profile.c
gcc/value-prof.h

index 52538cb0b13dcd91d931e5ea10bb1eacecd4309a..37eafb850e00eddbd75d3058764d7aa354a264f6 100644 (file)
@@ -1,3 +1,14 @@
+2004-10-28  Andreas Krebbel  <krebbel1@de.ibm.com>
+
+       * profile.c (branch_prob): Call to init_edge_profiler added.
+       * rtl-profile.c (rtl_init_edge_profiler): New function.
+       (rtl_gen_edge_profiler): Replaced call to insert_insn_on_edge with
+       call to safe_insert_insn_on_edge.
+       (rtl_profile_hooks): rtl_init_edge_profiler added.
+       * tree-profile.c (tree_init_edge_profiler): New function.
+       (tree_profile_hooks): tree_init_edge_profiler added.
+       * value-prof.h (profile_hooks) init_edge_profiler prototype added.
+
 2004-10-28  Nick Clifton  <nickc@redhat.com>
 
        * config/iq2000/iq2000.c (iq2000_expand_epilogue): Use
index ff85544e595d5845827b3e97ece809250911e5dd..5a0cc60cfdc02ea04580f7254973b2c4d2361629 100644 (file)
@@ -1095,7 +1095,11 @@ branch_prob (void)
   if (profile_arc_flag
       && coverage_counter_alloc (GCOV_COUNTER_ARCS, num_instrumented))
     {
-      unsigned n_instrumented = instrument_edges (el);
+      unsigned n_instrumented;
+
+      profile_hooks->init_edge_profiler ();
+
+      n_instrumented = instrument_edges (el);
 
       if (n_instrumented != num_instrumented)
        abort ();
index 2d0c69ccb9162bfdf9fcd8930f334489836ad6a8..3439f472b7bd37d5c044e0e1412fd4e12ea045f1 100644 (file)
@@ -64,6 +64,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "tree.h"
 #include "ggc.h"
 
+/* Do initialization work for the edge profiler.  */
+
+static void
+rtl_init_edge_profiler (void)
+{
+  /* gen_edge_profiler calls safe_insert_insn_on_edge which needs
+     register liveness data to be available.  */
+  life_analysis (NULL, 0);
+}
+
 /* Output instructions as RTL to increment the edge execution count.  */
 
 static void
@@ -85,7 +95,7 @@ rtl_gen_edge_profiler (int edgeno, edge e)
 
   sequence = get_insns ();
   end_sequence ();
-  insert_insn_on_edge (sequence, e);
+  safe_insert_insn_on_edge (sequence, e);
   rebuild_jump_labels (e->insns.r);
 }
 
@@ -413,6 +423,7 @@ static FILE *rtl_profile_dump_file (void) {
 \f
 struct profile_hooks rtl_profile_hooks =
 {
+  rtl_init_edge_profiler,
   rtl_gen_edge_profiler,
   rtl_gen_interval_profiler,
   rtl_gen_pow2_profiler,
index 00c36e233ec52a1c051202fc8c8ac9e4d9f669e7..145c72131581d95d98bdfae8b478814abdb5adc4 100644 (file)
@@ -69,6 +69,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "value-prof.h"
 
 \f
+
+/* Do initialization work for the edge profiler.  */
+
+static void
+tree_init_edge_profiler (void)
+{
+}
+
 /* Output instructions as GIMPLE trees to increment the edge 
    execution count, and insert them on E.  We rely on 
    bsi_insert_on_edge to preserve the order.  */
@@ -195,6 +203,7 @@ struct tree_opt_pass pass_tree_profile =
 
 struct profile_hooks tree_profile_hooks =
 {
+  tree_init_edge_profiler,      /* init_edge_profiler */
   tree_gen_edge_profiler,      /* gen_edge_profiler */
   tree_gen_interval_profiler,   /* gen_interval_profiler */
   tree_gen_pow2_profiler,       /* gen_pow2_profiler */
index e1c27790d20a5048726b602d0eba8d6aa3676783..b9d0d0663b2818c620089ef0388dc84f52750b21 100644 (file)
@@ -80,6 +80,10 @@ extern bool value_profile_transformations (void);
 \f
 /* External declarations for edge-based profiling.  */
 struct profile_hooks {
+
+  /* Insert code to initialize edge profiler.  */
+  void (*init_edge_profiler) (void);
+
   /* Insert code to increment an edge count.  */
   void (*gen_edge_profiler) (int, edge);