Reject versioning for alignment with different masks (PR 92526)
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 21 Nov 2019 17:45:36 +0000 (17:45 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 21 Nov 2019 17:45:36 +0000 (17:45 +0000)
Allowing mixed vector sizes broke the assumption in the following assert,
since it's now possible for different accesses to require different
levels of alignment:

              /* FORNOW: use the same mask to test all potentially unaligned
                 references in the loop.  The vectorizer currently supports
                 a single vector size, see the reference to
                 GET_MODE_NUNITS (TYPE_MODE (vectype)) where the
                 vectorization factor is computed.  */
              gcc_assert (!LOOP_VINFO_PTR_MASK (loop_vinfo)
                          || LOOP_VINFO_PTR_MASK (loop_vinfo) == mask);

I guess we could try to over-align smaller accesses so that all
of them are consistent, or try to support multiple alignment masks,
but for now the easiest fix seems to be to turn the assert into a
bail-out check.

2019-11-21  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
PR tree-optimization/92526
* tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Reject
versioning for alignment if the accesses do not have a consistent
mask, rather than asserting that the masks are consistent.

gcc/testsuite/
PR tree-optimization/92526
* gcc.target/aarch64/pr92526.c: New test.

From-SVN: r278592

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/pr92526.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 859dd7136c7eca4cfe6664e8f03b07d25060b2e5..a4b458084100d6dd871c271d44db662969d8661b 100644 (file)
@@ -1,3 +1,10 @@
+2019-11-21  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/92526
+       * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Reject
+       versioning for alignment if the accesses do not have a consistent
+       mask, rather than asserting that the masks are consistent.
+
 2019-11-21  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR tree-optimization/92595
index 0250eebb312cd1e35c15ebdcd174b2692d2d8298..1f30ffd9ed3438b355b4b830c778b74a22429ea9 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-21  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/92526
+       * gcc.target/aarch64/pr92526.c: New test.
+
 2019-11-21  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR testsuite/92543
diff --git a/gcc/testsuite/gcc.target/aarch64/pr92526.c b/gcc/testsuite/gcc.target/aarch64/pr92526.c
new file mode 100644 (file)
index 0000000..61b347c
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-options "-O3 -mstrict-align" } */
+
+void
+f (unsigned int *restrict x, unsigned int *restrict y,
+   unsigned char *restrict z, unsigned int n)
+{
+  for (unsigned int i = 0; i < n % 4; ++i)
+    x[i] = x[i] + y[i] + z[i];
+}
index 72a70945f086191673175cd8384d23405b20fbd7..b876d07f44b9922be478fe04b9e7cb201f245b24 100644 (file)
@@ -2266,13 +2266,15 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
                  mask must be 15 = 0xf. */
              mask = size - 1;
 
-              /* FORNOW: use the same mask to test all potentially unaligned
-                 references in the loop.  The vectorizer currently supports
-                 a single vector size, see the reference to
-                 GET_MODE_NUNITS (TYPE_MODE (vectype)) where the
-                 vectorization factor is computed.  */
-              gcc_assert (!LOOP_VINFO_PTR_MASK (loop_vinfo)
-                          || LOOP_VINFO_PTR_MASK (loop_vinfo) == mask);
+             /* FORNOW: use the same mask to test all potentially unaligned
+                references in the loop.  */
+             if (LOOP_VINFO_PTR_MASK (loop_vinfo)
+                 && LOOP_VINFO_PTR_MASK (loop_vinfo) != mask)
+               {
+                 do_versioning = false;
+                 break;
+               }
+
               LOOP_VINFO_PTR_MASK (loop_vinfo) = mask;
              LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo).safe_push (stmt_info);
             }