]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end: clear the user unroll flag if the cost model has overriden it
authorTamar Christina <tamar.christina@arm.com>
Fri, 12 Sep 2025 07:28:44 +0000 (08:28 +0100)
committerTamar Christina <tamar.christina@arm.com>
Fri, 12 Sep 2025 07:28:44 +0000 (08:28 +0100)
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
gcc/tree-vect-loop.cc

index 2922d9e9839f0cfa35c767d1f5b07a82547b4acc..596cb5d3259851272ccac1735dc488016471468e 100644 (file)
@@ -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
 
index ae999dbd071411da140ab35411c36b84e3221793..b58e4355e58f11da82d4f39553265b3479a71580 100644 (file)
@@ -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.  */