On Thu, Aug 18, 2016 at 1:14 AM, Richard Biener <rguent...@suse.de> wrote: > > The following patch makes it possible to add statistic counters to > update-ssa. Clone materialization ends up updating SSA form from > a context with current_pass being NULL - wrapping materialize_all_clones > into a pass fixes this. > > Bootstrap / regtest running on x86_64-unknown-linux-gnu, ok for trunk? > > (simple-ipa-pass was the simplest but not sure if it is the most efficient > given I remember we somehow pull in all bodies for this?)
This patch introduced an ICE with LTO due to it calling the update_ssa without being inside a pass. I filed this as https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77305 . Thanks, Andrew > > Thanks, > Richard. > > 2016-08-18 Richard Biener <rguent...@suse.de> > > * tree-pass.h (make_pass_materialize_all_clones): Declare. > * ipa.c (pass_data_materialize_all_clones, > pass_materialize_all_clones, > make_pass_materialize_all_clones): New simple IPA pass encapsulating > clone materialization. > * passes.def (all_late_ipa_passes): Start with > pass_materialize_all_clones. > * cgraphunit.c (symbol_table::compile): Remove call to > materialize_all_clones. > * tree-into-ssa.c: Include statistics.h. > (update_ssa): Count number of times we do incremental/rewrite > SSA update. > > Index: gcc/tree-pass.h > =================================================================== > *** gcc/tree-pass.h (revision 239560) > --- gcc/tree-pass.h (working copy) > *************** extern ipa_opt_pass_d *make_pass_ipa_pro > *** 504,509 **** > --- 504,511 ---- > extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt); > extern ipa_opt_pass_d *make_pass_ipa_single_use (gcc::context *ctxt); > extern ipa_opt_pass_d *make_pass_ipa_comdats (gcc::context *ctxt); > + extern simple_ipa_opt_pass *make_pass_materialize_all_clones (gcc::context * > + ctxt); > > extern gimple_opt_pass *make_pass_cleanup_cfg_post_optimizing (gcc::context > *ctxt); > Index: gcc/ipa.c > =================================================================== > *** gcc/ipa.c (revision 239560) > --- gcc/ipa.c (working copy) > *************** make_pass_ipa_single_use (gcc::context * > *** 1443,1445 **** > --- 1443,1486 ---- > { > return new pass_ipa_single_use (ctxt); > } > + > + /* Materialize all clones. */ > + > + namespace { > + > + const pass_data pass_data_materialize_all_clones = > + { > + SIMPLE_IPA_PASS, /* type */ > + "materialize-all-clones", /* name */ > + OPTGROUP_NONE, /* optinfo_flags */ > + TV_IPA_OPT, /* tv_id */ > + 0, /* properties_required */ > + 0, /* properties_provided */ > + 0, /* properties_destroyed */ > + 0, /* todo_flags_start */ > + 0, /* todo_flags_finish */ > + }; > + > + class pass_materialize_all_clones : public simple_ipa_opt_pass > + { > + public: > + pass_materialize_all_clones (gcc::context *ctxt) > + : simple_ipa_opt_pass (pass_data_materialize_all_clones, ctxt) > + {} > + > + /* opt_pass methods: */ > + virtual unsigned int execute (function *) > + { > + symtab->materialize_all_clones (); > + return 0; > + } > + > + }; // class pass_materialize_all_clones > + > + } // anon namespace > + > + simple_ipa_opt_pass * > + make_pass_materialize_all_clones (gcc::context *ctxt) > + { > + return new pass_materialize_all_clones (ctxt); > + } > Index: gcc/passes.def > =================================================================== > *** gcc/passes.def (revision 239560) > --- gcc/passes.def (working copy) > *************** along with GCC; see the file COPYING3. > *** 167,172 **** > --- 167,173 ---- > passes are executed after partitioning and thus see just parts of the > compiled unit. */ > INSERT_PASSES_AFTER (all_late_ipa_passes) > + NEXT_PASS (pass_materialize_all_clones); > NEXT_PASS (pass_ipa_pta); > NEXT_PASS (pass_dispatcher_calls); > NEXT_PASS (pass_omp_simd_clone); > Index: gcc/cgraphunit.c > =================================================================== > *** gcc/cgraphunit.c (revision 239560) > --- gcc/cgraphunit.c (working copy) > *************** symbol_table::compile (void) > *** 2435,2441 **** > fprintf (stderr, "Assembling functions:\n"); > symtab_node::checking_verify_symtab_nodes (); > > - materialize_all_clones (); > bitmap_obstack_initialize (NULL); > execute_ipa_pass_list (g->get_passes ()->all_late_ipa_passes); > bitmap_obstack_release (NULL); > --- 2438,2443 ---- > Index: gcc/tree-into-ssa.c > =================================================================== > *** gcc/tree-into-ssa.c (revision 239560) > --- gcc/tree-into-ssa.c (working copy) > *************** along with GCC; see the file COPYING3. > *** 37,42 **** > --- 37,43 ---- > #include "tree-dfa.h" > #include "tree-ssa.h" > #include "domwalk.h" > + #include "statistics.h" > > #define PERCENT(x,y) ((float)(x) * 100.0 / (float)(y)) > > *************** update_ssa (unsigned update_flags) > *** 3248,3253 **** > --- 3249,3256 ---- > OLD_SSA_NAMES. */ > if (bitmap_first_set_bit (new_ssa_names) >= 0) > { > + statistics_counter_event (cfun, "Incremental SSA update", 1); > + > prepare_names_to_update (insert_phi_p); > > /* If all the names in NEW_SSA_NAMES had been marked for > *************** update_ssa (unsigned update_flags) > *** 3261,3266 **** > --- 3264,3271 ---- > /* Next, determine the block at which to start the renaming process. */ > if (cfun->gimple_df->ssa_renaming_needed) > { > + statistics_counter_event (cfun, "Symbol to SSA rewrite", 1); > + > /* If we rename bare symbols initialize the mapping to > auxiliar info we need to keep track of. */ > var_infos = new hash_table<var_info_hasher> (47);