mirror of git://gcc.gnu.org/git/gcc.git
combine.c (distribute_notes): Cancel REG_VALUE_PROFILE notes.
* combine.c (distribute_notes): Cancel REG_VALUE_PROFILE notes. * gcov-io.h (GCOV_FIRST_VALUE_COUNTER, GCOV_LAST_VALUE_COUNTER, GCOV_N_VALUE_COUNTERS): New. * profile.c (compute_value_histograms): New static function. (branch_prob): Read back the value histograms. * rtl.c (reg_note_name): Add name for REG_VALUE_PROFILE note. * rtl.h (enum reg_note): Add REG_VALUE_PROFILE note. * value-prof.c: Add comment on reading the profile. * value-prof.h (COUNTER_FOR_HIST_TYPE, HIST_TYPE_FOR_COUNTER): New. * doc/invoke.texi (-fprofile-values): Document behavior with -fbranch-probabilities. From-SVN: r69969
This commit is contained in:
parent
fd9b4d64fb
commit
6e885ee3ff
|
|
@ -1,3 +1,17 @@
|
|||
2003-07-30 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
|
||||
|
||||
* combine.c (distribute_notes): Cancel REG_VALUE_PROFILE notes.
|
||||
* gcov-io.h (GCOV_FIRST_VALUE_COUNTER, GCOV_LAST_VALUE_COUNTER,
|
||||
GCOV_N_VALUE_COUNTERS): New.
|
||||
* profile.c (compute_value_histograms): New static function.
|
||||
(branch_prob): Read back the value histograms.
|
||||
* rtl.c (reg_note_name): Add name for REG_VALUE_PROFILE note.
|
||||
* rtl.h (enum reg_note): Add REG_VALUE_PROFILE note.
|
||||
* value-prof.c: Add comment on reading the profile.
|
||||
* value-prof.h (COUNTER_FOR_HIST_TYPE, HIST_TYPE_FOR_COUNTER): New.
|
||||
* doc/invoke.texi (-fprofile-values): Document behavior with
|
||||
-fbranch-probabilities.
|
||||
|
||||
2003-07-30 David Edelsohn <edelsohn@gnu.org>
|
||||
|
||||
* longlong.h (PowerPC umul_ppmm): Do not test __vxworks__.
|
||||
|
|
|
|||
|
|
@ -12456,6 +12456,10 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2)
|
|||
place = i3;
|
||||
break;
|
||||
|
||||
case REG_VALUE_PROFILE:
|
||||
/* Just get rid of this note, as it is unused later anyway. */
|
||||
break;
|
||||
|
||||
case REG_VTABLE_REF:
|
||||
/* ??? Should remain with *a particular* memory load. Given the
|
||||
nature of vtable data, the last insn seems relatively safe. */
|
||||
|
|
|
|||
|
|
@ -4355,6 +4355,10 @@ exactly determine which path is taken more often.
|
|||
If combined with @option{-fprofile-arcs}, it adds code so that some
|
||||
data about values of expressions in the program is gathered.
|
||||
|
||||
With @option{-fbranch-probabilities}, it reads back the data gathered
|
||||
from profiling values of expressions and adds @samp{REG_VALUE_PROFILE}
|
||||
notes to instructions for their later usage in optimizations.
|
||||
|
||||
@item -fnew-ra
|
||||
@opindex fnew-ra
|
||||
Use a graph coloring register allocator. Currently this option is meant
|
||||
|
|
|
|||
|
|
@ -286,13 +286,24 @@ typedef HOST_WIDEST_INT gcov_type;
|
|||
#define GCOV_COUNTER_ARCS 0 /* Arc transitions. */
|
||||
#define GCOV_COUNTERS_SUMMABLE 1 /* Counters which can be
|
||||
summaried. */
|
||||
#define GCOV_FIRST_VALUE_COUNTER 1 /* The first of counters used for value
|
||||
profiling. They must form a consecutive
|
||||
interval and their order must match
|
||||
the order of HIST_TYPEs in
|
||||
value-prof.h. */
|
||||
#define GCOV_COUNTER_V_INTERVAL 1 /* Histogram of value inside an interval. */
|
||||
#define GCOV_COUNTER_V_POW2 2 /* Histogram of exact power2 logarithm
|
||||
of a value. */
|
||||
#define GCOV_COUNTER_V_SINGLE 3 /* The most common value of expression. */
|
||||
#define GCOV_COUNTER_V_DELTA 4 /* The most common difference between
|
||||
consecutive values of expression. */
|
||||
#define GCOV_LAST_VALUE_COUNTER 4 /* The last of counters used for value
|
||||
profiling. */
|
||||
#define GCOV_COUNTERS 5
|
||||
|
||||
/* Number of counters used for value profiling. */
|
||||
#define GCOV_N_VALUE_COUNTERS \
|
||||
(GCOV_LAST_VALUE_COUNTER - GCOV_FIRST_VALUE_COUNTER + 1)
|
||||
|
||||
/* A list of human readable names of the counters */
|
||||
#define GCOV_COUNTER_NAMES {"arcs", "interval", "pow2", "single", "delta"}
|
||||
|
|
|
|||
|
|
@ -117,6 +117,7 @@ static rtx gen_const_delta_profiler (struct histogram_value *, unsigned,
|
|||
static unsigned instrument_edges (struct edge_list *);
|
||||
static void instrument_values (unsigned, struct histogram_value *);
|
||||
static void compute_branch_probabilities (void);
|
||||
static void compute_value_histograms (unsigned, struct histogram_value *);
|
||||
static gcov_type * get_exec_counts (void);
|
||||
static basic_block find_group (basic_block);
|
||||
static void union_groups (basic_block, basic_block);
|
||||
|
|
@ -601,6 +602,57 @@ compute_branch_probabilities (void)
|
|||
free_aux_for_blocks ();
|
||||
}
|
||||
|
||||
/* Load value histograms for N_VALUES values whose description is stored
|
||||
in VALUES array from .da file. */
|
||||
static void
|
||||
compute_value_histograms (unsigned n_values, struct histogram_value *values)
|
||||
{
|
||||
unsigned i, j, t, any;
|
||||
unsigned n_histogram_counters[GCOV_N_VALUE_COUNTERS];
|
||||
gcov_type *histogram_counts[GCOV_N_VALUE_COUNTERS];
|
||||
gcov_type *act_count[GCOV_N_VALUE_COUNTERS];
|
||||
gcov_type *aact_count;
|
||||
|
||||
for (t = 0; t < GCOV_N_VALUE_COUNTERS; t++)
|
||||
n_histogram_counters[t] = 0;
|
||||
|
||||
for (i = 0; i < n_values; i++)
|
||||
n_histogram_counters[(int) (values[i].type)] += values[i].n_counters;
|
||||
|
||||
any = 0;
|
||||
for (t = 0; t < GCOV_N_VALUE_COUNTERS; t++)
|
||||
{
|
||||
histogram_counts[t] =
|
||||
get_coverage_counts (COUNTER_FOR_HIST_TYPE (t),
|
||||
n_histogram_counters[t], &profile_info);
|
||||
if (histogram_counts[t])
|
||||
any = 1;
|
||||
act_count[t] = histogram_counts[t];
|
||||
}
|
||||
if (!any)
|
||||
return;
|
||||
|
||||
for (i = 0; i < n_values; i++)
|
||||
{
|
||||
rtx hist_list = NULL_RTX;
|
||||
t = (int) (values[i].type);
|
||||
|
||||
aact_count = act_count[t];
|
||||
act_count[t] += values[i].n_counters;
|
||||
for (j = values[i].n_counters; j > 0; j--)
|
||||
hist_list = alloc_EXPR_LIST (0, GEN_INT (aact_count[j - 1]), hist_list);
|
||||
hist_list = alloc_EXPR_LIST (0, copy_rtx (values[i].value), hist_list);
|
||||
hist_list = alloc_EXPR_LIST (0, GEN_INT (values[i].type), hist_list);
|
||||
REG_NOTES (values[i].insn) =
|
||||
alloc_EXPR_LIST (REG_VALUE_PROFILE, hist_list,
|
||||
REG_NOTES (values[i].insn));
|
||||
}
|
||||
|
||||
for (t = 0; t < GCOV_N_VALUE_COUNTERS; t++)
|
||||
if (histogram_counts[t])
|
||||
free (histogram_counts[t]);
|
||||
}
|
||||
|
||||
/* Instrument and/or analyze program behavior based on program flow graph.
|
||||
In either case, this function builds a flow graph for the function being
|
||||
compiled. The flow graph is stored in BB_GRAPH.
|
||||
|
|
@ -886,7 +938,11 @@ branch_prob (void)
|
|||
}
|
||||
|
||||
if (flag_branch_probabilities)
|
||||
compute_branch_probabilities ();
|
||||
{
|
||||
compute_branch_probabilities ();
|
||||
if (flag_profile_values)
|
||||
compute_value_histograms (n_values, values);
|
||||
}
|
||||
|
||||
/* For each edge not on the spanning tree, add counting code as rtl. */
|
||||
if (profile_arc_flag
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ const char * const reg_note_name[] =
|
|||
"REG_RETVAL", "REG_LIBCALL", "REG_NONNEG",
|
||||
"REG_NO_CONFLICT", "REG_UNUSED", "REG_CC_SETTER", "REG_CC_USER",
|
||||
"REG_LABEL", "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_BR_PROB",
|
||||
"REG_NOALIAS", "REG_SAVE_AREA", "REG_BR_PRED",
|
||||
"REG_VALUE_PROFILE", "REG_NOALIAS", "REG_SAVE_AREA", "REG_BR_PRED",
|
||||
"REG_FRAME_RELATED_EXPR", "REG_EH_CONTEXT", "REG_EH_REGION",
|
||||
"REG_SAVE_NOTE", "REG_MAYBE_DEAD", "REG_NORETURN",
|
||||
"REG_NON_LOCAL_GOTO", "REG_SETJMP", "REG_ALWAYS_RETURN",
|
||||
|
|
|
|||
|
|
@ -684,6 +684,11 @@ enum reg_note
|
|||
return. */
|
||||
REG_BR_PROB,
|
||||
|
||||
/* REG_VALUE_PROFILE is attached when the profile is read in to an insn
|
||||
before that the code to profile the value is inserted. It contains
|
||||
the results of profiling. */
|
||||
REG_VALUE_PROFILE,
|
||||
|
||||
/* Attached to a call insn; indicates that the call is malloc-like and
|
||||
that the pointer returned cannot alias anything else. */
|
||||
REG_NOALIAS,
|
||||
|
|
|
|||
|
|
@ -40,9 +40,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
insn_values_to_profile function. This function is called from branch_prob
|
||||
in profile.c and the requested values are instrumented by it in the first
|
||||
compilation with -fprofile-arcs. The optimization may then read the
|
||||
gathered data in the second compilation with -fbranch-probabilities (the
|
||||
description of an exact way how to do it will be added here once the
|
||||
code responsible for reading of the data is merged). */
|
||||
gathered data in the second compilation with -fbranch-probablities.
|
||||
The measured data is appended as REG_VALUE_PROFILE note to the instrumented
|
||||
insn. The argument to the note consists of an EXPR_LIST where its
|
||||
members have the following meaning (from the first to the last):
|
||||
|
||||
-- type of information gathered (HIST_TYPE*)
|
||||
-- the expression that is profiled
|
||||
-- list of counters starting from the first one. */
|
||||
|
||||
static void insn_values_to_profile (rtx, unsigned *, struct histogram_value **);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,10 @@ enum hist_type
|
|||
difference between two evaluations of a value. */
|
||||
};
|
||||
|
||||
#define COUNTER_FOR_HIST_TYPE(TYPE) ((int) (TYPE) + GCOV_FIRST_VALUE_COUNTER)
|
||||
#define HIST_TYPE_FOR_COUNTER(COUNTER) \
|
||||
((enum hist_type) ((COUNTER) - GCOV_FIRST_VALUE_COUNTER))
|
||||
|
||||
/* The value to measure. */
|
||||
struct histogram_value
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue