value-prof.c: New.

* value-prof.c: New.
	* value-prof.h: New.

From-SVN: r68521
This commit is contained in:
Zdenek Dvorak 2003-06-26 09:38:34 +00:00
parent 603ff6b50a
commit 1c72f4ef67
2 changed files with 165 additions and 0 deletions

106
gcc/value-prof.c Normal file
View File

@ -0,0 +1,106 @@
/* Transformations based on profile information for values.
Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "rtl.h"
#include "expr.h"
#include "hard-reg-set.h"
#include "basic-block.h"
#include "value-prof.h"
#include "output.h"
#include "flags.h"
#include "insn-config.h"
#include "recog.h"
#include "optabs.h"
/* In this file value profile based optimizations will be placed (none are
here just now, but they are hopefully coming soon).
Every such optimization should add its requirements for profiled values to
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-probablities (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). */
static void insn_values_to_profile (rtx, unsigned *, struct histogram_value **);
/* Release the list of VALUES of length N_VALUES for that we want to measure
histograms. */
void
free_profiled_values (unsigned n_values ATTRIBUTE_UNUSED,
struct histogram_value *values)
{
free (values);
}
/* Find values inside INSN for that we want to measure histograms and adds
them to list VALUES (increasing the record of its length in N_VALUES). */
static void
insn_values_to_profile (rtx insn ATTRIBUTE_UNUSED,
unsigned *n_values ATTRIBUTE_UNUSED,
struct histogram_value **values ATTRIBUTE_UNUSED)
{
}
/* Find list of values for that we want to measure histograms. */
void
find_values_to_profile (unsigned *n_values, struct histogram_value **values)
{
rtx insn;
unsigned i;
*n_values = 0;
*values = NULL;
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
insn_values_to_profile (insn, n_values, values);
for (i = 0; i < *n_values; i++)
{
switch ((*values)[i].type)
{
case HIST_TYPE_INTERVAL:
(*values)[i].n_counters = (*values)[i].hdata.intvl.steps +
((*values)[i].hdata.intvl.may_be_less ? 1 : 0) +
((*values)[i].hdata.intvl.may_be_more ? 1 : 0);
break;
case HIST_TYPE_POW2:
(*values)[i].n_counters = GET_MODE_BITSIZE ((*values)[i].mode) +
((*values)[i].hdata.pow2.may_be_other ? 1 : 0);
break;
case HIST_TYPE_SINGLE_VALUE:
(*values)[i].n_counters = 3;
break;
case HIST_TYPE_CONST_DELTA:
(*values)[i].n_counters = 4;
break;
default:
abort ();
}
}
}

59
gcc/value-prof.h Normal file
View File

@ -0,0 +1,59 @@
/* Definitions for transformations based on profile information for values.
Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
/* Supported histogram types. */
enum hist_type
{
HIST_TYPE_INTERVAL, /* Measures histogram of values inside a specified
interval. */
HIST_TYPE_POW2, /* Histogram of power of 2 values. */
HIST_TYPE_SINGLE_VALUE, /* Tries to identify the value that is (almost)
always constant. */
HIST_TYPE_CONST_DELTA /* Tries to identify the (almost) always constant
difference between two evaluations of a value. */
};
/* The value to measure. */
struct histogram_value
{
rtx value; /* The value to profile. */
enum machine_mode mode; /* And its mode. */
rtx seq; /* Insns requiered to count the profiled value. */
rtx insn; /* Insn before that to measure. */
enum hist_type type; /* Type of information to measure. */
unsigned n_counters; /* Number of requiered counters. */
union
{
struct
{
int int_start; /* First value in interval. */
int steps; /* Number of values in it. */
int may_be_less; /* May the value be below? */
int may_be_more; /* Or above. */
} intvl; /* Interval histogram data. */
struct
{
int may_be_other; /* If the value may be non-positive or not 2^k. */
} pow2; /* Power of 2 histogram data. */
} hdata; /* Profiled information specific data. */
};
extern void find_values_to_profile (unsigned *, struct histogram_value **);
extern void free_profiled_values (unsigned, struct histogram_value *);