diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2019-07-08 19:35:12 +0200 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2019-07-08 19:35:12 +0200 |
commit | b18081df8cca5f2306e99709fa2c06b9cbeea8d0 (patch) | |
tree | 59ef6d36e481b583dd0009cdd57c64508448c61e /gcc/lower-subreg.c | |
parent | 8f783191775bc266a74175e92c7eb64098bd4283 (diff) | |
download | gcc-b18081df8cca5f2306e99709fa2c06b9cbeea8d0.tar.gz |
subreg: Add -fsplit-wide-types-early (PR88233)
Currently the second lower-subreg pass is run right before RA. This
is much too late to be very useful. At least for targets that do not
have RTL patterns for operations on multi-register modes it is a lot
better to split patterns earlier, before combine and all related
passes.
This adds an option -fsplit-wide-types-early that does that, and
enables it by default for rs6000.
PR rtl-optimization/88233
* common.opt (fsplit-wide-types-early): New option.
* common/config/rs6000/rs6000-common.c
(rs6000_option_optimization_table): Add OPT_fsplit_wide_types_early for
OPT_LEVELS_ALL.
* doc/invoke.texi (Optimization Options): Add -fsplit-wide-types-early.
* lower-subreg.c (pass_lower_subreg2::gate): Add test for
flag_split_wide_types_early.
(pass_data_lower_subreg3): New.
(pass_lower_subreg3): New.
(make_pass_lower_subreg3): New.
* passes.def (pass_lower_subreg2): Move after the loop passes.
(pass_lower_subreg3): New, inserted where pass_lower_subreg2 was.
* tree-pass.h (make_pass_lower_subreg2): Move up, to its new place in
the pass pipeline; its previous place is taken by ...
(make_pass_lower_subreg3): ... this.
From-SVN: r273240
Diffstat (limited to 'gcc/lower-subreg.c')
-rw-r--r-- | gcc/lower-subreg.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c index 4f68a7381b7..e1418e5ec51 100644 --- a/gcc/lower-subreg.c +++ b/gcc/lower-subreg.c @@ -1801,7 +1801,8 @@ public: {} /* opt_pass methods: */ - virtual bool gate (function *) { return flag_split_wide_types != 0; } + virtual bool gate (function *) { return flag_split_wide_types + && flag_split_wide_types_early; } virtual unsigned int execute (function *) { decompose_multiword_subregs (true); @@ -1817,3 +1818,46 @@ make_pass_lower_subreg2 (gcc::context *ctxt) { return new pass_lower_subreg2 (ctxt); } + +/* Implement third lower subreg pass. */ + +namespace { + +const pass_data pass_data_lower_subreg3 = +{ + RTL_PASS, /* type */ + "subreg3", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_LOWER_SUBREG, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_df_finish, /* todo_flags_finish */ +}; + +class pass_lower_subreg3 : public rtl_opt_pass +{ +public: + pass_lower_subreg3 (gcc::context *ctxt) + : rtl_opt_pass (pass_data_lower_subreg3, ctxt) + {} + + /* opt_pass methods: */ + virtual bool gate (function *) { return flag_split_wide_types + && !flag_split_wide_types_early; } + virtual unsigned int execute (function *) + { + decompose_multiword_subregs (true); + return 0; + } + +}; // class pass_lower_subreg3 + +} // anon namespace + +rtl_opt_pass * +make_pass_lower_subreg3 (gcc::context *ctxt) +{ + return new pass_lower_subreg3 (ctxt); +} |