On Tue, Apr 12, 2011 at 4:16 PM, Nathan Froyd wrote: > It's a shame more passes don't make use of the statistics_* > infrastructure.  This patch is a step towards rectifying that and adds > statistics_counter_event calls to passes mentioned in $SUBJECT. > postreload-gcse already tracked the stats for the dump file and so only > needs the statistics_counter_event calls; the other passes needed to be > taught about the statistics also. > > Tested on x86_64-unknown-linux-gnu.  OK to commit? Ok if there are no complaints within 24h. I actually have a local patch adding many of these which I use whenever fiddling with the pass pipeline ... (attached). Richard. > -Nathan > >        * postreload-gcse.c (gcse_after_reload_main): Add calls to >        statistics_counter_event. >        * tree-ssa-copyrename.c (stats): Define. >        (rename_ssa_copies): Count coalesced SSA_NAMEs.  Add call to >        statistics_counter_event. >        * tree-ssa-math-opts.c (reciprocal_stats, sincos_stats): Define. >        (bswap_stats, widen_mul_stats): Define. >        (insert_reciprocals): Increment rdivs_inserted. >        (execute_cse_reciprocals): Zeroize reciprocal_stats.  Increment >        rfuncs_inserted.  Add calls to statistics_counter_event. >        (execute_cse_sincos_1): Increment inserted. >        (execute_cse_sincos): Zeroize sincos_stats.  Add call to >        statistics_counter_event. >        (execute_optimize_bswap): Zeroize bswap_stats.  Increment fields >        of bswap_stats.  Add calls to statistics_counter_event. >        (convert_mult_to_widen): Increment widen_mults_inserted. >        (convert_plusminus_to_widen): Increment maccs_inserted. >        (convert_mult_to_fma): Increment fmas_inserted. >        (execute_optimize_widening_mul): Zeroize widen_mul_stats.  Add >        calls to statistics_counter_event. > > diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c > index 7eeecf4..8e26419 100644 > --- a/gcc/postreload-gcse.c > +++ b/gcc/postreload-gcse.c > @@ -1294,6 +1294,13 @@ gcse_after_reload_main (rtx f ATTRIBUTE_UNUSED) >          fprintf (dump_file, "insns deleted:   %d\n", stats.insns_deleted); >          fprintf (dump_file, "\n\n"); >        } > + > +      statistics_counter_event (cfun, "copies inserted", > +                               stats.copies_inserted); > +      statistics_counter_event (cfun, "moves inserted", > +                               stats.moves_inserted); > +      statistics_counter_event (cfun, "insns deleted", > +                               stats.insns_deleted); >     } > >   /* We are finished with alias.  */ > diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c > index dfc0b4e..ae4fb5f 100644 > --- a/gcc/tree-ssa-copyrename.c > +++ b/gcc/tree-ssa-copyrename.c > @@ -40,6 +40,12 @@ along with GCC; see the file COPYING3.  If not see >  #include "tree-pass.h" >  #include "langhooks.h" > > +static struct > +{ > +  /* Number of copies coalesced.  */ > +  int coalesced; > +} stats; > + >  /* The following routines implement the SSA copy renaming phase. > >    This optimization looks for copies between 2 SSA_NAMES, either through a > @@ -360,9 +366,12 @@ rename_ssa_copies (void) >              fprintf (debug, "\n"); >            } >        } > +      stats.coalesced++; >       replace_ssa_name_symbol (var, SSA_NAME_VAR (part_var)); >     } > > +  statistics_counter_event (cfun, "copies coalesced", > +                           stats.coalesced); >   delete_var_map (map); >   return updated ? TODO_remove_unused_locals : 0; >  } > diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c > index 6e2213c..b9f631e 100644 > --- a/gcc/tree-ssa-math-opts.c > +++ b/gcc/tree-ssa-math-opts.c > @@ -138,6 +138,41 @@ struct occurrence { >   bool bb_has_division; >  }; > > +static struct > +{ > +  /* Number of 1.0/X ops inserted.  */ > +  int rdivs_inserted; > + > +  /* Number of 1.0/FUNC ops inserted.  */ > +  int rfuncs_inserted; > +} reciprocal_stats; > + > +static struct > +{ > +  /* Number of cexpi calls inserted.  */ > +  int inserted; > +} sincos_stats; > + > +static struct > +{ > +  /* Number of hand-written 32-bit bswaps found.  */ > +  int found_32bit; > + > +  /* Number of hand-written 64-bit bswaps found.  */ > +  int found_64bit; > +} bswap_stats; > + > +static struct > +{ > +  /* Number of widening multiplication ops inserted.  */ > +  int widen_mults_inserted; > + > +  /* Number of integer multiply-and-accumulate ops inserted.  */ > +  int maccs_inserted; > + > +  /* Number of fp fused multiply-add ops inserted.  */ > +  int fmas_inserted; > +} widen_mul_stats; > >  /* The instance of "struct occurrence" representing the highest >    interesting block in the dominator tree.  */ > @@ -339,6 +374,8 @@ insert_reciprocals (gimple_stmt_iterator *def_gsi, struct occurrence *occ, >           gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT); >         } > > +      reciprocal_stats.rdivs_inserted++; > + >       occ->recip_def_stmt = new_stmt; >     } > > @@ -466,6 +503,7 @@ execute_cse_reciprocals (void) >                                sizeof (struct occurrence), >                                n_basic_blocks / 3 + 1); > > +  memset (&reciprocal_stats, 0, sizeof (reciprocal_stats)); >   calculate_dominance_info (CDI_DOMINATORS); >   calculate_dominance_info (CDI_POST_DOMINATORS); > > @@ -568,6 +606,7 @@ execute_cse_reciprocals (void) >                  gimple_replace_lhs (stmt1, arg1); >                  gimple_call_set_fndecl (stmt1, fndecl); >                  update_stmt (stmt1); > +                 reciprocal_stats.rfuncs_inserted++; > >                  FOR_EACH_IMM_USE_STMT (stmt, ui, arg1) >                    { > @@ -580,6 +619,11 @@ execute_cse_reciprocals (void) >        } >     } > > +  statistics_counter_event (cfun, "reciprocal divs inserted", > +                           reciprocal_stats.rdivs_inserted); > +  statistics_counter_event (cfun, "reciprocal functions inserted", > +                           reciprocal_stats.rfuncs_inserted); > + >   free_dominance_info (CDI_DOMINATORS); >   free_dominance_info (CDI_POST_DOMINATORS); >   free_alloc_pool (occ_pool); > @@ -711,6 +755,7 @@ execute_cse_sincos_1 (tree name) >       gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); >     } >   update_stmt (stmt); > +  sincos_stats.inserted++; > >   /* And adjust the recorded old call sites.  */ >   for (i = 0; VEC_iterate(gimple, stmts, i, use_stmt); ++i) > @@ -760,6 +805,7 @@ execute_cse_sincos (void) >   bool cfg_changed = false; > >   calculate_dominance_info (CDI_DOMINATORS); > +  memset (&sincos_stats, 0, sizeof (sincos_stats)); > >   FOR_EACH_BB (bb) >     { > @@ -793,6 +839,9 @@ execute_cse_sincos (void) >        } >     } > > +  statistics_counter_event (cfun, "sincos statements inserted", > +                           sincos_stats.inserted); > + >   free_dominance_info (CDI_DOMINATORS); >   return cfg_changed ? TODO_cleanup_cfg : 0; >  } > @@ -1141,6 +1190,8 @@ execute_optimize_bswap (void) >       bswap64_type = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fndecl))); >     } > > +  memset (&bswap_stats, 0, sizeof (bswap_stats)); > + >   FOR_EACH_BB (bb) >     { >       gimple_stmt_iterator gsi; > @@ -1189,6 +1240,10 @@ execute_optimize_bswap (void) >            continue; > >          changed = true; > +         if (type_size == 32) > +           bswap_stats.found_32bit++; > +         else > +           bswap_stats.found_64bit++; > >          bswap_tmp = bswap_src; > > @@ -1237,6 +1292,11 @@ execute_optimize_bswap (void) >        } >     } > > +  statistics_counter_event (cfun, "32-bit bswap implementations found", > +                           bswap_stats.found_32bit); > +  statistics_counter_event (cfun, "64-bit bswap implementations found", > +                           bswap_stats.found_64bit); > + >   return (changed ? TODO_dump_func | TODO_update_ssa | TODO_verify_ssa >          | TODO_verify_stmts : 0); >  } > @@ -1389,6 +1449,7 @@ convert_mult_to_widen (gimple stmt) >   gimple_assign_set_rhs2 (stmt, fold_convert (type2, rhs2)); >   gimple_assign_set_rhs_code (stmt, WIDEN_MULT_EXPR); >   update_stmt (stmt); > +  widen_mul_stats.widen_mults_inserted++; >   return true; >  } > > @@ -1491,6 +1552,7 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt, >                                    fold_convert (type2, mult_rhs2), >                                    add_rhs); >   update_stmt (gsi_stmt (*gsi)); > +  widen_mul_stats.maccs_inserted++; >   return true; >  } > > @@ -1666,6 +1728,7 @@ convert_mult_to_fma (gimple mul_stmt, tree op1, tree op2) >                                                mulop1, op2, >                                                addop); >       gsi_replace (&gsi, fma_stmt, true); > +      widen_mul_stats.fmas_inserted++; >     } > >   return true; > @@ -1681,6 +1744,8 @@ execute_optimize_widening_mul (void) >   basic_block bb; >   bool cfg_changed = false; > > +  memset (&widen_mul_stats, 0, sizeof (widen_mul_stats)); > + >   FOR_EACH_BB (bb) >     { >       gimple_stmt_iterator gsi; > @@ -1752,6 +1817,13 @@ execute_optimize_widening_mul (void) >        } >     } > > +  statistics_counter_event (cfun, "widening multiplications inserted", > +                           widen_mul_stats.widen_mults_inserted); > +  statistics_counter_event (cfun, "widening maccs inserted", > +                           widen_mul_stats.maccs_inserted); > +  statistics_counter_event (cfun, "fused multiply-adds inserted", > +                           widen_mul_stats.fmas_inserted); > + >   return cfg_changed ? TODO_cleanup_cfg : 0; >  } > >