diff mbox series

Disable unrolling for loops vectorised with non-constant VF (was: [PATCH][cunroll] Add unroll-known-loop-iterations-only param and use it in aarch64)

Message ID 5BEF0622.80405@foss.arm.com
State New
Headers show
Series Disable unrolling for loops vectorised with non-constant VF (was: [PATCH][cunroll] Add unroll-known-loop-iterations-only param and use it in aarch64) | expand

Commit Message

Kyrill Tkachov Nov. 16, 2018, 6:02 p.m. UTC
Hi all,

This is an alternative to https://gcc.gnu.org/ml/gcc-patches/2018-11/msg00694.html
As richi suggested, this disables unrolling of loops vectorised with variable-length SVE
in the vectoriser itself through the loop->unroll member.

It took me a few tries to get it right, as it needs to be set to '1' to disable unrolling,
the rationale for that mechanism is described in the comment in cfgloop.h.

Bootstrapped and tested on aarch64-none-linux-gnu.

Is this ok for trunk?

Thanks,
Kyrill

2018-11-15  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * tree-vect-loop.c (vect_transform_loop): Disable further unrolling
     of the loop if vf is non-constant.

2018-11-15  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * gcc.target/aarch64/sve/unroll-1.c: New test.

Comments

Richard Biener Nov. 19, 2018, 2:43 p.m. UTC | #1
On Fri, Nov 16, 2018 at 7:02 PM Kyrill Tkachov
<kyrylo.tkachov@foss.arm.com> wrote:
>
> Hi all,
>
> This is an alternative to https://gcc.gnu.org/ml/gcc-patches/2018-11/msg00694.html
> As richi suggested, this disables unrolling of loops vectorised with variable-length SVE
> in the vectoriser itself through the loop->unroll member.
>
> It took me a few tries to get it right, as it needs to be set to '1' to disable unrolling,
> the rationale for that mechanism is described in the comment in cfgloop.h.
>
> Bootstrapped and tested on aarch64-none-linux-gnu.
>
> Is this ok for trunk?

OK.

Richard.

> Thanks,
> Kyrill
>
> 2018-11-15  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
>
>      * tree-vect-loop.c (vect_transform_loop): Disable further unrolling
>      of the loop if vf is non-constant.
>
> 2018-11-15  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
>
>      * gcc.target/aarch64/sve/unroll-1.c: New test.
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.target/aarch64/sve/unroll-1.c b/gcc/testsuite/gcc.target/aarch64/sve/unroll-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d4353009e2145ec59b3ac74a8fc0a4a16e441581
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/unroll-1.c
@@ -0,0 +1,13 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+/* Check that simple loop is not fully unrolled.  */
+
+void
+fully_peel_me (double *x)
+{
+  for (int i = 0; i < 5; i++)
+    x[i] = x[i] * 2;
+}
+
+/* { dg-final { scan-assembler-times {b..\t\.L.\n} 1 } } */
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index f2d9d8ac2bc44398f955650591eea20dc7fca8a5..40d9584a00ba8d0b3fda58b3ee8df17f24432d5e 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -8515,6 +8515,15 @@  vect_transform_loop (loop_vec_info loop_vinfo)
 	}
     }
 
+  /* Loops vectorized with a variable factor won't benefit from
+     unrolling/peeling.  */
+  if (!vf.is_constant ())
+    {
+      loop->unroll = 1;
+      if (dump_enabled_p ())
+	dump_printf_loc (MSG_NOTE, vect_location, "Disabling unrolling due to"
+			 " variable-length vectorization factor\n");
+    }
   /* Free SLP instances here because otherwise stmt reference counting
      won't work.  */
   slp_instance instance;