Commit 9fe0cb7d by Richard Guenther Committed by Richard Biener

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
parent 77f377f7
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
......
...@@ -1131,6 +1131,7 @@ OBJS-common = \ ...@@ -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) \ ...@@ -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) \
......
...@@ -276,6 +276,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -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. ...@@ -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
......
...@@ -333,6 +333,37 @@ struct rtl_opt_pass pass_postreload = ...@@ -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) ...@@ -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) ...@@ -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. */
...@@ -883,7 +914,9 @@ execute_function_todo (void *data) ...@@ -883,7 +914,9 @@ execute_function_todo (void *data)
flags &= ~cfun->last_verified; flags &= ~cfun->last_verified;
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) ...@@ -1346,4 +1379,5 @@ execute_ipa_pass_list (struct opt_pass *pass)
} }
while (pass); while (pass);
} }
#include "gt-passes.h" #include "gt-passes.h"
/* 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 @@ ...@@ -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 @@ ...@@ -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
2008-05-15 Richard Guenther <rguenther@suse.de> 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>
PR middle-end/36244 PR middle-end/36244
* gcc.dg/torture/pr36244.c: New testcase. * gcc.dg/torture/pr36244.c: New testcase.
...@@ -13,5 +13,5 @@ enormlz (x) ...@@ -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" } } */
...@@ -16,5 +16,5 @@ void __frame_state_for (volatile char *state_in, int x) ...@@ -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" } } */
...@@ -954,6 +954,7 @@ compile_file (void) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -508,6 +508,10 @@ extern struct gimple_opt_pass pass_update_address_taken; ...@@ -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 *);
......
...@@ -2031,9 +2031,8 @@ compute_antic (void) ...@@ -2031,9 +2031,8 @@ 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,9 +2060,8 @@ compute_antic (void) ...@@ -2061,9 +2060,8 @@ 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);
sbitmap_free (changed_blocks); sbitmap_free (changed_blocks);
...@@ -2936,8 +2934,7 @@ insert (void) ...@@ -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) ...@@ -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 ();
......
...@@ -890,6 +890,7 @@ struct prop_stats_d ...@@ -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) ...@@ -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) ...@@ -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",
{ prop_stats.num_const_prop);
fprintf (dump_file, "Constants propagated: %6ld\n", statistics_counter_event (cfun, "Copies propagated",
prop_stats.num_const_prop); prop_stats.num_copy_prop);
fprintf (dump_file, "Copies propagated: %6ld\n", statistics_counter_event (cfun, "Predicates folded",
prop_stats.num_copy_prop); prop_stats.num_pred_folded);
fprintf (dump_file, "Predicates folded: %6ld\n", statistics_counter_event (cfun, "Statements deleted",
prop_stats.num_pred_folded); prop_stats.num_dce);
}
return something_changed; return something_changed;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment