summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2005-08-01 09:51:17 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2005-08-01 09:51:17 +0000
commit2ca9602aef62b968ae1b74dac3a6701800a8347f (patch)
tree52b69359b3f87422c526ceaffce8a62c3eb41364 /gcc
parent51b60a116d61e22b503d1d0061ab5046bccaa9b2 (diff)
downloadgcc-2ca9602aef62b968ae1b74dac3a6701800a8347f.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@102629 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/profile.c5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c17
-rw-r--r--gcc/value-prof.c30
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;