> On Jun 17, 2014, at 6:07 AM, Richard Biener <rguent...@suse.de> wrote:
> 
> 
> First this adds a controlling option to the phiopt pass (-fssa-phiopt).
> Second, this moves the first phiopt pass from the main optimization
> pipeline into early opts (before merge-phi which confuses phiopt
> but after dce which will help it).
> 
> ISTR that adding an early phiopt pass was wanted to perform CFG
> cleanups on the weird CFG that the gimplifier produces from C++
> code (but I fail to recollect the details nor remember a bug number).
> 
> Generally doing a phiopt before merge-phi gets the chance to screw
> things up is good.  Also phiopt is a kind of cleanup that is
> always beneficial as it decreases code-size.
> 
> Bootstrap and regtest running on x86_64-unknown-linux-gnu.
> 
> I felt that -ftree-XXX is bad naming so I went for -fssa-XXX
> even if that is now inconsistent.  Any optinion here?  For
> RTL we simply have unsuffixed names so shall we instead go
> for -fphiopt?  PHI implies SSA anyway and 'SSA' or 'RTL' is
> an implementation detail that the user should not be interested
> in (applies to tree- as well, of course).  Now, 'phiopt' is a
> bad name when thinking of users (but they shouldn't play with
> those options anyway).
> 
> So - comments on the pass move?  Comments on the flag naming?
> 
> Thanks,
> Richard.
> 
> 2014-06-17  Richard Biener  <rguent...@suse.de>
> 
>    * passes.def (pass_all_early_optimizations): Add phi-opt
>    after dce and before merge-phi.
>    (pass_all_optimizations): Remove first phi-opt pass.
>    * common.opt (fssa-phiopt): New option.
>    * opts.c (default_options_table): Enable -fssa-phiopt with -O1+
>    but not with -Og.
>    * tree-ssa-phiopt.c (pass_phiopt): Add gate method.
>    * doc/invoke.texi (-fssa-phiopt): Document.
> 
> Index: gcc/passes.def
> ===================================================================
> --- gcc/passes.def    (revision 211736)
> +++ gcc/passes.def    (working copy)
> @@ -73,8 +73,12 @@ along with GCC; see the file COPYING3.
>         execute TODO_rebuild_alias at this point.  */
>      NEXT_PASS (pass_build_ealias);
>      NEXT_PASS (pass_fre);
> -      NEXT_PASS (pass_merge_phi);
>      NEXT_PASS (pass_cd_dce);
> +      NEXT_PASS (pass_phiopt);
> +      /* Do this after phiopt runs as phiopt is confused by
> +         PHIs with more than two arguments.  Switch conversion
> +         looks for a single PHI block though.  */
> +      NEXT_PASS (pass_merge_phi);

I had made phiopt not be confused by more than two arguments. What has changed? 
 I think we should make phiopt again better with more two arguments. 

Thanks,
Andrew


>      NEXT_PASS (pass_early_ipa_sra);
>      NEXT_PASS (pass_tail_recursion);
>      NEXT_PASS (pass_convert_switch);
> @@ -155,7 +159,6 @@ along with GCC; see the file COPYING3.
>       NEXT_PASS (pass_cselim);
>       NEXT_PASS (pass_copy_prop);
>       NEXT_PASS (pass_tree_ifcombine);
> -      NEXT_PASS (pass_phiopt);
>       NEXT_PASS (pass_tail_recursion);
>       NEXT_PASS (pass_ch);
>       NEXT_PASS (pass_stdarg);
> Index: gcc/common.opt
> ===================================================================
> --- gcc/common.opt    (revision 211736)
> +++ gcc/common.opt    (working copy)
> @@ -1950,6 +1950,10 @@ fsplit-wide-types
> Common Report Var(flag_split_wide_types) Optimization
> Split wide types into independent registers
> 
> +fssa-phiopt
> +Common Report Var(flag_ssa_phiopt) Optimization
> +Optimize conditional patterns using SSA PHI nodes
> +
> fvariable-expansion-in-unroller
> Common Report Var(flag_variable_expansion_in_unroller) Optimization
> Apply variable expansion when loops are unrolled
> Index: gcc/opts.c
> ===================================================================
> --- gcc/opts.c    (revision 211736)
> +++ gcc/opts.c    (working copy)
> @@ -457,6 +457,7 @@ static const struct default_options defa
>     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
>     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
>     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
> +    { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
> 
>     /* -O2 optimizations.  */
>     { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
> Index: gcc/tree-ssa-phiopt.c
> ===================================================================
> --- gcc/tree-ssa-phiopt.c    (revision 211736)
> +++ gcc/tree-ssa-phiopt.c    (working copy)
> @@ -2332,6 +2332,7 @@ public:
> 
>   /* opt_pass methods: */
>   opt_pass * clone () { return new pass_phiopt (m_ctxt); }
> +  virtual bool gate (function *) { return flag_ssa_phiopt; }
>   virtual unsigned int execute (function *)
>     {
>       return tree_ssa_phiopt_worker (false, gate_hoist_loads ());
> Index: gcc/doc/invoke.texi
> ===================================================================
> --- gcc/doc/invoke.texi    (revision 211736)
> +++ gcc/doc/invoke.texi    (working copy)
> @@ -412,7 +412,7 @@ Objective-C and Objective-C++ Dialects}.
> -fselective-scheduling -fselective-scheduling2 @gol
> -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops @gol
> -fshrink-wrap -fsignaling-nans -fsingle-precision-constant @gol
> --fsplit-ivs-in-unroller -fsplit-wide-types -fstack-protector @gol
> +-fsplit-ivs-in-unroller -fsplit-wide-types -fssa-phiopt -fstack-protector 
> @gol
> -fstack-protector-all -fstack-protector-strong -fstrict-aliasing @gol
> -fstrict-overflow -fthread-jumps -ftracer -ftree-bit-ccp @gol
> -ftree-builtin-call-dce -ftree-ccp -ftree-ch @gol
> @@ -6907,6 +6907,7 @@ compilation time.
> -ftree-bit-ccp @gol
> -ftree-builtin-call-dce @gol
> -ftree-ccp @gol
> +-fssa-phiopt @gol
> -ftree-ch @gol
> -ftree-copyrename @gol
> -ftree-dce @gol
> @@ -7892,6 +7893,11 @@ Perform sparse conditional constant prop
> pass only operates on local scalar variables and is enabled by default
> at @option{-O} and higher.
> 
> +@item -fssa-phiopt
> +@opindex fssa-phiopt
> +Perform pattern matching on SSA PHI nodes to optimize conditional
> +code.  This pass is enabled by default at @option{-O} and higher.
> +
> @item -ftree-switch-conversion
> Perform conversion of simple initializations in a switch to
> initializations from a scalar array.  This flag is enabled by default

Reply via email to