tree-optimization/44794 - avoid excessive RTL unrolling on epilogues

Message ID 20230309111547.E5B68385B516@sourceware.org
State Committed
Commit a243ce2a52a6c62bc0d6be0b756a85dd9c1bceb7
Headers
Series tree-optimization/44794 - avoid excessive RTL unrolling on epilogues |

Commit Message

Richard Biener March 9, 2023, 11:15 a.m. UTC
  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.

Bootstrapped and tested on x86_64-unknown-linux-gnu, queued for stage1.

	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.
---
 gcc/tree-ssa-loop-manip.cc | 6 ++++++
 1 file changed, 6 insertions(+)
  

Patch

diff --git a/gcc/tree-ssa-loop-manip.cc b/gcc/tree-ssa-loop-manip.cc
index 09acc1c94cc..c804a7353d5 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);