diff options
author | Jan Hubicka <jh@suse.cz> | 2005-08-01 11:51:17 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2005-08-01 09:51:17 +0000 |
commit | 5ded72541370aaeb3dd3d07c46ad16302df0329f (patch) | |
tree | 52b69359b3f87422c526ceaffce8a62c3eb41364 | |
parent | a8f82ec4377e4a314ec3d602f8f1f603bd76b749 (diff) | |
download | gcc-5ded72541370aaeb3dd3d07c46ad16302df0329f.tar.gz |
profile.c (compute_value_histograms): Fix thinko.
* profile.c (compute_value_histograms): Fix thinko.
* value-prof.c: Include toplev.h
(check_counter): New function.
(tree_divmod_fixed_value_transform, tree_mod_pow2_value_transform,
tree_mod_subtract_transform): Add sanity check.
* val-prof-5.c: New test.
From-SVN: r102629
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/profile.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c | 17 | ||||
-rw-r--r-- | gcc/value-prof.c | 30 |
5 files changed, 61 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a4818a44f70..3aeffc077a0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-08-01 Jan Hubicka <jh@suse.cz> + + * profile.c (compute_value_histograms): Fix thinko. + * value-prof.c: Include toplev.h + (check_counter): New function. + (tree_divmod_fixed_value_transform, tree_mod_pow2_value_transform, + tree_mod_subtract_transform): Add sanity check. + 2005-08-01 Richard Guenther <rguenther@suse.de> PR tree-optimization/23133 diff --git a/gcc/profile.c b/gcc/profile.c index 113927fd44a..95448f076ff 100644 --- a/gcc/profile.c +++ b/gcc/profile.c @@ -651,14 +651,13 @@ compute_value_histograms (histogram_values values) gcov_type *histogram_counts[GCOV_N_VALUE_COUNTERS]; gcov_type *act_count[GCOV_N_VALUE_COUNTERS]; gcov_type *aact_count; - histogram_value hist = 0; for (t = 0; t < GCOV_N_VALUE_COUNTERS; t++) n_histogram_counters[t] = 0; for (i = 0; i < VEC_length (histogram_value, values); i++) { - hist = VEC_index (histogram_value, values, i); + histogram_value hist = VEC_index (histogram_value, values, i); n_histogram_counters[(int) hist->type] += hist->n_counters; } @@ -683,10 +682,10 @@ compute_value_histograms (histogram_values values) for (i = 0; i < VEC_length (histogram_value, values); i++) { + histogram_value hist = VEC_index (histogram_value, values, i); tree stmt = hist->hvalue.stmt; stmt_ann_t ann = get_stmt_ann (stmt); - hist = VEC_index (histogram_value, values, i); t = (int) hist->type; aact_count = act_count[t]; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29b67a95024..a4dc061c663 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-08-01 Jan Hubicka <jh@suse.cz> + + * val-prof-5.c: New test. + 2005-08-01 Joseph S. Myers <joseph@codesourcery.com> PR c/22311 diff --git a/gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c b/gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c new file mode 100644 index 00000000000..41a43c3a965 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c @@ -0,0 +1,17 @@ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */ +int a[1000]; +int b=997; +main() +{ + int i; + for (i = 0; i < 1000; i++) + if (a[i]) + a[i]/=b; + else + a[i]/=b; + return 0; +} +/* { dg-final-use { scan-tree-dump "Div.mod by constant b..=997 transformation on insn" "tree_profile"} } */ +/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ +/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ diff --git a/gcc/value-prof.c b/gcc/value-prof.c index b9594f1fbe7..7782fa3786d 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -42,6 +42,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "gcov-io.h" #include "timevar.h" #include "tree-pass.h" +#include "toplev.h" static struct value_prof_hooks *value_prof_hooks; @@ -85,6 +86,25 @@ static bool tree_divmod_fixed_value_transform (tree); static bool tree_mod_pow2_value_transform (tree); static bool tree_mod_subtract_transform (tree); +/* The overall number of invocations of the counter should match execution count + of basic block. Report it as error rather than internal error as it might + mean that user has missused the profile somehow. */ +static bool +check_counter (tree stmt, const char * name, gcov_type all, gcov_type bb_count) +{ + if (all != bb_count) + { + location_t * locus; + locus = (stmt != NULL && EXPR_HAS_LOCATION (stmt) + ? EXPR_LOCUS (stmt) + : &DECL_SOURCE_LOCATION (current_function_decl)); + error ("%HCorrupted value profile: %s profiler overall count (%d) does not match BB count (%d)", + locus, name, (int)all, (int)bb_count); + return true; + } + return false; +} + /* Tree based transformations. */ static bool tree_value_profile_transformations (void) @@ -286,6 +306,9 @@ tree_divmod_fixed_value_transform (tree stmt) if (simple_cst_equal (op2, value) != 1 || 2 * count < all) return false; + if (check_counter (stmt, "value", all, bb_for_stmt (stmt)->count)) + return false; + /* Compute probability of taking the optimal path. */ prob = (count * REG_BR_PROB_BASE + all / 2) / all; @@ -457,6 +480,9 @@ tree_mod_pow2_value_transform (tree stmt) /* Compute probability of taking the optimal path. */ all = count + wrong_values; + if (check_counter (stmt, "pow2", all, bb_for_stmt (stmt)->count)) + return false; + prob = (count * REG_BR_PROB_BASE + all / 2) / all; result = tree_mod_pow2 (stmt, op, op1, op2, prob, count, all); @@ -631,6 +657,10 @@ tree_mod_subtract_transform (tree stmt) wrong_values += histogram->hvalue.counters[i+1]; all += wrong_values; + /* Compute probability of taking the optimal path. */ + if (check_counter (stmt, "interval", all, bb_for_stmt (stmt)->count)) + return false; + /* We require that we use just subtractions in at least 50% of all evaluations. */ count = 0; |