Add missing alignment checks in epilogue loop vectorisation (PR 86877)
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 20 Sep 2018 12:58:16 +0000 (12:58 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 20 Sep 2018 12:58:16 +0000 (12:58 +0000)
Epilogue loop vectorisation skips vect_enhance_data_refs_alignment
since it doesn't make sense to version or peel the epilogue loop
(that will already have happened for the main loop).  But this means
that it also fails to check whether the accesses are suitably aligned
for the new vector subarch.

We don't seem to carry alignment information from the (potentially
peeled or versioned) main loop to the epilogue loop, which would be
good to fix at some point.  I think we want this patch regardless,
since there's no guarantee that the alignment requirements are the
same for every subarch.

2018-09-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
PR tree-optimization/86877
* tree-vect-loop.c (vect_analyze_loop_2): Call
vect_verify_datarefs_alignment.

gcc/testsuite/
PR tree-optimization/86877
* gfortran.dg/vect/vect-8-epilogue.F90: New test.

From-SVN: r264439

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/vect/vect-8-epilogue.F90 [new file with mode: 0644]
gcc/tree-vect-loop.c

index 728799d70a669dcc0205c5104b77699ae485dc4b..af5fddf10ce8951667823df8fce2810f19509fef 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-20  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/86877
+       * tree-vect-loop.c (vect_analyze_loop_2): Call
+       vect_verify_datarefs_alignment.
+
 2018-09-19  Marek Polacek  <polacek@redhat.com>
 
        * doc/invoke.texi: Document -Wclass-conversion.
index 25f61d2f7f162ec0da3c6c39ac8a6fa73d1493f7..ade95dbb5c90c33122d25656a0407672fc3737da 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-20  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/86877
+       * gfortran.dg/vect/vect-8-epilogue.F90: New test.
+
 2018-09-19  Marek Polacek  <polacek@redhat.com>
 
        * g++.dg/conversion/op4.C: Add dg-warning.
diff --git a/gcc/testsuite/gfortran.dg/vect/vect-8-epilogue.F90 b/gcc/testsuite/gfortran.dg/vect/vect-8-epilogue.F90
new file mode 100644 (file)
index 0000000..2a09539
--- /dev/null
@@ -0,0 +1,6 @@
+! { dg-do compile }
+! { dg-require-effective-target vect_double }
+! { dg-additional-options "-finline-matmul-limit=0 --param vect-epilogues-nomask=1" }
+! { dg-additional-options "-mstrict-align" { target { aarch64*-*-* } } }
+
+#include "vect-8.f90"
index 640b0b9700c747966fe9914bb59144b9608100a4..70e9157646fd068abedba232f650c3b858b8c4ad 100644 (file)
@@ -1979,20 +1979,21 @@ start_over:
   if (!ok)
     return false;
 
-  /* Do not invoke vect_enhance_data_refs_alignment for eplilogue
-     vectorization.  */
+  /* Do not invoke vect_enhance_data_refs_alignment for epilogue
+     vectorization, since we do not want to add extra peeling or
+     add versioning for alignment.  */
   if (!LOOP_VINFO_EPILOGUE_P (loop_vinfo))
-    {
     /* This pass will decide on using loop versioning and/or loop peeling in
        order to enhance the alignment of data references in the loop.  */
     ok = vect_enhance_data_refs_alignment (loop_vinfo);
-    if (!ok)
-      {
-       if (dump_enabled_p ())
-         dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-                          "bad data alignment.\n");
-        return false;
-      }
+  else
+    ok = vect_verify_datarefs_alignment (loop_vinfo);
+  if (!ok)
+    {
+      if (dump_enabled_p ())
+       dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                        "bad data alignment.\n");
+      return false;
     }
 
   if (slp)