summaryrefslogtreecommitdiff
path: root/gcc/tree-profile.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2008-09-13 21:39:44 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2008-09-13 21:39:44 +0000
commit77fca8b537649e05a8609bf29a0ac5924851f56e (patch)
tree97a3cbb787754f48e7868c06c9bac3e7fb3b3fa6 /gcc/tree-profile.c
parent4465e65d39dc3f9f221f989be14f23f29e5bee27 (diff)
downloadgcc-77fca8b537649e05a8609bf29a0ac5924851f56e.tar.gz
PR middle-end/32581
* tree-profile.c (add_abnormal_goto_call_edges): New function. (tree_gen_interval_profiler, tree_gen_pow2_profiler, tree_gen_one_value_profiler, tree_gen_average_profiler, tree_gen_ic_func_profiler, tree_gen_ior_profiler): Use it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140349 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-profile.c')
-rw-r--r--gcc/tree-profile.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
index 20ded1b9f75..4467668a885 100644
--- a/gcc/tree-profile.c
+++ b/gcc/tree-profile.c
@@ -162,6 +162,20 @@ tree_init_edge_profiler (void)
}
}
+/* New call was added, make goto call edges if neccesary. */
+
+static void
+add_abnormal_goto_call_edges (gimple_stmt_iterator gsi)
+{
+ gimple stmt = gsi_stmt (gsi);
+
+ if (!stmt_can_make_abnormal_goto (stmt))
+ return;
+ if (!gsi_end_p (gsi))
+ split_block (gimple_bb (stmt), stmt);
+ make_abnormal_goto_edges (gimple_bb (stmt), true);
+}
+
/* Output instructions as GIMPLE trees to increment the edge
execution count, and insert them on E. We rely on
gsi_insert_on_edge to preserve the order. */
@@ -221,7 +235,8 @@ tree_gen_interval_profiler (histogram_value value, unsigned tag, unsigned base)
val = prepare_instrumented_value (&gsi, value);
call = gimple_build_call (tree_interval_profiler_fn, 4,
ref_ptr, val, start, steps);
- gsi_insert_before (&gsi, call, GSI_SAME_STMT);
+ gsi_insert_before (&gsi, call, GSI_NEW_STMT);
+ add_abnormal_goto_call_edges (gsi);
}
/* Output instructions as GIMPLE trees to increment the power of two histogram
@@ -241,7 +256,8 @@ tree_gen_pow2_profiler (histogram_value value, unsigned tag, unsigned base)
true, NULL_TREE, true, GSI_SAME_STMT);
val = prepare_instrumented_value (&gsi, value);
call = gimple_build_call (tree_pow2_profiler_fn, 2, ref_ptr, val);
- gsi_insert_before (&gsi, call, GSI_SAME_STMT);
+ gsi_insert_before (&gsi, call, GSI_NEW_STMT);
+ add_abnormal_goto_call_edges (gsi);
}
/* Output instructions as GIMPLE trees for code to find the most common value.
@@ -261,7 +277,8 @@ tree_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned base)
true, NULL_TREE, true, GSI_SAME_STMT);
val = prepare_instrumented_value (&gsi, value);
call = gimple_build_call (tree_one_value_profiler_fn, 2, ref_ptr, val);
- gsi_insert_before (&gsi, call, GSI_SAME_STMT);
+ gsi_insert_before (&gsi, call, GSI_NEW_STMT);
+ add_abnormal_goto_call_edges (gsi);
}
@@ -340,9 +357,10 @@ tree_gen_ic_func_profiler (void)
cur_func,
ic_void_ptr_var);
gsi_insert_after (&gsi, stmt1, GSI_NEW_STMT);
-
gcc_assert (EDGE_COUNT (bb->succs) == 1);
bb = split_edge (EDGE_I (bb->succs, 0));
+ add_abnormal_goto_call_edges (gsi);
+
gsi = gsi_start_bb (bb);
/* Set __gcov_indirect_call_callee to 0,
so that calls from other modules won't get misattributed
@@ -388,7 +406,8 @@ tree_gen_average_profiler (histogram_value value, unsigned tag, unsigned base)
true, GSI_SAME_STMT);
val = prepare_instrumented_value (&gsi, value);
call = gimple_build_call (tree_average_profiler_fn, 2, ref_ptr, val);
- gsi_insert_before (&gsi, call, GSI_SAME_STMT);
+ gsi_insert_before (&gsi, call, GSI_NEW_STMT);
+ add_abnormal_goto_call_edges (gsi);
}
/* Output instructions as GIMPLE trees to increment the ior histogram
@@ -408,7 +427,8 @@ tree_gen_ior_profiler (histogram_value value, unsigned tag, unsigned base)
true, NULL_TREE, true, GSI_SAME_STMT);
val = prepare_instrumented_value (&gsi, value);
call = gimple_build_call (tree_ior_profiler_fn, 2, ref_ptr, val);
- gsi_insert_before (&gsi, call, GSI_SAME_STMT);
+ gsi_insert_before (&gsi, call, GSI_NEW_STMT);
+ add_abnormal_goto_call_edges (gsi);
}
/* Return 1 if tree-based profiling is in effect, else 0.