aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2018-11-19 17:58:00 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2018-11-19 17:58:00 +0000
commit1fd319753c90f05e026e16c2c83af8f1c6687a5f (patch)
treeab4289df64afcccb0a32340e0dcde7d83a62d344
parentc95c552804da90c830941111706e623106a7728a (diff)
downloadgcc-1fd319753c90f05e026e16c2c83af8f1c6687a5f.zip
gcc-1fd319753c90f05e026e16c2c83af8f1c6687a5f.tar.gz
gcc-1fd319753c90f05e026e16c2c83af8f1c6687a5f.tar.bz2
Disable unrolling for loops vectorised with non-constant VF
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. * tree-vect-loop.c (vect_transform_loop): Disable further unrolling of the loop if vf is non-constant. * gcc.target/aarch64/sve/unroll-1.c: New test. From-SVN: r266281
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/unroll-1.c13
-rw-r--r--gcc/tree-vect-loop.c9
4 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 126f168..9996849 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-19 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-19 David Malcolm <dmalcolm@redhat.com>
PR tree-optimization/87025
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cea66a5..ba1c5d6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-11-19 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * gcc.target/aarch64/sve/unroll-1.c: New test.
+
2018-11-19 David Malcolm <dmalcolm@redhat.com>
PR tree-optimization/87025
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 0000000..d4353009
--- /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 81d8d46..07a22d7 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;