diff options
author | Martin Jambor <mjambor@suse.cz> | 2020-11-13 15:35:18 +0100 |
---|---|---|
committer | Martin Jambor <mjambor@suse.cz> | 2020-11-13 15:35:18 +0100 |
commit | ac91af71c93462cbc701bbd104fa21894bb15e86 (patch) | |
tree | f627c99eee6a069a28488e7f4e33e08fdf7fe14f /gcc/tree-ssa-loop-im.c | |
parent | 4d6b8d4213376e8a2405782c7e360b03d4a2b04a (diff) | |
download | gcc-ac91af71c93462cbc701bbd104fa21894bb15e86.zip gcc-ac91af71c93462cbc701bbd104fa21894bb15e86.tar.gz gcc-ac91af71c93462cbc701bbd104fa21894bb15e86.tar.bz2 |
loops: Invoke lim after successful loop interchange
This patch makes the entry point to loop invariant motion public, so
that it can be called after loop interchange when that pass has
swapped loops. This avoids the non-LTO -Ofast run-time regressions of
410.bwaves and 503.bwaves_r (which are 19% and 15% faster than current
master on an AMD zen2 machine) while not introducing a full LIM pass
into the pass pipeline.
The patch also adds a parameter which allows not to perform any store
motion so that it is not done after an interchange.
gcc/ChangeLog:
2020-11-12 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/94406
* tree-ssa-loop-im.c (tree_ssa_lim): Renamed to
loop_invariant_motion_in_fun, added a parameter to control store
motion.
(pass_lim::execute): Adjust call to tree_ssa_lim, now
loop_invariant_motion_in_fun.
* tree-ssa-loop-manip.h (loop_invariant_motion_in_fun): Declare.
* gimple-loop-interchange.cc (pass_linterchange::execute): Call
loop_invariant_motion_in_fun if any interchange has been done.
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r-- | gcc/tree-ssa-loop-im.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 6bb07e1..3c74127 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -3089,10 +3089,11 @@ tree_ssa_lim_finalize (void) } /* Moves invariants from loops. Only "expensive" invariants are moved out -- - i.e. those that are likely to be win regardless of the register pressure. */ + i.e. those that are likely to be win regardless of the register pressure. + Only perform store motion if STORE_MOTION is true. */ -static unsigned int -tree_ssa_lim (function *fun) +unsigned int +loop_invariant_motion_in_fun (function *fun, bool store_motion) { unsigned int todo = 0; @@ -3114,7 +3115,8 @@ tree_ssa_lim (function *fun) /* Execute store motion. Force the necessary invariants to be moved out of the loops as well. */ - do_store_motion (); + if (store_motion) + do_store_motion (); free (rpo); rpo = XNEWVEC (int, last_basic_block_for_fn (fun)); @@ -3175,7 +3177,7 @@ pass_lim::execute (function *fun) if (number_of_loops (fun) <= 1) return 0; - unsigned int todo = tree_ssa_lim (fun); + unsigned int todo = loop_invariant_motion_in_fun (fun, true); if (!in_loop_pipeline) loop_optimizer_finalize (); |