tree-pass.h (current_pass): Declare.

2008-05-15  Richard Guenther  <rguenther@suse.de>

	* tree-pass.h (current_pass): Declare.
	(get_pass_for_id): Likewise.
	* passes.c (passes_by_id, passes_by_id_size): New globals.
	(set_pass_for_id): New function.
	(get_pass_for_id): Likewise.
	(register_one_dump_file): Use set_pass_for_id to populate passes_by_id.
	(execute_function_todo): Flush per function statistics.
	* toplev.c (compile_file): Init statistics.
	(general_init): Do early statistics initialization.
	(finalize): Finish statistics.
	* statistics.h (statistics_early_init): Declare.
	(statistics_init): Likewise.
	(statistics_fini): Likewise.
	(statistics_fini_pass): Likewise.
	(statistics_counter_event): Likewise.
	(statistics_histogram_event): Likewise.
	* statistics.c: New file.
	* Makefile.in (OBJS-common): Add statistics.o.
	(statistics.o): Add dependencies.
	* doc/invoke.texi (-fdump-statistics): Document.

	* tree-ssa-pre.c (compute_antic): Use statistics_histogram_event.
	(insert): Likewise.
	(execute_pre): Use statistics_counter_event.
	* tree-ssa-propagate.c (struct prop_stats_d): Add num_dce field.
	(substitute_and_fold): Increment it.  Use statistics_counter_event.

	* gcc.dg/tree-ssa/loadpre7.c: Adjust scan for not performed
	transformation.
	* gcc.dg/tree-ssa/ssa-fre-10.c: Likewise.

From-SVN: r135358
This commit is contained in:
Richard Guenther 2008-05-15 13:39:39 +00:00 committed by Richard Biener
parent 77f377f70e
commit 9fe0cb7d88
12 changed files with 129 additions and 33 deletions

View File

@ -1,3 +1,32 @@
2008-05-15 Richard Guenther <rguenther@suse.de>
* tree-pass.h (current_pass): Declare.
(get_pass_for_id): Likewise.
* passes.c (passes_by_id, passes_by_id_size): New globals.
(set_pass_for_id): New function.
(get_pass_for_id): Likewise.
(register_one_dump_file): Use set_pass_for_id to populate passes_by_id.
(execute_function_todo): Flush per function statistics.
* toplev.c (compile_file): Init statistics.
(general_init): Do early statistics initialization.
(finalize): Finish statistics.
* statistics.h (statistics_early_init): Declare.
(statistics_init): Likewise.
(statistics_fini): Likewise.
(statistics_fini_pass): Likewise.
(statistics_counter_event): Likewise.
(statistics_histogram_event): Likewise.
* statistics.c: New file.
* Makefile.in (OBJS-common): Add statistics.o.
(statistics.o): Add dependencies.
* doc/invoke.texi (-fdump-statistics): Document.
* tree-ssa-pre.c (compute_antic): Use statistics_histogram_event.
(insert): Likewise.
(execute_pre): Use statistics_counter_event.
* tree-ssa-propagate.c (struct prop_stats_d): Add num_dce field.
(substitute_and_fold): Increment it. Use statistics_counter_event.
2008-05-15 Diego Novillo <dnovillo@google.com> 2008-05-15 Diego Novillo <dnovillo@google.com>
http://gcc.gnu.org/ml/gcc-patches/2008-05/msg00893.html http://gcc.gnu.org/ml/gcc-patches/2008-05/msg00893.html

View File

@ -1131,6 +1131,7 @@ OBJS-common = \
sparseset.o \ sparseset.o \
sreal.o \ sreal.o \
stack-ptr-mod.o \ stack-ptr-mod.o \
statistics.o \
stmt.o \ stmt.o \
stor-layout.o \ stor-layout.o \
stringpool.o \ stringpool.o \
@ -2396,6 +2397,8 @@ function.o : function.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
output.h toplev.h except.h $(HASHTAB_H) $(GGC_H) $(TM_P_H) langhooks.h \ output.h toplev.h except.h $(HASHTAB_H) $(GGC_H) $(TM_P_H) langhooks.h \
gt-function.h $(TARGET_H) $(BASIC_BLOCK_H) $(INTEGRATE_H) $(PREDICT_H) \ gt-function.h $(TARGET_H) $(BASIC_BLOCK_H) $(INTEGRATE_H) $(PREDICT_H) \
tree-pass.h $(DF_H) timevar.h vecprim.h tree-pass.h $(DF_H) timevar.h vecprim.h
statistics.o : statistics.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(FLAGS_H) $(FUNCTION_H) $(HASHTAB_H) $(TREE_DUMP_H) tree-pass.h
stmt.o : stmt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ stmt.o : stmt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(TREE_H) $(FLAGS_H) $(FUNCTION_H) insn-config.h hard-reg-set.h $(EXPR_H) \ $(TREE_H) $(FLAGS_H) $(FUNCTION_H) insn-config.h hard-reg-set.h $(EXPR_H) \
libfuncs.h except.h $(RECOG_H) toplev.h output.h $(GGC_H) $(TM_P_H) \ libfuncs.h except.h $(RECOG_H) toplev.h output.h $(GGC_H) $(TM_P_H) \

View File

@ -276,6 +276,7 @@ Objective-C and Objective-C++ Dialects}.
-fdump-noaddr -fdump-unnumbered -fdump-translation-unit@r{[}-@var{n}@r{]} @gol -fdump-noaddr -fdump-unnumbered -fdump-translation-unit@r{[}-@var{n}@r{]} @gol
-fdump-class-hierarchy@r{[}-@var{n}@r{]} @gol -fdump-class-hierarchy@r{[}-@var{n}@r{]} @gol
-fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline @gol -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline @gol
-fdump-statistics @gol
-fdump-tree-all @gol -fdump-tree-all @gol
-fdump-tree-original@r{[}-@var{n}@r{]} @gol -fdump-tree-original@r{[}-@var{n}@r{]} @gol
-fdump-tree-optimized@r{[}-@var{n}@r{]} @gol -fdump-tree-optimized@r{[}-@var{n}@r{]} @gol
@ -4724,6 +4725,15 @@ Dump after function inlining.
@end table @end table
@item -fdump-statistics-@var{option}
@opindex -fdump-statistics
Enable and control dumping of pass statistics in a separate file. The
file name is generated by appending a suffix ending in @samp{.statistics}
to the source file name. If the @samp{-@var{option}} form is used,
@samp{-stats} will cause counters to be summed over the whole compilation unit
while @samp{-details} will dump every event as the passes generate them.
The default with no option is to sum counters for each function compiled.
@item -fdump-tree-@var{switch} @item -fdump-tree-@var{switch}
@itemx -fdump-tree-@var{switch}-@var{options} @itemx -fdump-tree-@var{switch}-@var{options}
@opindex fdump-tree @opindex fdump-tree

View File

@ -333,6 +333,37 @@ struct rtl_opt_pass pass_postreload =
/* The root of the compilation pass tree, once constructed. */ /* The root of the compilation pass tree, once constructed. */
struct opt_pass *all_passes, *all_ipa_passes, *all_lowering_passes; struct opt_pass *all_passes, *all_ipa_passes, *all_lowering_passes;
/* A map from static pass id to optimization pass. */
struct opt_pass **passes_by_id;
int passes_by_id_size;
/* Set the static pass number of pass PASS to ID and record that
in the mapping from static pass number to pass. */
static void
set_pass_for_id (int id, struct opt_pass *pass)
{
pass->static_pass_number = id;
if (passes_by_id_size <= id)
{
passes_by_id = xrealloc (passes_by_id, (id + 1) * sizeof (void *));
memset (passes_by_id + passes_by_id_size, 0,
(id + 1 - passes_by_id_size) * sizeof (void *));
passes_by_id_size = id + 1;
}
passes_by_id[id] = pass;
}
/* Return the pass with the static pass number ID. */
struct opt_pass *
get_pass_for_id (int id)
{
if (id >= passes_by_id_size)
return NULL;
return passes_by_id[id];
}
/* Iterate over the pass tree allocating dump file numbers. We want /* Iterate over the pass tree allocating dump file numbers. We want
to do this depth first, and independent of whether the pass is to do this depth first, and independent of whether the pass is
enabled or not. */ enabled or not. */
@ -343,7 +374,7 @@ register_one_dump_file (struct opt_pass *pass)
char *dot_name, *flag_name, *glob_name; char *dot_name, *flag_name, *glob_name;
const char *prefix; const char *prefix;
char num[10]; char num[10];
int flags; int flags, id;
/* See below in next_pass_1. */ /* See below in next_pass_1. */
num[0] = '\0'; num[0] = '\0';
@ -361,8 +392,8 @@ register_one_dump_file (struct opt_pass *pass)
flag_name = concat (prefix, pass->name, num, NULL); flag_name = concat (prefix, pass->name, num, NULL);
glob_name = concat (prefix, pass->name, NULL); glob_name = concat (prefix, pass->name, NULL);
pass->static_pass_number = dump_register (dot_name, flag_name, glob_name, id = dump_register (dot_name, flag_name, glob_name, flags);
flags); set_pass_for_id (id, pass);
} }
/* Recursive worker function for register_dump_files. */ /* Recursive worker function for register_dump_files. */
@ -884,6 +915,8 @@ execute_function_todo (void *data)
if (!flags) if (!flags)
return; return;
statistics_fini_pass ();
/* Always cleanup the CFG before trying to update SSA. */ /* Always cleanup the CFG before trying to update SSA. */
if (flags & TODO_cleanup_cfg) if (flags & TODO_cleanup_cfg)
{ {
@ -1346,4 +1379,5 @@ execute_ipa_pass_list (struct opt_pass *pass)
} }
while (pass); while (pass);
} }
#include "gt-passes.h" #include "gt-passes.h"

View File

@ -1,5 +1,5 @@
/* Memory statistics helpers. /* Memory and optimization statistics helpers.
Copyright (C) 2004, 2007 Copyright (C) 2004, 2007, 2008
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Cygnus Solutions. Contributed by Cygnus Solutions.
@ -21,6 +21,7 @@
#ifndef GCC_STATISTICS #ifndef GCC_STATISTICS
#define GCC_STATISTICS #define GCC_STATISTICS
#ifdef GATHER_STATISTICS #ifdef GATHER_STATISTICS
#define MEM_STAT_DECL , const char * ARG_UNUSED (_loc_name), int ARG_UNUSED (_loc_line), const char * ARG_UNUSED (_loc_function) #define MEM_STAT_DECL , const char * ARG_UNUSED (_loc_name), int ARG_UNUSED (_loc_line), const char * ARG_UNUSED (_loc_function)
#define ALONE_MEM_STAT_DECL const char * ARG_UNUSED (_loc_name), int ARG_UNUSED (_loc_line), const char * ARG_UNUSED (_loc_function) #define ALONE_MEM_STAT_DECL const char * ARG_UNUSED (_loc_name), int ARG_UNUSED (_loc_line), const char * ARG_UNUSED (_loc_function)
@ -36,4 +37,15 @@
#define MEM_STAT_INFO #define MEM_STAT_INFO
#define ALONE_MEM_STAT_INFO #define ALONE_MEM_STAT_INFO
#endif #endif
struct function;
/* In statistics.c */
extern void statistics_early_init (void);
extern void statistics_init (void);
extern void statistics_fini (void);
extern void statistics_fini_pass (void);
extern void statistics_counter_event (struct function *, const char *, int);
extern void statistics_histogram_event (struct function *, const char *, int);
#endif #endif

View File

@ -1,3 +1,9 @@
2008-05-15 Richard Guenther <rguenther@suse.de>
* gcc.dg/tree-ssa/loadpre7.c: Adjust scan for not performed
transformation.
* gcc.dg/tree-ssa/ssa-fre-10.c: Likewise.
2008-05-15 Richard Guenther <rguenther@suse.de> 2008-05-15 Richard Guenther <rguenther@suse.de>
PR middle-end/36244 PR middle-end/36244

View File

@ -13,5 +13,5 @@ enormlz (x)
eshup8 (x); eshup8 (x);
} }
} }
/* { dg-final { scan-tree-dump-times "Eliminated: 0" 1 "pre"} } */ /* { dg-final { scan-tree-dump-not "Eliminated:" "pre"} } */
/* { dg-final { cleanup-tree-dump "pre" } } */ /* { dg-final { cleanup-tree-dump "pre" } } */

View File

@ -16,5 +16,5 @@ void __frame_state_for (volatile char *state_in, int x)
} }
} }
/* { dg-final { scan-tree-dump "Insertions: 0" "pre" } } */ /* { dg-final { scan-tree-dump-not "Insertions:" "pre" } } */
/* { dg-final { cleanup-tree-dump "pre" } } */ /* { dg-final { cleanup-tree-dump "pre" } } */

View File

@ -954,6 +954,7 @@ compile_file (void)
init_cgraph (); init_cgraph ();
init_final (main_input_filename); init_final (main_input_filename);
coverage_init (aux_base_name); coverage_init (aux_base_name);
statistics_init ();
timevar_push (TV_PARSE); timevar_push (TV_PARSE);
@ -1598,6 +1599,7 @@ general_init (const char *argv0)
/* This must be done after add_params but before argument processing. */ /* This must be done after add_params but before argument processing. */
init_ggc_heuristics(); init_ggc_heuristics();
init_optimization_passes (); init_optimization_passes ();
statistics_early_init ();
} }
/* Return true if the current target supports -fsection-anchors. */ /* Return true if the current target supports -fsection-anchors. */
@ -2118,6 +2120,7 @@ finalize (void)
fatal_error ("error closing %s: %m", asm_file_name); fatal_error ("error closing %s: %m", asm_file_name);
} }
statistics_fini ();
finish_optimization_passes (); finish_optimization_passes ();
if (mem_report) if (mem_report)

View File

@ -508,6 +508,10 @@ extern struct gimple_opt_pass pass_update_address_taken;
/* The root of the compilation pass tree, once constructed. */ /* The root of the compilation pass tree, once constructed. */
extern struct opt_pass *all_passes, *all_ipa_passes, *all_lowering_passes; extern struct opt_pass *all_passes, *all_ipa_passes, *all_lowering_passes;
/* Current optimization pass. */
extern struct opt_pass *current_pass;
extern struct opt_pass * get_pass_for_id (int);
extern void execute_pass_list (struct opt_pass *); extern void execute_pass_list (struct opt_pass *);
extern void execute_ipa_pass_list (struct opt_pass *); extern void execute_ipa_pass_list (struct opt_pass *);
extern void print_current_pass (FILE *); extern void print_current_pass (FILE *);

View File

@ -2031,8 +2031,7 @@ compute_antic (void)
gcc_assert (num_iterations < 50); gcc_assert (num_iterations < 50);
} }
if (dump_file && (dump_flags & TDF_STATS)) statistics_histogram_event (cfun, "compute_antic iterations",
fprintf (dump_file, "compute_antic required %d iterations\n",
num_iterations); num_iterations);
if (do_partial_partial) if (do_partial_partial)
@ -2061,8 +2060,7 @@ compute_antic (void)
/* Theoretically possible, but *highly* unlikely. */ /* Theoretically possible, but *highly* unlikely. */
gcc_assert (num_iterations < 50); gcc_assert (num_iterations < 50);
} }
if (dump_file && (dump_flags & TDF_STATS)) statistics_histogram_event (cfun, "compute_partial_antic iterations",
fprintf (dump_file, "compute_partial_antic required %d iterations\n",
num_iterations); num_iterations);
} }
sbitmap_free (has_abnormal_preds); sbitmap_free (has_abnormal_preds);
@ -2936,8 +2934,7 @@ insert (void)
new_stuff = false; new_stuff = false;
new_stuff = insert_aux (ENTRY_BLOCK_PTR); new_stuff = insert_aux (ENTRY_BLOCK_PTR);
} }
if (num_iterations > 2 && dump_file && (dump_flags & TDF_STATS)) statistics_histogram_event (cfun, "insert iterations", num_iterations);
fprintf (dump_file, "insert required %d iterations\n", num_iterations);
} }
@ -4019,14 +4016,11 @@ execute_pre (bool do_fre)
/* Remove all the redundant expressions. */ /* Remove all the redundant expressions. */
todo |= eliminate (); todo |= eliminate ();
if (dump_file && (dump_flags & TDF_STATS)) statistics_counter_event (cfun, "Insertions", pre_stats.insertions);
{ statistics_counter_event (cfun, "PA inserted", pre_stats.pa_insert);
fprintf (dump_file, "Insertions: %d\n", pre_stats.insertions); statistics_counter_event (cfun, "New PHIs", pre_stats.phis);
fprintf (dump_file, "PA inserted: %d\n", pre_stats.pa_insert); statistics_counter_event (cfun, "Eliminated", pre_stats.eliminations);
fprintf (dump_file, "New PHIs: %d\n", pre_stats.phis); statistics_counter_event (cfun, "Constified", pre_stats.constified);
fprintf (dump_file, "Eliminated: %d\n", pre_stats.eliminations);
fprintf (dump_file, "Constified: %d\n", pre_stats.constified);
}
bsi_commit_edge_inserts (); bsi_commit_edge_inserts ();
clear_expression_ids (); clear_expression_ids ();

View File

@ -890,6 +890,7 @@ struct prop_stats_d
long num_const_prop; long num_const_prop;
long num_copy_prop; long num_copy_prop;
long num_pred_folded; long num_pred_folded;
long num_dce;
}; };
static struct prop_stats_d prop_stats; static struct prop_stats_d prop_stats;
@ -1255,6 +1256,7 @@ substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p)
print_generic_expr (dump_file, stmt, 0); print_generic_expr (dump_file, stmt, 0);
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
prop_stats.num_dce++;
bsi_remove (&i, true); bsi_remove (&i, true);
release_defs (stmt); release_defs (stmt);
if (!bsi_end_p (i)) if (!bsi_end_p (i))
@ -1341,15 +1343,14 @@ substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p)
} }
} }
if (dump_file && (dump_flags & TDF_STATS)) statistics_counter_event (cfun, "Constants propagated",
{
fprintf (dump_file, "Constants propagated: %6ld\n",
prop_stats.num_const_prop); prop_stats.num_const_prop);
fprintf (dump_file, "Copies propagated: %6ld\n", statistics_counter_event (cfun, "Copies propagated",
prop_stats.num_copy_prop); prop_stats.num_copy_prop);
fprintf (dump_file, "Predicates folded: %6ld\n", statistics_counter_event (cfun, "Predicates folded",
prop_stats.num_pred_folded); prop_stats.num_pred_folded);
} statistics_counter_event (cfun, "Statements deleted",
prop_stats.num_dce);
return something_changed; return something_changed;
} }