diff options
author | Richard Biener <rguenther@suse.de> | 2023-03-09 09:02:07 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-04-19 13:50:21 +0200 |
commit | a243ce2a52a6c62bc0d6be0b756a85dd9c1bceb7 (patch) | |
tree | 37e227b6780a77a541c003cc36af246061d7841d /gcc | |
parent | 6d7e0bcfa49e4ddc84dabe520bba8a023bc52692 (diff) | |
download | gcc-a243ce2a52a6c62bc0d6be0b756a85dd9c1bceb7.zip gcc-a243ce2a52a6c62bc0d6be0b756a85dd9c1bceb7.tar.gz gcc-a243ce2a52a6c62bc0d6be0b756a85dd9c1bceb7.tar.bz2 |
tree-optimization/44794 - avoid excessive RTL unrolling on epilogues
The following adjusts tree_[transform_and_]unroll_loop to set an
upper bound on the number of iterations on the epilogue loop it
creates. For the testcase at hand which involves array prefetching
this avoids applying RTL unrolling to them when -funroll-loops is
specified.
Other users of this API includes predictive commoning and
unroll-and-jam.
PR tree-optimization/44794
* tree-ssa-loop-manip.cc (tree_transform_and_unroll_loop):
If an epilogue loop is required set its iteration upper bound.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/tree-ssa-loop-manip.cc | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/tree-ssa-loop-manip.cc b/gcc/tree-ssa-loop-manip.cc index 4ef27ba..a52277a 100644 --- a/gcc/tree-ssa-loop-manip.cc +++ b/gcc/tree-ssa-loop-manip.cc @@ -1297,6 +1297,12 @@ tree_transform_and_unroll_loop (class loop *loop, unsigned factor, } remove_path (exit); + + /* The epilog loop latch executes at most factor - 1 times. + Since the epilog is entered unconditionally it will need to handle + up to factor executions of its body. */ + new_loop->any_upper_bound = 1; + new_loop->nb_iterations_upper_bound = factor - 1; } else new_exit = single_dom_exit (loop); |