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

Reply via email to