diff options
author | Jan Hubicka <jh@suse.cz> | 2008-09-13 21:39:44 +0000 |
---|---|---|
committer | Jan Hubicka <jh@suse.cz> | 2008-09-13 21:39:44 +0000 |
commit | 56bf52efd2981509789100300b41912d796df95e (patch) | |
tree | 97a3cbb787754f48e7868c06c9bac3e7fb3b3fa6 /gcc/tree-profile.c | |
parent | 101b7f96de8684baa68b5752697ce42f9b58fb7e (diff) |
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: https://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.c | 32 |
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. |