2003-06-26 11:38:34 +02:00
|
|
|
|
/* Transformations based on profile information for values.
|
bitmap.c, [...]: Update copyright.
* bitmap.c, bitmap.h, lambda-code.c, tree-dfa.c, tree-dump.c,
tree-dump.h, tree-ssa-loop-manip.c, value-prof.c,
config/mips/mips.md, config/rs6000/aix.h,
config/rs6000/beos.h, config/rs6000/sysv4.h: Update copyright.
From-SVN: r95064
2005-02-15 16:53:52 +01:00
|
|
|
|
Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
|
2003-06-26 11:38:34 +02:00
|
|
|
|
|
|
|
|
|
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"
|
2003-10-19 23:37:32 +02:00
|
|
|
|
#include "regs.h"
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
#include "ggc.h"
|
2003-06-26 11:38:34 +02:00
|
|
|
|
|
2004-05-13 08:41:07 +02:00
|
|
|
|
static struct value_prof_hooks *value_prof_hooks;
|
|
|
|
|
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
/* In this file value profile based optimizations are placed. Currently the
|
|
|
|
|
following optimizations are implemented (for more detailed descriptions
|
|
|
|
|
see comments at value_profile_transformations):
|
|
|
|
|
|
c-common.c, [...]: Fix comment typos.
* c-common.c, c-pch.c, defaults.h, lambda-code.c, passes.c,
tree-data-ref.c, tree-flow.h, tree-ssa-operands.c,
tree-ssa-threadupdate.c, tree-vectorizer.c, tree-vectorizer.h,
value-prof.c: Fix comment typos. Follow spelling conventions.
From-SVN: r87288
2004-09-10 12:44:48 +02:00
|
|
|
|
1) Division/modulo specialization. Provided that we can determine that the
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
operands of the division have some special properties, we may use it to
|
|
|
|
|
produce more effective code.
|
|
|
|
|
2) Speculative prefetching. If we are able to determine that the difference
|
|
|
|
|
between addresses accessed by a memory reference is usually constant, we
|
|
|
|
|
may add the prefetch instructions.
|
2003-06-26 11:38:34 +02:00
|
|
|
|
|
|
|
|
|
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
|
2003-08-20 01:22:00 +02:00
|
|
|
|
gathered data in the second compilation with -fbranch-probabilities.
|
2003-07-30 21:23:34 +02:00
|
|
|
|
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. */
|
2003-06-26 11:38:34 +02:00
|
|
|
|
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
/* For speculative prefetching, the range in that we do not prefetch (because
|
c-common.c, [...]: Fix comment typos.
* c-common.c, cfgexpand.c, cgraphunit.c, defaults.h,
et-forest.c, expr.c, gimplify.c, global.c, gthr-lynx.h,
hard-reg-set.h, modulo-sched.c, optabs.c, postreload-gcse.c,
tree-data-ref.c, tree-flow.h, tree-if-conv.c, tree-inline.c,
tree-sra.c, tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c,
tree-ssa-loop-niter.c, tree-ssa-operands.c,
tree-ssa-operands.h, tree-ssa-propagate.c,
tree-ssa-propagate.h, tree-ssa-threadupdate.c, value-prof.c,
vec.c, vec.h: Fix comment typos. Follow spelling conventions.
From-SVN: r87104
2004-09-05 17:24:15 +02:00
|
|
|
|
we assume that it will be in cache anyway). The asymmetry between min and
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
max range is trying to reflect the fact that the sequential prefetching
|
|
|
|
|
of the data is commonly done directly by hardware. Nevertheless, these
|
|
|
|
|
values are just a guess and should of course be target-specific. */
|
|
|
|
|
|
|
|
|
|
#ifndef NOPREFETCH_RANGE_MIN
|
|
|
|
|
#define NOPREFETCH_RANGE_MIN (-16)
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef NOPREFETCH_RANGE_MAX
|
|
|
|
|
#define NOPREFETCH_RANGE_MAX 32
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static void insn_divmod_values_to_profile (rtx, histogram_values *);
|
|
|
|
|
#ifdef HAVE_prefetch
|
|
|
|
|
static bool insn_prefetch_values_to_profile (rtx, histogram_values *);
|
|
|
|
|
static int find_mem_reference_1 (rtx *, void *);
|
|
|
|
|
static void find_mem_reference_2 (rtx, rtx, void *);
|
|
|
|
|
static bool find_mem_reference (rtx, rtx *, int *);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static void insn_values_to_profile (rtx, histogram_values *);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
static rtx gen_divmod_fixed_value (enum machine_mode, enum rtx_code, rtx, rtx,
|
2004-06-23 18:07:58 +02:00
|
|
|
|
rtx, gcov_type, int);
|
|
|
|
|
static rtx gen_mod_pow2 (enum machine_mode, enum rtx_code, rtx, rtx, rtx, int);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
static rtx gen_mod_subtract (enum machine_mode, enum rtx_code, rtx, rtx, rtx,
|
2004-06-23 18:07:58 +02:00
|
|
|
|
int, int, int);
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
#ifdef HAVE_prefetch
|
|
|
|
|
static rtx gen_speculative_prefetch (rtx, gcov_type, int);
|
|
|
|
|
#endif
|
2003-10-19 23:37:32 +02:00
|
|
|
|
static bool divmod_fixed_value_transform (rtx insn);
|
|
|
|
|
static bool mod_pow2_value_transform (rtx);
|
|
|
|
|
static bool mod_subtract_transform (rtx);
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
#ifdef HAVE_prefetch
|
|
|
|
|
static bool speculative_prefetching_transform (rtx);
|
|
|
|
|
#endif
|
2003-06-26 11:38:34 +02:00
|
|
|
|
|
2003-10-19 23:37:32 +02:00
|
|
|
|
/* Find values inside INSN for that we want to measure histograms for
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
division/modulo optimization and stores them to VALUES. */
|
2003-10-19 23:37:32 +02:00
|
|
|
|
static void
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
insn_divmod_values_to_profile (rtx insn, histogram_values *values)
|
2003-10-19 23:37:32 +02:00
|
|
|
|
{
|
|
|
|
|
rtx set, set_src, op1, op2;
|
|
|
|
|
enum machine_mode mode;
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
histogram_value hist;
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
if (!INSN_P (insn))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
set = single_set (insn);
|
|
|
|
|
if (!set)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
mode = GET_MODE (SET_DEST (set));
|
|
|
|
|
if (!INTEGRAL_MODE_P (mode))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
set_src = SET_SRC (set);
|
|
|
|
|
switch (GET_CODE (set_src))
|
|
|
|
|
{
|
|
|
|
|
case DIV:
|
|
|
|
|
case MOD:
|
|
|
|
|
case UDIV:
|
|
|
|
|
case UMOD:
|
|
|
|
|
op1 = XEXP (set_src, 0);
|
|
|
|
|
op2 = XEXP (set_src, 1);
|
|
|
|
|
if (side_effects_p (op2))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* Check for a special case where the divisor is power of 2. */
|
|
|
|
|
if ((GET_CODE (set_src) == UMOD) && !CONSTANT_P (op2))
|
|
|
|
|
{
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
hist = ggc_alloc (sizeof (*hist));
|
|
|
|
|
hist->value = op2;
|
|
|
|
|
hist->seq = NULL_RTX;
|
|
|
|
|
hist->mode = mode;
|
|
|
|
|
hist->insn = insn;
|
|
|
|
|
hist->type = HIST_TYPE_POW2;
|
|
|
|
|
hist->hdata.pow2.may_be_other = 1;
|
|
|
|
|
VEC_safe_push (histogram_value, *values, hist);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check whether the divisor is not in fact a constant. */
|
|
|
|
|
if (!CONSTANT_P (op2))
|
|
|
|
|
{
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
hist = ggc_alloc (sizeof (*hist));
|
|
|
|
|
hist->value = op2;
|
|
|
|
|
hist->mode = mode;
|
|
|
|
|
hist->seq = NULL_RTX;
|
|
|
|
|
hist->insn = insn;
|
|
|
|
|
hist->type = HIST_TYPE_SINGLE_VALUE;
|
|
|
|
|
VEC_safe_push (histogram_value, *values, hist);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
2003-11-21 07:52:23 +01:00
|
|
|
|
/* For mod, check whether it is not often a noop (or replaceable by
|
2003-10-19 23:37:32 +02:00
|
|
|
|
a few subtractions). */
|
|
|
|
|
if (GET_CODE (set_src) == UMOD && !side_effects_p (op1))
|
|
|
|
|
{
|
|
|
|
|
rtx tmp;
|
|
|
|
|
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
hist = ggc_alloc (sizeof (*hist));
|
2003-10-19 23:37:32 +02:00
|
|
|
|
start_sequence ();
|
|
|
|
|
tmp = simplify_gen_binary (DIV, mode, copy_rtx (op1), copy_rtx (op2));
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
hist->value = force_operand (tmp, NULL_RTX);
|
|
|
|
|
hist->seq = get_insns ();
|
2003-10-19 23:37:32 +02:00
|
|
|
|
end_sequence ();
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
hist->mode = mode;
|
|
|
|
|
hist->insn = insn;
|
|
|
|
|
hist->type = HIST_TYPE_INTERVAL;
|
|
|
|
|
hist->hdata.intvl.int_start = 0;
|
|
|
|
|
hist->hdata.intvl.steps = 2;
|
|
|
|
|
hist->hdata.intvl.may_be_less = 1;
|
|
|
|
|
hist->hdata.intvl.may_be_more = 1;
|
|
|
|
|
VEC_safe_push (histogram_value, *values, hist);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
#ifdef HAVE_prefetch
|
|
|
|
|
|
|
|
|
|
/* Called from find_mem_reference through for_each_rtx, finds a memory
|
|
|
|
|
reference. I.e. if *EXPR is a MEM, the reference to this MEM is stored
|
|
|
|
|
to *RET and the traversing of the expression is interrupted by returning 1.
|
|
|
|
|
Otherwise 0 is returned. */
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
find_mem_reference_1 (rtx *expr, void *ret)
|
|
|
|
|
{
|
|
|
|
|
rtx *mem = ret;
|
|
|
|
|
|
|
|
|
|
if (GET_CODE (*expr) == MEM)
|
|
|
|
|
{
|
|
|
|
|
*mem = *expr;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Called form find_mem_reference through note_stores to find out whether
|
|
|
|
|
the memory reference MEM is a store. I.e. if EXPR == MEM, the variable
|
|
|
|
|
FMR2_WRITE is set to true. */
|
|
|
|
|
|
|
|
|
|
static int fmr2_write;
|
|
|
|
|
static void
|
|
|
|
|
find_mem_reference_2 (rtx expr, rtx pat ATTRIBUTE_UNUSED, void *mem)
|
|
|
|
|
{
|
|
|
|
|
if (expr == mem)
|
|
|
|
|
fmr2_write = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Find a memory reference inside INSN, return it in MEM. Set WRITE to true
|
|
|
|
|
if it is a write of the mem. Return false if no memory reference is found,
|
|
|
|
|
true otherwise. */
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
find_mem_reference (rtx insn, rtx *mem, int *write)
|
|
|
|
|
{
|
|
|
|
|
*mem = NULL_RTX;
|
|
|
|
|
for_each_rtx (&PATTERN (insn), find_mem_reference_1, mem);
|
|
|
|
|
|
|
|
|
|
if (!*mem)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
fmr2_write = false;
|
|
|
|
|
note_stores (PATTERN (insn), find_mem_reference_2, *mem);
|
|
|
|
|
*write = fmr2_write;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Find values inside INSN for that we want to measure histograms for
|
|
|
|
|
a speculative prefetching. Add them to the list VALUES.
|
|
|
|
|
Returns true if such we found any such value, false otherwise. */
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
insn_prefetch_values_to_profile (rtx insn, histogram_values *values)
|
|
|
|
|
{
|
|
|
|
|
rtx mem, address;
|
|
|
|
|
int write;
|
|
|
|
|
histogram_value hist;
|
|
|
|
|
|
2005-02-14 12:37:52 +01:00
|
|
|
|
/* It only makes sense to look for memory references in ordinary insns. */
|
|
|
|
|
if (GET_CODE (insn) != INSN)
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!find_mem_reference (insn, &mem, &write))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
address = XEXP (mem, 0);
|
|
|
|
|
if (side_effects_p (address))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (CONSTANT_P (address))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
hist = ggc_alloc (sizeof (*hist));
|
|
|
|
|
hist->value = address;
|
|
|
|
|
hist->mode = GET_MODE (address);
|
|
|
|
|
hist->seq = NULL_RTX;
|
|
|
|
|
hist->insn = insn;
|
|
|
|
|
hist->type = HIST_TYPE_CONST_DELTA;
|
|
|
|
|
VEC_safe_push (histogram_value, *values, hist);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
2003-06-26 11:38:34 +02:00
|
|
|
|
/* 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
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
insn_values_to_profile (rtx insn, histogram_values *values)
|
2003-06-26 11:38:34 +02:00
|
|
|
|
{
|
2003-10-19 23:37:32 +02:00
|
|
|
|
if (flag_value_profile_transformations)
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
insn_divmod_values_to_profile (insn, values);
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_prefetch
|
|
|
|
|
if (flag_speculative_prefetching)
|
|
|
|
|
insn_prefetch_values_to_profile (insn, values);
|
|
|
|
|
#endif
|
2003-06-26 11:38:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Find list of values for that we want to measure histograms. */
|
2004-05-13 08:41:07 +02:00
|
|
|
|
static void
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
rtl_find_values_to_profile (histogram_values *values)
|
2003-06-26 11:38:34 +02:00
|
|
|
|
{
|
|
|
|
|
rtx insn;
|
2005-02-14 12:37:52 +01:00
|
|
|
|
unsigned i, libcall_level;
|
2003-06-26 11:38:34 +02:00
|
|
|
|
|
2004-05-15 11:39:30 +02:00
|
|
|
|
life_analysis (NULL, PROP_DEATH_NOTES);
|
2004-05-13 08:41:07 +02:00
|
|
|
|
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
*values = VEC_alloc (histogram_value, 0);
|
2005-02-14 12:37:52 +01:00
|
|
|
|
libcall_level = 0;
|
2003-06-26 11:38:34 +02:00
|
|
|
|
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
|
2005-02-14 12:37:52 +01:00
|
|
|
|
{
|
|
|
|
|
if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
|
|
|
|
|
libcall_level++;
|
|
|
|
|
|
|
|
|
|
/* Do not instrument values inside libcalls (we are going to split block
|
|
|
|
|
due to instrumentation, and libcall blocks should be local to a single
|
|
|
|
|
basic block). */
|
|
|
|
|
if (!libcall_level)
|
|
|
|
|
insn_values_to_profile (insn, values);
|
|
|
|
|
|
|
|
|
|
if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
|
|
|
|
|
{
|
|
|
|
|
gcc_assert (libcall_level > 0);
|
|
|
|
|
libcall_level--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
gcc_assert (libcall_level == 0);
|
2003-06-26 11:38:34 +02:00
|
|
|
|
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
for (i = 0; i < VEC_length (histogram_value, *values); i++)
|
2003-06-26 11:38:34 +02:00
|
|
|
|
{
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
histogram_value hist = VEC_index (histogram_value, *values, i);
|
|
|
|
|
|
|
|
|
|
switch (hist->type)
|
2003-06-26 11:38:34 +02:00
|
|
|
|
{
|
|
|
|
|
case HIST_TYPE_INTERVAL:
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
if (dump_file)
|
|
|
|
|
fprintf (dump_file,
|
2003-10-19 23:37:32 +02:00
|
|
|
|
"Interval counter for insn %d, range %d -- %d.\n",
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
INSN_UID ((rtx)hist->insn),
|
|
|
|
|
hist->hdata.intvl.int_start,
|
|
|
|
|
(hist->hdata.intvl.int_start
|
|
|
|
|
+ hist->hdata.intvl.steps - 1));
|
|
|
|
|
hist->n_counters = hist->hdata.intvl.steps +
|
|
|
|
|
(hist->hdata.intvl.may_be_less ? 1 : 0) +
|
|
|
|
|
(hist->hdata.intvl.may_be_more ? 1 : 0);
|
2003-06-26 11:38:34 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HIST_TYPE_POW2:
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
if (dump_file)
|
|
|
|
|
fprintf (dump_file,
|
2003-10-19 23:37:32 +02:00
|
|
|
|
"Pow2 counter for insn %d.\n",
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
INSN_UID ((rtx)hist->insn));
|
|
|
|
|
hist->n_counters
|
|
|
|
|
= GET_MODE_BITSIZE (hist->mode)
|
|
|
|
|
+ (hist->hdata.pow2.may_be_other ? 1 : 0);
|
2003-06-26 11:38:34 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HIST_TYPE_SINGLE_VALUE:
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
if (dump_file)
|
|
|
|
|
fprintf (dump_file,
|
2003-10-19 23:37:32 +02:00
|
|
|
|
"Single value counter for insn %d.\n",
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
INSN_UID ((rtx)hist->insn));
|
|
|
|
|
hist->n_counters = 3;
|
2003-06-26 11:38:34 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HIST_TYPE_CONST_DELTA:
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
if (dump_file)
|
|
|
|
|
fprintf (dump_file,
|
2003-10-19 23:37:32 +02:00
|
|
|
|
"Constant delta counter for insn %d.\n",
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
INSN_UID ((rtx)hist->insn));
|
|
|
|
|
hist->n_counters = 4;
|
2003-06-26 11:38:34 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
value-prof.c (rtl_find_values_to_profile): Use gcc_assert and gcc_unreachable.
* value-prof.c (rtl_find_values_to_profile): Use gcc_assert and
gcc_unreachable.
(rtl_register_value_prof_hooks,
tree_value_profile_transformations,
tree_register_value_prof_hooks): Likewise.
* var-tracking.c (stack_adjust_offset_pre_post,
variable_htab_free, variable_union, dataflow_set_different_2,
count_uses, variable_was_changed, set_frame_base_location,
set_variable_part, emit_note_insn_var_location, vt_emit_notes,
vt_add_function_parameters): Likewise.
* varasm.c (named_section_real, named_section, make_decl_rtl,
asm_emit_uninitialised, assemble_integer, decode_addr_const,
const_hash_1, compare_constant, copy_constant, force_const_mem,
output_constant_pool_2, output_constant_pool_1, output_constant,
output_constructor, make_decl_one_only, decl_tls_model,
default_no_named_section, default_elf_select_section_1,
default_unique_section_1): Likewise.
* vec.c (vec_gc_o_reserve, vec_heap_o_reserve): Likewise.
* vmsdbgout.c (addr_const_to_string): Likewise.
From-SVN: r96241
2005-03-10 16:36:42 +01:00
|
|
|
|
gcc_unreachable ();
|
2003-06-26 11:38:34 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2004-05-13 08:41:07 +02:00
|
|
|
|
allocate_reg_info (max_reg_num (), FALSE, FALSE);
|
2003-06-26 11:38:34 +02:00
|
|
|
|
}
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
/* Main entry point. Finds REG_VALUE_PROFILE notes from profiler and uses
|
|
|
|
|
them to identify and exploit properties of values that are hard to analyze
|
|
|
|
|
statically.
|
|
|
|
|
|
|
|
|
|
We do following transformations:
|
|
|
|
|
|
|
|
|
|
1)
|
|
|
|
|
|
|
|
|
|
x = a / b;
|
|
|
|
|
|
|
|
|
|
where b is almost always a constant N is transformed to
|
|
|
|
|
|
|
|
|
|
if (b == N)
|
|
|
|
|
x = a / N;
|
|
|
|
|
else
|
|
|
|
|
x = a / b;
|
|
|
|
|
|
|
|
|
|
Analogically with %
|
|
|
|
|
|
|
|
|
|
2)
|
|
|
|
|
|
|
|
|
|
x = a % b
|
|
|
|
|
|
|
|
|
|
where b is almost always a power of 2 and the division is unsigned
|
|
|
|
|
TODO -- handle signed case as well
|
|
|
|
|
|
|
|
|
|
if ((b & (b - 1)) == 0)
|
|
|
|
|
x = a & (b - 1);
|
|
|
|
|
else
|
|
|
|
|
x = x % b;
|
|
|
|
|
|
|
|
|
|
Note that when b = 0, no error will occur and x = a; this is correct,
|
|
|
|
|
as result of such operation is undefined.
|
|
|
|
|
|
|
|
|
|
3)
|
|
|
|
|
|
|
|
|
|
x = a % b
|
|
|
|
|
|
|
|
|
|
where a is almost always less then b and the division is unsigned
|
|
|
|
|
TODO -- handle signed case as well
|
|
|
|
|
|
|
|
|
|
x = a;
|
|
|
|
|
if (x >= b)
|
|
|
|
|
x %= b;
|
|
|
|
|
|
|
|
|
|
4)
|
|
|
|
|
|
|
|
|
|
x = a % b
|
|
|
|
|
|
|
|
|
|
where a is almost always less then 2 * b and the division is unsigned
|
|
|
|
|
TODO -- handle signed case as well
|
|
|
|
|
|
|
|
|
|
x = a;
|
|
|
|
|
if (x >= b)
|
|
|
|
|
x -= b;
|
|
|
|
|
if (x >= b)
|
|
|
|
|
x %= b;
|
|
|
|
|
|
|
|
|
|
It would be possible to continue analogically for K * b for other small
|
|
|
|
|
K's, but it is probably not useful.
|
|
|
|
|
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
5)
|
|
|
|
|
|
|
|
|
|
Read or write of mem[address], where the value of address changes usually
|
|
|
|
|
by a constant C != 0 between the following accesses to the computation; with
|
|
|
|
|
-fspeculative-prefetching we then add a prefetch of address + C before
|
|
|
|
|
the insn. This handles prefetching of several interesting cases in addition
|
|
|
|
|
to a simple prefetching for addresses that are induction variables, e. g.
|
|
|
|
|
linked lists allocated sequentially (even in case they are processed
|
|
|
|
|
recursively).
|
|
|
|
|
|
|
|
|
|
TODO -- we should also check whether there is not (usually) a small
|
|
|
|
|
difference with the adjacent memory references, so that we do
|
|
|
|
|
not issue overlapping prefetches. Also we should employ some
|
|
|
|
|
heuristics to eliminate cases where prefetching evidently spoils
|
|
|
|
|
the code.
|
|
|
|
|
-- it should somehow cooperate with the loop optimizer prefetching
|
|
|
|
|
|
2003-10-19 23:37:32 +02:00
|
|
|
|
TODO:
|
|
|
|
|
|
|
|
|
|
There are other useful cases that could be handled by a similar mechanism,
|
|
|
|
|
for example:
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < n; i++)
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
transform to (for constant N):
|
|
|
|
|
|
|
|
|
|
if (n == N)
|
|
|
|
|
for (i = 0; i < N; i++)
|
|
|
|
|
...
|
|
|
|
|
else
|
|
|
|
|
for (i = 0; i < n; i++)
|
|
|
|
|
...
|
|
|
|
|
making unroller happy. Since this may grow the code significantly,
|
|
|
|
|
we would have to be very careful here. */
|
|
|
|
|
|
2004-05-13 08:41:07 +02:00
|
|
|
|
static bool
|
|
|
|
|
rtl_value_profile_transformations (void)
|
2003-10-19 23:37:32 +02:00
|
|
|
|
{
|
|
|
|
|
rtx insn, next;
|
|
|
|
|
int changed = false;
|
|
|
|
|
|
|
|
|
|
for (insn = get_insns (); insn; insn = next)
|
|
|
|
|
{
|
|
|
|
|
next = NEXT_INSN (insn);
|
|
|
|
|
|
|
|
|
|
if (!INSN_P (insn))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* Scan for insn carrying a histogram. */
|
|
|
|
|
if (!find_reg_note (insn, REG_VALUE_PROFILE, 0))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* Ignore cold areas -- we are growing a code. */
|
|
|
|
|
if (!maybe_hot_bb_p (BLOCK_FOR_INSN (insn)))
|
|
|
|
|
continue;
|
|
|
|
|
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
if (dump_file)
|
2003-10-19 23:37:32 +02:00
|
|
|
|
{
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
fprintf (dump_file, "Trying transformations on insn %d\n",
|
2003-10-19 23:37:32 +02:00
|
|
|
|
INSN_UID (insn));
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
print_rtl_single (dump_file, insn);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Transformations: */
|
|
|
|
|
if (flag_value_profile_transformations
|
|
|
|
|
&& (mod_subtract_transform (insn)
|
|
|
|
|
|| divmod_fixed_value_transform (insn)
|
|
|
|
|
|| mod_pow2_value_transform (insn)))
|
|
|
|
|
changed = true;
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
#ifdef HAVE_prefetch
|
|
|
|
|
if (flag_speculative_prefetching
|
|
|
|
|
&& speculative_prefetching_transform (insn))
|
|
|
|
|
changed = true;
|
|
|
|
|
#endif
|
2003-10-19 23:37:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (changed)
|
|
|
|
|
{
|
|
|
|
|
commit_edge_insertions ();
|
|
|
|
|
allocate_reg_info (max_reg_num (), FALSE, FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return changed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Generate code for transformation 1 (with MODE and OPERATION, operands OP1
|
2004-06-23 18:07:58 +02:00
|
|
|
|
and OP2, whose value is expected to be VALUE, result TARGET and
|
|
|
|
|
probability of taking the optimal path PROB). */
|
2003-10-19 23:37:32 +02:00
|
|
|
|
static rtx
|
|
|
|
|
gen_divmod_fixed_value (enum machine_mode mode, enum rtx_code operation,
|
2004-06-23 18:07:58 +02:00
|
|
|
|
rtx target, rtx op1, rtx op2, gcov_type value,
|
|
|
|
|
int prob)
|
2003-10-19 23:37:32 +02:00
|
|
|
|
{
|
2004-06-23 18:07:58 +02:00
|
|
|
|
rtx tmp, tmp1, jump;
|
2003-10-19 23:37:32 +02:00
|
|
|
|
rtx neq_label = gen_label_rtx ();
|
|
|
|
|
rtx end_label = gen_label_rtx ();
|
|
|
|
|
rtx sequence;
|
|
|
|
|
|
|
|
|
|
start_sequence ();
|
|
|
|
|
|
|
|
|
|
if (!REG_P (op2))
|
|
|
|
|
{
|
|
|
|
|
tmp = gen_reg_rtx (mode);
|
|
|
|
|
emit_move_insn (tmp, copy_rtx (op2));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
tmp = op2;
|
|
|
|
|
|
|
|
|
|
do_compare_rtx_and_jump (tmp, GEN_INT (value), NE, 0, mode, NULL_RTX,
|
|
|
|
|
NULL_RTX, neq_label);
|
2004-06-23 18:07:58 +02:00
|
|
|
|
|
|
|
|
|
/* Add branch probability to jump we just created. */
|
|
|
|
|
jump = get_last_insn ();
|
|
|
|
|
REG_NOTES (jump) = gen_rtx_EXPR_LIST (REG_BR_PROB,
|
|
|
|
|
GEN_INT (REG_BR_PROB_BASE - prob),
|
|
|
|
|
REG_NOTES (jump));
|
|
|
|
|
|
|
|
|
|
tmp1 = simplify_gen_binary (operation, mode,
|
|
|
|
|
copy_rtx (op1), GEN_INT (value));
|
2003-10-19 23:37:32 +02:00
|
|
|
|
tmp1 = force_operand (tmp1, target);
|
|
|
|
|
if (tmp1 != target)
|
|
|
|
|
emit_move_insn (copy_rtx (target), copy_rtx (tmp1));
|
|
|
|
|
|
|
|
|
|
emit_jump_insn (gen_jump (end_label));
|
|
|
|
|
emit_barrier ();
|
|
|
|
|
|
|
|
|
|
emit_label (neq_label);
|
2004-06-23 18:07:58 +02:00
|
|
|
|
tmp1 = simplify_gen_binary (operation, mode,
|
|
|
|
|
copy_rtx (op1), copy_rtx (tmp));
|
2003-10-19 23:37:32 +02:00
|
|
|
|
tmp1 = force_operand (tmp1, target);
|
|
|
|
|
if (tmp1 != target)
|
|
|
|
|
emit_move_insn (copy_rtx (target), copy_rtx (tmp1));
|
|
|
|
|
|
|
|
|
|
emit_label (end_label);
|
|
|
|
|
|
|
|
|
|
sequence = get_insns ();
|
|
|
|
|
end_sequence ();
|
|
|
|
|
rebuild_jump_labels (sequence);
|
|
|
|
|
return sequence;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Do transform 1) on INSN if applicable. */
|
|
|
|
|
static bool
|
|
|
|
|
divmod_fixed_value_transform (rtx insn)
|
|
|
|
|
{
|
|
|
|
|
rtx set, set_src, set_dest, op1, op2, value, histogram;
|
|
|
|
|
enum rtx_code code;
|
|
|
|
|
enum machine_mode mode;
|
|
|
|
|
gcov_type val, count, all;
|
|
|
|
|
edge e;
|
2004-06-23 18:07:58 +02:00
|
|
|
|
int prob;
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
set = single_set (insn);
|
|
|
|
|
if (!set)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
set_src = SET_SRC (set);
|
|
|
|
|
set_dest = SET_DEST (set);
|
|
|
|
|
code = GET_CODE (set_src);
|
|
|
|
|
mode = GET_MODE (set_dest);
|
|
|
|
|
|
|
|
|
|
if (code != DIV && code != MOD && code != UDIV && code != UMOD)
|
|
|
|
|
return false;
|
|
|
|
|
op1 = XEXP (set_src, false);
|
|
|
|
|
op2 = XEXP (set_src, 1);
|
|
|
|
|
|
|
|
|
|
for (histogram = REG_NOTES (insn);
|
|
|
|
|
histogram;
|
|
|
|
|
histogram = XEXP (histogram, 1))
|
|
|
|
|
if (REG_NOTE_KIND (histogram) == REG_VALUE_PROFILE
|
|
|
|
|
&& XEXP (XEXP (histogram, 0), 0) == GEN_INT (HIST_TYPE_SINGLE_VALUE))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (!histogram)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
histogram = XEXP (XEXP (histogram, 0), 1);
|
|
|
|
|
value = XEXP (histogram, 0);
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
val = INTVAL (XEXP (histogram, 0));
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
count = INTVAL (XEXP (histogram, 0));
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
all = INTVAL (XEXP (histogram, 0));
|
|
|
|
|
|
2004-11-15 00:35:03 +01:00
|
|
|
|
/* We require that count be at least half of all; this means
|
2003-10-19 23:37:32 +02:00
|
|
|
|
that for the transformation to fire the value must be constant
|
2003-11-21 07:52:23 +01:00
|
|
|
|
at least 50% of time (and 75% gives the guarantee of usage). */
|
2003-10-19 23:37:32 +02:00
|
|
|
|
if (!rtx_equal_p (op2, value) || 2 * count < all)
|
|
|
|
|
return false;
|
|
|
|
|
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
if (dump_file)
|
|
|
|
|
fprintf (dump_file, "Div/mod by constant transformation on insn %d\n",
|
2003-10-19 23:37:32 +02:00
|
|
|
|
INSN_UID (insn));
|
|
|
|
|
|
2004-06-23 18:07:58 +02:00
|
|
|
|
/* Compute probability of taking the optimal path. */
|
|
|
|
|
prob = (count * REG_BR_PROB_BASE + all / 2) / all;
|
|
|
|
|
|
2003-10-19 23:37:32 +02:00
|
|
|
|
e = split_block (BLOCK_FOR_INSN (insn), PREV_INSN (insn));
|
|
|
|
|
delete_insn (insn);
|
|
|
|
|
|
|
|
|
|
insert_insn_on_edge (
|
2004-06-23 18:07:58 +02:00
|
|
|
|
gen_divmod_fixed_value (mode, code, set_dest,
|
|
|
|
|
op1, op2, val, prob), e);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Generate code for transformation 2 (with MODE and OPERATION, operands OP1
|
2004-06-23 18:07:58 +02:00
|
|
|
|
and OP2, result TARGET and probability of taking the optimal path PROB). */
|
2003-10-19 23:37:32 +02:00
|
|
|
|
static rtx
|
|
|
|
|
gen_mod_pow2 (enum machine_mode mode, enum rtx_code operation, rtx target,
|
2004-06-23 18:07:58 +02:00
|
|
|
|
rtx op1, rtx op2, int prob)
|
2003-10-19 23:37:32 +02:00
|
|
|
|
{
|
2004-06-23 18:07:58 +02:00
|
|
|
|
rtx tmp, tmp1, tmp2, tmp3, jump;
|
2003-10-19 23:37:32 +02:00
|
|
|
|
rtx neq_label = gen_label_rtx ();
|
|
|
|
|
rtx end_label = gen_label_rtx ();
|
|
|
|
|
rtx sequence;
|
|
|
|
|
|
|
|
|
|
start_sequence ();
|
|
|
|
|
|
|
|
|
|
if (!REG_P (op2))
|
|
|
|
|
{
|
|
|
|
|
tmp = gen_reg_rtx (mode);
|
|
|
|
|
emit_move_insn (tmp, copy_rtx (op2));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
tmp = op2;
|
|
|
|
|
|
|
|
|
|
tmp1 = expand_simple_binop (mode, PLUS, tmp, constm1_rtx, NULL_RTX,
|
|
|
|
|
0, OPTAB_WIDEN);
|
|
|
|
|
tmp2 = expand_simple_binop (mode, AND, tmp, tmp1, NULL_RTX,
|
|
|
|
|
0, OPTAB_WIDEN);
|
|
|
|
|
do_compare_rtx_and_jump (tmp2, const0_rtx, NE, 0, mode, NULL_RTX,
|
|
|
|
|
NULL_RTX, neq_label);
|
2004-06-23 18:07:58 +02:00
|
|
|
|
|
|
|
|
|
/* Add branch probability to jump we just created. */
|
|
|
|
|
jump = get_last_insn ();
|
|
|
|
|
REG_NOTES (jump) = gen_rtx_EXPR_LIST (REG_BR_PROB,
|
|
|
|
|
GEN_INT (REG_BR_PROB_BASE - prob),
|
|
|
|
|
REG_NOTES (jump));
|
|
|
|
|
|
2003-10-19 23:37:32 +02:00
|
|
|
|
tmp3 = expand_simple_binop (mode, AND, op1, tmp1, target,
|
|
|
|
|
0, OPTAB_WIDEN);
|
|
|
|
|
if (tmp3 != target)
|
|
|
|
|
emit_move_insn (copy_rtx (target), tmp3);
|
|
|
|
|
emit_jump_insn (gen_jump (end_label));
|
|
|
|
|
emit_barrier ();
|
|
|
|
|
|
|
|
|
|
emit_label (neq_label);
|
|
|
|
|
tmp1 = simplify_gen_binary (operation, mode, copy_rtx (op1), copy_rtx (tmp));
|
|
|
|
|
tmp1 = force_operand (tmp1, target);
|
|
|
|
|
if (tmp1 != target)
|
|
|
|
|
emit_move_insn (target, tmp1);
|
|
|
|
|
|
|
|
|
|
emit_label (end_label);
|
|
|
|
|
|
|
|
|
|
sequence = get_insns ();
|
|
|
|
|
end_sequence ();
|
|
|
|
|
rebuild_jump_labels (sequence);
|
|
|
|
|
return sequence;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Do transform 2) on INSN if applicable. */
|
|
|
|
|
static bool
|
|
|
|
|
mod_pow2_value_transform (rtx insn)
|
|
|
|
|
{
|
|
|
|
|
rtx set, set_src, set_dest, op1, op2, value, histogram;
|
|
|
|
|
enum rtx_code code;
|
|
|
|
|
enum machine_mode mode;
|
|
|
|
|
gcov_type wrong_values, count;
|
|
|
|
|
edge e;
|
2004-06-23 18:07:58 +02:00
|
|
|
|
int i, all, prob;
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
set = single_set (insn);
|
|
|
|
|
if (!set)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
set_src = SET_SRC (set);
|
|
|
|
|
set_dest = SET_DEST (set);
|
|
|
|
|
code = GET_CODE (set_src);
|
|
|
|
|
mode = GET_MODE (set_dest);
|
|
|
|
|
|
|
|
|
|
if (code != UMOD)
|
|
|
|
|
return false;
|
|
|
|
|
op1 = XEXP (set_src, 0);
|
|
|
|
|
op2 = XEXP (set_src, 1);
|
|
|
|
|
|
|
|
|
|
for (histogram = REG_NOTES (insn);
|
|
|
|
|
histogram;
|
|
|
|
|
histogram = XEXP (histogram, 1))
|
|
|
|
|
if (REG_NOTE_KIND (histogram) == REG_VALUE_PROFILE
|
|
|
|
|
&& XEXP (XEXP (histogram, 0), 0) == GEN_INT (HIST_TYPE_POW2))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (!histogram)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
histogram = XEXP (XEXP (histogram, 0), 1);
|
|
|
|
|
value = XEXP (histogram, 0);
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
wrong_values =INTVAL (XEXP (histogram, 0));
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
|
|
|
|
|
count = 0;
|
|
|
|
|
for (i = 0; i < GET_MODE_BITSIZE (mode); i++)
|
|
|
|
|
{
|
|
|
|
|
count += INTVAL (XEXP (histogram, 0));
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!rtx_equal_p (op2, value))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
/* We require that we hit a power of two at least half of all evaluations. */
|
|
|
|
|
if (count < wrong_values)
|
|
|
|
|
return false;
|
|
|
|
|
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
if (dump_file)
|
|
|
|
|
fprintf (dump_file, "Mod power of 2 transformation on insn %d\n",
|
2003-10-19 23:37:32 +02:00
|
|
|
|
INSN_UID (insn));
|
|
|
|
|
|
2004-06-23 18:07:58 +02:00
|
|
|
|
/* Compute probability of taking the optimal path. */
|
|
|
|
|
all = count + wrong_values;
|
|
|
|
|
prob = (count * REG_BR_PROB_BASE + all / 2) / all;
|
|
|
|
|
|
2003-10-19 23:37:32 +02:00
|
|
|
|
e = split_block (BLOCK_FOR_INSN (insn), PREV_INSN (insn));
|
|
|
|
|
delete_insn (insn);
|
|
|
|
|
|
|
|
|
|
insert_insn_on_edge (
|
2004-06-23 18:07:58 +02:00
|
|
|
|
gen_mod_pow2 (mode, code, set_dest, op1, op2, prob), e);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Generate code for transformations 3 and 4 (with MODE and OPERATION,
|
2004-06-23 18:07:58 +02:00
|
|
|
|
operands OP1 and OP2, result TARGET, at most SUB subtractions, and
|
|
|
|
|
probability of taking the optimal path(s) PROB1 and PROB2). */
|
2003-10-19 23:37:32 +02:00
|
|
|
|
static rtx
|
|
|
|
|
gen_mod_subtract (enum machine_mode mode, enum rtx_code operation,
|
2004-06-23 18:07:58 +02:00
|
|
|
|
rtx target, rtx op1, rtx op2, int sub, int prob1, int prob2)
|
2003-10-19 23:37:32 +02:00
|
|
|
|
{
|
2004-06-23 18:07:58 +02:00
|
|
|
|
rtx tmp, tmp1, jump;
|
2003-10-19 23:37:32 +02:00
|
|
|
|
rtx end_label = gen_label_rtx ();
|
|
|
|
|
rtx sequence;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
start_sequence ();
|
|
|
|
|
|
|
|
|
|
if (!REG_P (op2))
|
|
|
|
|
{
|
|
|
|
|
tmp = gen_reg_rtx (mode);
|
|
|
|
|
emit_move_insn (tmp, copy_rtx (op2));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
tmp = op2;
|
|
|
|
|
|
|
|
|
|
emit_move_insn (target, copy_rtx (op1));
|
|
|
|
|
do_compare_rtx_and_jump (target, tmp, LTU, 0, mode, NULL_RTX,
|
|
|
|
|
NULL_RTX, end_label);
|
2004-06-23 18:07:58 +02:00
|
|
|
|
|
|
|
|
|
/* Add branch probability to jump we just created. */
|
|
|
|
|
jump = get_last_insn ();
|
|
|
|
|
REG_NOTES (jump) = gen_rtx_EXPR_LIST (REG_BR_PROB,
|
|
|
|
|
GEN_INT (prob1), REG_NOTES (jump));
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
for (i = 0; i < sub; i++)
|
|
|
|
|
{
|
|
|
|
|
tmp1 = expand_simple_binop (mode, MINUS, target, tmp, target,
|
|
|
|
|
0, OPTAB_WIDEN);
|
|
|
|
|
if (tmp1 != target)
|
|
|
|
|
emit_move_insn (target, tmp1);
|
|
|
|
|
do_compare_rtx_and_jump (target, tmp, LTU, 0, mode, NULL_RTX,
|
|
|
|
|
NULL_RTX, end_label);
|
2004-06-23 18:07:58 +02:00
|
|
|
|
|
|
|
|
|
/* Add branch probability to jump we just created. */
|
|
|
|
|
jump = get_last_insn ();
|
|
|
|
|
REG_NOTES (jump) = gen_rtx_EXPR_LIST (REG_BR_PROB,
|
|
|
|
|
GEN_INT (prob2), REG_NOTES (jump));
|
2003-10-19 23:37:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tmp1 = simplify_gen_binary (operation, mode, copy_rtx (target), copy_rtx (tmp));
|
|
|
|
|
tmp1 = force_operand (tmp1, target);
|
|
|
|
|
if (tmp1 != target)
|
|
|
|
|
emit_move_insn (target, tmp1);
|
|
|
|
|
|
|
|
|
|
emit_label (end_label);
|
|
|
|
|
|
|
|
|
|
sequence = get_insns ();
|
|
|
|
|
end_sequence ();
|
|
|
|
|
rebuild_jump_labels (sequence);
|
|
|
|
|
return sequence;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Do transforms 3) and 4) on INSN if applicable. */
|
|
|
|
|
static bool
|
|
|
|
|
mod_subtract_transform (rtx insn)
|
|
|
|
|
{
|
2005-03-12 15:11:16 +01:00
|
|
|
|
rtx set, set_src, set_dest, op1, op2, histogram;
|
2003-10-19 23:37:32 +02:00
|
|
|
|
enum rtx_code code;
|
|
|
|
|
enum machine_mode mode;
|
|
|
|
|
gcov_type wrong_values, counts[2], count, all;
|
|
|
|
|
edge e;
|
2004-06-23 18:07:58 +02:00
|
|
|
|
int i, prob1, prob2;
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
set = single_set (insn);
|
|
|
|
|
if (!set)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
set_src = SET_SRC (set);
|
|
|
|
|
set_dest = SET_DEST (set);
|
|
|
|
|
code = GET_CODE (set_src);
|
|
|
|
|
mode = GET_MODE (set_dest);
|
|
|
|
|
|
|
|
|
|
if (code != UMOD)
|
|
|
|
|
return false;
|
|
|
|
|
op1 = XEXP (set_src, 0);
|
|
|
|
|
op2 = XEXP (set_src, 1);
|
|
|
|
|
|
|
|
|
|
for (histogram = REG_NOTES (insn);
|
|
|
|
|
histogram;
|
|
|
|
|
histogram = XEXP (histogram, 1))
|
|
|
|
|
if (REG_NOTE_KIND (histogram) == REG_VALUE_PROFILE
|
|
|
|
|
&& XEXP (XEXP (histogram, 0), 0) == GEN_INT (HIST_TYPE_INTERVAL))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (!histogram)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
histogram = XEXP (XEXP (histogram, 0), 1);
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
|
|
|
|
|
all = 0;
|
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
|
{
|
|
|
|
|
counts[i] = INTVAL (XEXP (histogram, 0));
|
|
|
|
|
all += counts[i];
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
}
|
|
|
|
|
wrong_values = INTVAL (XEXP (histogram, 0));
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
wrong_values += INTVAL (XEXP (histogram, 0));
|
|
|
|
|
all += wrong_values;
|
|
|
|
|
|
|
|
|
|
/* We require that we use just subtractions in at least 50% of all
|
|
|
|
|
evaluations. */
|
|
|
|
|
count = 0;
|
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
|
{
|
|
|
|
|
count += counts[i];
|
|
|
|
|
if (count * 2 >= all)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (i == 2)
|
|
|
|
|
return false;
|
|
|
|
|
|
toplev.c (dump_file_tbl): Rename from dump_file.
* toplev.c (dump_file_tbl): Rename from dump_file.
* bb-reorder.c, bt-load.c, cfgcleanup.c, cfglayout.c, cfgloopanal.c,
cfgloopmanip.c, cfgrtl.c, config/arm/arm.c, config/frv/frv.c,
config/i386/i386.c, config/ia64/ia64.c, config/mips/mips.c,
config/sh/sh.c, cse.c, flow.c, ifcvt.c, loop-iv.c, loop-unroll.c,
loop-unswitch.c, output.h, predict.c, profile.c, ra-build.c,
ra-colorize.c, ra-debug.c, ra-rewrite.c, ra.c, regrename.c, reload1.c,
toplev.c, tracer.c, value-prof.c, var-tracking.c, web.c:
s/rtl_dump_file/dump_file/g.
From-SVN: r78399
2004-02-25 00:40:03 +01:00
|
|
|
|
if (dump_file)
|
|
|
|
|
fprintf (dump_file, "Mod subtract transformation on insn %d\n",
|
2003-10-19 23:37:32 +02:00
|
|
|
|
INSN_UID (insn));
|
|
|
|
|
|
2004-06-23 18:07:58 +02:00
|
|
|
|
/* Compute probability of taking the optimal path(s). */
|
|
|
|
|
prob1 = (counts[0] * REG_BR_PROB_BASE + all / 2) / all;
|
|
|
|
|
prob2 = (counts[1] * REG_BR_PROB_BASE + all / 2) / all;
|
|
|
|
|
|
2003-10-19 23:37:32 +02:00
|
|
|
|
e = split_block (BLOCK_FOR_INSN (insn), PREV_INSN (insn));
|
|
|
|
|
delete_insn (insn);
|
|
|
|
|
|
|
|
|
|
insert_insn_on_edge (
|
2004-06-23 18:07:58 +02:00
|
|
|
|
gen_mod_subtract (mode, code, set_dest,
|
|
|
|
|
op1, op2, i, prob1, prob2), e);
|
2003-10-19 23:37:32 +02:00
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
|
|
|
|
|
#ifdef HAVE_prefetch
|
|
|
|
|
/* Generate code for transformation 5 for mem with ADDRESS and a constant
|
|
|
|
|
step DELTA. WRITE is true if the reference is a store to mem. */
|
|
|
|
|
|
|
|
|
|
static rtx
|
|
|
|
|
gen_speculative_prefetch (rtx address, gcov_type delta, int write)
|
|
|
|
|
{
|
|
|
|
|
rtx tmp;
|
|
|
|
|
rtx sequence;
|
|
|
|
|
|
|
|
|
|
/* TODO: we do the prefetching for just one iteration ahead, which
|
|
|
|
|
often is not enough. */
|
|
|
|
|
start_sequence ();
|
|
|
|
|
if (offsettable_address_p (0, VOIDmode, address))
|
|
|
|
|
tmp = plus_constant (copy_rtx (address), delta);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tmp = simplify_gen_binary (PLUS, Pmode,
|
|
|
|
|
copy_rtx (address), GEN_INT (delta));
|
|
|
|
|
tmp = force_operand (tmp, NULL);
|
|
|
|
|
}
|
|
|
|
|
if (! (*insn_data[(int)CODE_FOR_prefetch].operand[0].predicate)
|
|
|
|
|
(tmp, insn_data[(int)CODE_FOR_prefetch].operand[0].mode))
|
|
|
|
|
tmp = force_reg (Pmode, tmp);
|
|
|
|
|
emit_insn (gen_prefetch (tmp, GEN_INT (write), GEN_INT (3)));
|
|
|
|
|
sequence = get_insns ();
|
|
|
|
|
end_sequence ();
|
|
|
|
|
|
|
|
|
|
return sequence;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Do transform 5) on INSN if applicable. */
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
speculative_prefetching_transform (rtx insn)
|
|
|
|
|
{
|
|
|
|
|
rtx histogram, value;
|
|
|
|
|
gcov_type val, count, all;
|
|
|
|
|
edge e;
|
|
|
|
|
rtx mem, address;
|
|
|
|
|
int write;
|
|
|
|
|
|
|
|
|
|
if (!maybe_hot_bb_p (BLOCK_FOR_INSN (insn)))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!find_mem_reference (insn, &mem, &write))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
address = XEXP (mem, 0);
|
|
|
|
|
if (side_effects_p (address))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (CONSTANT_P (address))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
for (histogram = REG_NOTES (insn);
|
|
|
|
|
histogram;
|
|
|
|
|
histogram = XEXP (histogram, 1))
|
|
|
|
|
if (REG_NOTE_KIND (histogram) == REG_VALUE_PROFILE
|
|
|
|
|
&& XEXP (XEXP (histogram, 0), 0) == GEN_INT (HIST_TYPE_CONST_DELTA))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (!histogram)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
histogram = XEXP (XEXP (histogram, 0), 1);
|
|
|
|
|
value = XEXP (histogram, 0);
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
/* Skip last value referenced. */
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
val = INTVAL (XEXP (histogram, 0));
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
count = INTVAL (XEXP (histogram, 0));
|
|
|
|
|
histogram = XEXP (histogram, 1);
|
|
|
|
|
all = INTVAL (XEXP (histogram, 0));
|
|
|
|
|
|
|
|
|
|
/* With that few executions we do not really have a reason to optimize the
|
|
|
|
|
statement, and more importantly, the data about differences of addresses
|
|
|
|
|
are spoiled by the first item that had no previous value to compare
|
|
|
|
|
with. */
|
|
|
|
|
if (all < 4)
|
|
|
|
|
return false;
|
|
|
|
|
|
2004-11-15 00:35:03 +01:00
|
|
|
|
/* We require that count be at least half of all; this means
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
that for the transformation to fire the value must be constant
|
c-common.c, [...]: Fix comment typos.
* c-common.c, cfgexpand.c, cgraphunit.c, defaults.h,
et-forest.c, expr.c, gimplify.c, global.c, gthr-lynx.h,
hard-reg-set.h, modulo-sched.c, optabs.c, postreload-gcse.c,
tree-data-ref.c, tree-flow.h, tree-if-conv.c, tree-inline.c,
tree-sra.c, tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c,
tree-ssa-loop-niter.c, tree-ssa-operands.c,
tree-ssa-operands.h, tree-ssa-propagate.c,
tree-ssa-propagate.h, tree-ssa-threadupdate.c, value-prof.c,
vec.c, vec.h: Fix comment typos. Follow spelling conventions.
From-SVN: r87104
2004-09-05 17:24:15 +02:00
|
|
|
|
at least 50% of time (and 75% gives the guarantee of usage). */
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
if (!rtx_equal_p (address, value) || 2 * count < all)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
/* If the difference is too small, it does not make too much sense to
|
|
|
|
|
prefetch, as the memory is probably already in cache. */
|
|
|
|
|
if (val >= NOPREFETCH_RANGE_MIN && val <= NOPREFETCH_RANGE_MAX)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (dump_file)
|
|
|
|
|
fprintf (dump_file, "Speculative prefetching for insn %d\n",
|
|
|
|
|
INSN_UID (insn));
|
|
|
|
|
|
|
|
|
|
e = split_block (BLOCK_FOR_INSN (insn), PREV_INSN (insn));
|
|
|
|
|
|
|
|
|
|
insert_insn_on_edge (gen_speculative_prefetch (address, val, write), e);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
#endif /* HAVE_prefetch */
|
2004-05-13 08:41:07 +02:00
|
|
|
|
|
|
|
|
|
/* Connection to the outside world. */
|
|
|
|
|
/* Struct for IR-dependent hooks. */
|
|
|
|
|
struct value_prof_hooks {
|
|
|
|
|
/* Find list of values for which we want to measure histograms. */
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
void (*find_values_to_profile) (histogram_values *);
|
2004-05-13 08:41:07 +02:00
|
|
|
|
|
|
|
|
|
/* Identify and exploit properties of values that are hard to analyze
|
|
|
|
|
statically. See value-prof.c for more detail. */
|
|
|
|
|
bool (*value_profile_transformations) (void);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Hooks for RTL-based versions (the only ones that currently work). */
|
|
|
|
|
static struct value_prof_hooks rtl_value_prof_hooks =
|
|
|
|
|
{
|
|
|
|
|
rtl_find_values_to_profile,
|
|
|
|
|
rtl_value_profile_transformations
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
rtl_register_value_prof_hooks (void)
|
|
|
|
|
{
|
|
|
|
|
value_prof_hooks = &rtl_value_prof_hooks;
|
value-prof.c (rtl_find_values_to_profile): Use gcc_assert and gcc_unreachable.
* value-prof.c (rtl_find_values_to_profile): Use gcc_assert and
gcc_unreachable.
(rtl_register_value_prof_hooks,
tree_value_profile_transformations,
tree_register_value_prof_hooks): Likewise.
* var-tracking.c (stack_adjust_offset_pre_post,
variable_htab_free, variable_union, dataflow_set_different_2,
count_uses, variable_was_changed, set_frame_base_location,
set_variable_part, emit_note_insn_var_location, vt_emit_notes,
vt_add_function_parameters): Likewise.
* varasm.c (named_section_real, named_section, make_decl_rtl,
asm_emit_uninitialised, assemble_integer, decode_addr_const,
const_hash_1, compare_constant, copy_constant, force_const_mem,
output_constant_pool_2, output_constant_pool_1, output_constant,
output_constructor, make_decl_one_only, decl_tls_model,
default_no_named_section, default_elf_select_section_1,
default_unique_section_1): Likewise.
* vec.c (vec_gc_o_reserve, vec_heap_o_reserve): Likewise.
* vmsdbgout.c (addr_const_to_string): Likewise.
From-SVN: r96241
2005-03-10 16:36:42 +01:00
|
|
|
|
gcc_assert (!ir_type ());
|
2004-05-13 08:41:07 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Tree-based versions are stubs for now. */
|
|
|
|
|
static void
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
tree_find_values_to_profile (histogram_values *values ATTRIBUTE_UNUSED)
|
2004-05-13 08:41:07 +02:00
|
|
|
|
{
|
value-prof.c (rtl_find_values_to_profile): Use gcc_assert and gcc_unreachable.
* value-prof.c (rtl_find_values_to_profile): Use gcc_assert and
gcc_unreachable.
(rtl_register_value_prof_hooks,
tree_value_profile_transformations,
tree_register_value_prof_hooks): Likewise.
* var-tracking.c (stack_adjust_offset_pre_post,
variable_htab_free, variable_union, dataflow_set_different_2,
count_uses, variable_was_changed, set_frame_base_location,
set_variable_part, emit_note_insn_var_location, vt_emit_notes,
vt_add_function_parameters): Likewise.
* varasm.c (named_section_real, named_section, make_decl_rtl,
asm_emit_uninitialised, assemble_integer, decode_addr_const,
const_hash_1, compare_constant, copy_constant, force_const_mem,
output_constant_pool_2, output_constant_pool_1, output_constant,
output_constructor, make_decl_one_only, decl_tls_model,
default_no_named_section, default_elf_select_section_1,
default_unique_section_1): Likewise.
* vec.c (vec_gc_o_reserve, vec_heap_o_reserve): Likewise.
* vmsdbgout.c (addr_const_to_string): Likewise.
From-SVN: r96241
2005-03-10 16:36:42 +01:00
|
|
|
|
gcc_unreachable ();
|
2004-05-13 08:41:07 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
tree_value_profile_transformations (void)
|
|
|
|
|
{
|
value-prof.c (rtl_find_values_to_profile): Use gcc_assert and gcc_unreachable.
* value-prof.c (rtl_find_values_to_profile): Use gcc_assert and
gcc_unreachable.
(rtl_register_value_prof_hooks,
tree_value_profile_transformations,
tree_register_value_prof_hooks): Likewise.
* var-tracking.c (stack_adjust_offset_pre_post,
variable_htab_free, variable_union, dataflow_set_different_2,
count_uses, variable_was_changed, set_frame_base_location,
set_variable_part, emit_note_insn_var_location, vt_emit_notes,
vt_add_function_parameters): Likewise.
* varasm.c (named_section_real, named_section, make_decl_rtl,
asm_emit_uninitialised, assemble_integer, decode_addr_const,
const_hash_1, compare_constant, copy_constant, force_const_mem,
output_constant_pool_2, output_constant_pool_1, output_constant,
output_constructor, make_decl_one_only, decl_tls_model,
default_no_named_section, default_elf_select_section_1,
default_unique_section_1): Likewise.
* vec.c (vec_gc_o_reserve, vec_heap_o_reserve): Likewise.
* vmsdbgout.c (addr_const_to_string): Likewise.
From-SVN: r96241
2005-03-10 16:36:42 +01:00
|
|
|
|
gcc_unreachable ();
|
2004-05-13 08:41:07 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static struct value_prof_hooks tree_value_prof_hooks = {
|
|
|
|
|
tree_find_values_to_profile,
|
|
|
|
|
tree_value_profile_transformations
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
tree_register_value_prof_hooks (void)
|
|
|
|
|
{
|
|
|
|
|
value_prof_hooks = &tree_value_prof_hooks;
|
value-prof.c (rtl_find_values_to_profile): Use gcc_assert and gcc_unreachable.
* value-prof.c (rtl_find_values_to_profile): Use gcc_assert and
gcc_unreachable.
(rtl_register_value_prof_hooks,
tree_value_profile_transformations,
tree_register_value_prof_hooks): Likewise.
* var-tracking.c (stack_adjust_offset_pre_post,
variable_htab_free, variable_union, dataflow_set_different_2,
count_uses, variable_was_changed, set_frame_base_location,
set_variable_part, emit_note_insn_var_location, vt_emit_notes,
vt_add_function_parameters): Likewise.
* varasm.c (named_section_real, named_section, make_decl_rtl,
asm_emit_uninitialised, assemble_integer, decode_addr_const,
const_hash_1, compare_constant, copy_constant, force_const_mem,
output_constant_pool_2, output_constant_pool_1, output_constant,
output_constructor, make_decl_one_only, decl_tls_model,
default_no_named_section, default_elf_select_section_1,
default_unique_section_1): Likewise.
* vec.c (vec_gc_o_reserve, vec_heap_o_reserve): Likewise.
* vmsdbgout.c (addr_const_to_string): Likewise.
From-SVN: r96241
2005-03-10 16:36:42 +01:00
|
|
|
|
gcc_assert (ir_type ());
|
2004-05-13 08:41:07 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* IR-independent entry points. */
|
|
|
|
|
void
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
find_values_to_profile (histogram_values *values)
|
2004-05-13 08:41:07 +02:00
|
|
|
|
{
|
Makefile.in (rtl-profile.o, [...]): Add GCC_H dependency.
* Makefile.in (rtl-profile.o, value-prof.o): Add GCC_H dependency.
* common.opt (fspeculative-prefetching): New.
* flags.h (flag_speculative_prefetching_set): Declare.
* gcov-io.c (gcov_write_counter, gcov_read_counter): Allow negative
values.
* opts.c (flag_sepculative_prefetching_set): New variable.
(common_handle_option): Handle -fspeculative-prefetching.
* passes.c (rest_of_compilation): Ditto.
* profile.c (instrument_values, compute_value_histograms, branch_prob):
Use vectors instead of arrays.
* toplev.c (process_options): Handle -fspeculative-prefetching.
* rtl-profile.c: Include ggc.h.
(rtl_gen_interval_profiler, rtl_gen_pow2_profiler,
rtl_gen_one_value_profiler_no_edge_manipulation,
rtl_gen_one_value_profiler, rtl_gen_const_delta_profiler): Type of
argument changed.
* tree-profile.c (tree_gen_interval_profiler, tree_gen_pow2_profiler,
tree_gen_one_value_profiler, tree_gen_const_delta_profiler): Type of
argument changed.
* value-prof.c: Include ggc.h.
(NOPREFETCH_RANGE_MIN, NOPREFETCH_RANGE_MAX): New
macros.
(insn_prefetch_values_to_profile, find_mem_reference_1,
find_mem_reference_2, find_mem_reference, gen_speculative_prefetch,
speculative_prefetching_transform): New.
(value_profile_transformations): Call speculative_prefetching_transform.
(insn_values_to_profile): Call insn_prefetch_values_to_profile.
(insn_divmod_values_to_profile, rtl_find_values_to_profile,
tree_find_values_to_profile, find_values to profile): Use vectors
instead of arrays.
(free_profiled_values): Removed.
* value-prof.h (struct histogram_value): Renamed to
struct histogram_value_t.
(histogram_value, histogram_values): New types.
(find_values_to_profile): Declaration changed.
(free_profiled_values): Removed.
(struct profile_hooks): Type of argument of the hooks changed to
histogram_value.
* doc/invoke.texi (-fspeculative-prefetching): Document.
From-SVN: r86930
2004-09-01 22:58:55 +02:00
|
|
|
|
(value_prof_hooks->find_values_to_profile) (values);
|
2004-05-13 08:41:07 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
value_profile_transformations (void)
|
|
|
|
|
{
|
|
|
|
|
return (value_prof_hooks->value_profile_transformations) ();
|
|
|
|
|
}
|
|
|
|
|
|