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.
@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
{
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. */