aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel1@de.ibm.com>2004-10-28 16:19:26 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2004-10-28 16:19:26 +0000
commitf3df9541367d65608af843d2a56f4519343e769e (patch)
tree5b78eb120055abb834a6216175418c0de85cefd4 /gcc
parent86ce0e3d22f4e6c973397e0fd65b2cf0dbfdf633 (diff)
downloadgcc-f3df9541367d65608af843d2a56f4519343e769e.zip
gcc-f3df9541367d65608af843d2a56f4519343e769e.tar.gz
gcc-f3df9541367d65608af843d2a56f4519343e769e.tar.bz2
profile.c (branch_prob): Call to init_edge_profiler added.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/profile.c6
-rw-r--r--gcc/rtl-profile.c13
-rw-r--r--gcc/tree-profile.c9
-rw-r--r--gcc/value-prof.h4
5 files changed, 41 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 52538cb..37eafb8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/profile.c b/gcc/profile.c
index ff85544..5a0cc60 100644
--- a/gcc/profile.c
+++ b/gcc/profile.c
@@ -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 ();
diff --git a/gcc/rtl-profile.c b/gcc/rtl-profile.c
index 2d0c69cc..3439f47 100644
--- a/gcc/rtl-profile.c
+++ b/gcc/rtl-profile.c
@@ -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) {
struct profile_hooks rtl_profile_hooks =
{
+ rtl_init_edge_profiler,
rtl_gen_edge_profiler,
rtl_gen_interval_profiler,
rtl_gen_pow2_profiler,
diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
index 00c36e2..145c721 100644
--- a/gcc/tree-profile.c
+++ b/gcc/tree-profile.c
@@ -69,6 +69,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "value-prof.h"
+
+/* 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 */
diff --git a/gcc/value-prof.h b/gcc/value-prof.h
index e1c2779..b9d0d06 100644
--- a/gcc/value-prof.h
+++ b/gcc/value-prof.h
@@ -80,6 +80,10 @@ extern bool value_profile_transformations (void);
/* 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);