From: Richard Biener Date: Thu, 9 Mar 2023 08:02:07 +0000 (+0100) Subject: tree-optimization/44794 - avoid excessive RTL unrolling on epilogues X-Git-Tag: basepoints/gcc-15~10068 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a243ce2a52a6c62bc0d6be0b756a85dd9c1bceb7;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/tree-ssa-loop-manip.cc b/gcc/tree-ssa-loop-manip.cc index 4ef27bae5152..a52277abdbf5 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);