[PATCH][RFC] Add phiopt in early opts (and add -fssa-phiopt option)
Richard Biener
rguenther@suse.de
Tue Jun 17 13:37:00 GMT 2014
On Tue, 17 Jun 2014, pinskia@gmail.com wrote:
>
>
> > On Jun 17, 2014, at 6:07 AM, Richard Biener <rguenther@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 <rguenther@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.
I'm not sure - the above is just what I remember seeing, not currently
failing testcases. I can certainly remove the comment - or do you
say phiopt now eventually benefits from merge_phi? Then I can as
well keep merge_phi where it is right now.
Richard.
> 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
>
>
--
Richard Biener <rguenther@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer
More information about the Gcc-patches
mailing list