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

Reply via email to