From 0ee908659e7416a9214250cb15237f9effe315f0 Mon Sep 17 00:00:00 2001 From: Tamar Christina Date: Fri, 12 Sep 2025 08:28:44 +0100 Subject: [PATCH] middle-end: clear the user unroll flag if the cost model has overriden it If the user has requested loop unrolling through pragma GCC unroll then at the moment we only set LOOP_VINFO_USER_UNROLL if the vectorizer has not overrode the unroll factor (through backend costing) or if the VF made the requested unroll factor be 1. When we have a loop of say int and a pragma unroll 4 If the vectorizer picks V4SI as the mode, the requested unroll ended up exactly matching the VF. As such the requested unroll is 1 and we don't clear the pragma. So it did honor the requested unroll factor. However since we didn't set the unroll amount back and left it at 4 the rtl unroller won't use the rtl cost model at all and just unroll the vector loop 4 times. But of these events are costing related, and so it stands to reason that we should set LOOP_VINFO_USER_UNROLL to we return the RTL unroller to use the backend costing for any further unrolling. gcc/ChangeLog: * tree-vect-loop.cc (vect_analyze_loop_1): If the unroll pragma was set mark it as handled. * doc/extend.texi (pragma GCC unroll): Update documentation. --- gcc/doc/extend.texi | 9 +++++---- gcc/tree-vect-loop.cc | 4 +++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 2922d9e9839..596cb5d3259 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -10447,10 +10447,11 @@ loop or a @code{#pragma GCC ivdep}, and applies only to the loop that follows. @var{n} is an integer constant expression specifying the unrolling factor. The values of @math{0} and @math{1} block any unrolling of the loop. -If the loop was vectorized the unroll factor specified will be used to seed the -vectorizer unroll factor. Whether the loop is unrolled or not will be -determined by target costing. The resulting vectorized loop may still be -unrolled more in later passes depending on the target costing. +If the loop is vectorized the vectorizer considers extra unrolling to honor the +unroll factor. After vectorizing a loop the pragma is dropped. Whether the +loop is unrolled or not will be determined by target costing. The resulting +vectorized loop may still be unrolled more in later passes depending on the +target costing. @end table diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index ae999dbd071..b58e4355e58 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -2932,11 +2932,13 @@ vect_analyze_loop_1 (class loop *loop, vec_info_shared *shared, { delete loop_vinfo; loop_vinfo = unroll_vinfo; - LOOP_VINFO_USER_UNROLL (loop_vinfo) = user_unroll > 1; } else delete unroll_vinfo; } + + /* Record that we have honored a user unroll factor. */ + LOOP_VINFO_USER_UNROLL (loop_vinfo) = user_unroll > 1; } /* Remember the autodetected vector mode. */ -- 2.47.3