coverage.h (tree_coverage_counter_addr): Declare.
authorRichard Guenther <rguenther@suse.de>
Sat, 8 Mar 2008 20:52:50 +0000 (20:52 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sat, 8 Mar 2008 20:52:50 +0000 (20:52 +0000)
2008-03-08  Richard Guenther  <rguenther@suse.de>

* coverage.h (tree_coverage_counter_addr): Declare.
* coverage.c (tree_coverage_counter_addr): New function.
* tree-profile.c (tree_gen_edge_profiler): Unshare counter
before using again.
(tree_gen_pow2_profiler): Use tree_coverage_counter_addr.
(tree_gen_one_value_profiler): Likewise.
(tree_gen_ic_profiler): Likewise.
(tree_gen_average_profiler): Likewise.
(tree_gen_ior_profiler): Likewise.

From-SVN: r133041

gcc/ChangeLog
gcc/coverage.c
gcc/coverage.h
gcc/tree-profile.c

index c1a187c..d17a993 100644 (file)
@@ -1,5 +1,17 @@
 2008-03-08  Richard Guenther  <rguenther@suse.de>
 
+       * coverage.h (tree_coverage_counter_addr): Declare.
+       * coverage.c (tree_coverage_counter_addr): New function.
+       * tree-profile.c (tree_gen_edge_profiler): Unshare counter
+       before using again.
+       (tree_gen_pow2_profiler): Use tree_coverage_counter_addr.
+       (tree_gen_one_value_profiler): Likewise.
+       (tree_gen_ic_profiler): Likewise.
+       (tree_gen_average_profiler): Likewise.
+       (tree_gen_ior_profiler): Likewise.
+
+2008-03-08  Richard Guenther  <rguenther@suse.de>
+
        * tree-ssa-sccvn.h (vn_binary_op_lookup): Remove.
        (vn_binary_op_insert): Likewise.
        (vn_unary_op_lookup): Likewise.
index 10db9de..f3a0152 100644 (file)
@@ -442,6 +442,23 @@ tree_coverage_counter_ref (unsigned counter, unsigned no)
   return build4 (ARRAY_REF, gcov_type_node, tree_ctr_tables[counter],
                 build_int_cst (NULL_TREE, no), NULL, NULL);
 }
+
+/* Generate a tree to access the address of COUNTER NO.  */
+
+tree
+tree_coverage_counter_addr (unsigned counter, unsigned no)
+{
+  tree gcov_type_node = get_gcov_type ();
+
+  gcc_assert (no < fn_n_ctrs[counter] - fn_b_ctrs[counter]);
+  no += prg_n_ctrs[counter] + fn_b_ctrs[counter];
+
+  /* "no" here is an array index, scaled to bytes later.  */
+  return build_fold_addr_expr (build4 (ARRAY_REF, gcov_type_node,
+                                      tree_ctr_tables[counter],
+                                      build_int_cst (NULL_TREE, no),
+                                      NULL, NULL));
+}
 \f
 /* Generate a checksum for a string.  CHKSUM is the current
    checksum.  */
index 9fa25f1..bf9917d 100644 (file)
@@ -38,6 +38,8 @@ extern int coverage_begin_output (void);
 extern int coverage_counter_alloc (unsigned /*counter*/, unsigned/*num*/);
 /* Use a counter from the most recent allocation.  */
 extern tree tree_coverage_counter_ref (unsigned /*counter*/, unsigned/*num*/);
+/* Use a counter address from the most recent allocation.  */
+extern tree tree_coverage_counter_addr (unsigned /*counter*/, unsigned/*num*/);
 
 /* Get all the counters for the current function.  */
 extern gcov_type *get_coverage_counts (unsigned /*counter*/,
index 00fbd86..57c9f5c 100644 (file)
@@ -181,7 +181,7 @@ tree_gen_edge_profiler (int edgeno, edge e)
   stmt2 = build_gimple_modify_stmt (gcov_type_tmp_var,
                                    build2 (PLUS_EXPR, gcov_type_node,
                                            gcov_type_tmp_var, one));
-  stmt3 = build_gimple_modify_stmt (ref, gcov_type_tmp_var);
+  stmt3 = build_gimple_modify_stmt (unshare_expr (ref), gcov_type_tmp_var);
   bsi_insert_on_edge (e, stmt1);
   bsi_insert_on_edge (e, stmt2);
   bsi_insert_on_edge (e, stmt3);
@@ -231,11 +231,10 @@ tree_gen_pow2_profiler (histogram_value value, unsigned tag, unsigned base)
 {
   tree stmt = value->hvalue.stmt;
   block_stmt_iterator bsi = bsi_for_stmt (stmt);
-  tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+  tree ref_ptr = tree_coverage_counter_addr (tag, base);
   tree call, val;
   
-  ref_ptr = force_gimple_operand_bsi (&bsi,
-                                     build_addr (ref, current_function_decl),
+  ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
                                      true, NULL_TREE, true, BSI_SAME_STMT);
   val = prepare_instrumented_value (&bsi, value);
   call = build_call_expr (tree_pow2_profiler_fn, 2, ref_ptr, val);
@@ -251,11 +250,10 @@ tree_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned base)
 {
   tree stmt = value->hvalue.stmt;
   block_stmt_iterator bsi = bsi_for_stmt (stmt);
-  tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+  tree ref_ptr = tree_coverage_counter_addr (tag, base);
   tree call, val;
   
-  ref_ptr = force_gimple_operand_bsi (&bsi,
-                                     build_addr (ref, current_function_decl),
+  ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
                                      true, NULL_TREE, true, BSI_SAME_STMT);
   val = prepare_instrumented_value (&bsi, value);
   call = build_call_expr (tree_one_value_profiler_fn, 2, ref_ptr, val);
@@ -275,10 +273,9 @@ tree_gen_ic_profiler (histogram_value value, unsigned tag, unsigned base)
   tree tmp1, stmt1, stmt2, stmt3;
   tree stmt = value->hvalue.stmt;
   block_stmt_iterator bsi = bsi_for_stmt (stmt);
-  tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+  tree ref_ptr = tree_coverage_counter_addr (tag, base);
 
-  ref_ptr = force_gimple_operand_bsi (&bsi,
-                                     build_addr (ref, current_function_decl),
+  ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
                                      true, NULL_TREE, true, BSI_SAME_STMT);
 
   /* Insert code:
@@ -367,11 +364,10 @@ tree_gen_average_profiler (histogram_value value, unsigned tag, unsigned base)
 {
   tree stmt = value->hvalue.stmt;
   block_stmt_iterator bsi = bsi_for_stmt (stmt);
-  tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+  tree ref_ptr = tree_coverage_counter_addr (tag, base);
   tree call, val;
   
-  ref_ptr = force_gimple_operand_bsi (&bsi,
-                                     build_addr (ref, current_function_decl),
+  ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
                                      true, NULL_TREE,
                                      true, BSI_SAME_STMT);
   val = prepare_instrumented_value (&bsi, value);
@@ -388,11 +384,10 @@ tree_gen_ior_profiler (histogram_value value, unsigned tag, unsigned base)
 {
   tree stmt = value->hvalue.stmt;
   block_stmt_iterator bsi = bsi_for_stmt (stmt);
-  tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+  tree ref_ptr = tree_coverage_counter_addr (tag, base);
   tree call, val;
   
-  ref_ptr = force_gimple_operand_bsi (&bsi,
-                                     build_addr (ref, current_function_decl),
+  ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
                                      true, NULL_TREE, true, BSI_SAME_STMT);
   val = prepare_instrumented_value (&bsi, value);
   call = build_call_expr (tree_ior_profiler_fn, 2, ref_ptr, val);