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?) 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);