Commit 5ded7254 by Jan Hubicka Committed by Jan Hubicka

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
parent a8f82ec4
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
......
......@@ -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];
......
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
......
/* { 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" } } */
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment