Fix profiling on functions with nonlocal labels

Jan Hubicka jh@suse.cz
Sat Sep 13 23:01:00 GMT 2008


Hi,
Ada fails to build in profiledbootstrap because we add function calls to
functions containing nonlocal label.  Those calles are supposed to have
abnormal edges, but doesn't.  Fixed thus.

Profilebootstrapped/regtested x86_64-linux, will commit it shortly.

Honza

	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.
Index: tree-profile.c
===================================================================
--- tree-profile.c	(revision 140348)
+++ tree-profile.c	(working copy)
@@ -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_va
   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 
 				      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_v
 				      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_val
 				      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 v
 				      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.



More information about the Gcc-patches mailing list