From 2d974ea15c9e1cb7fef5ca725a15ccd4e13c7e1d Mon Sep 17 00:00:00 2001 From: rsandifo Date: Thu, 20 Sep 2018 12:58:16 +0000 Subject: [PATCH] Add missing alignment checks in epilogue loop vectorisation (PR 86877) 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 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@264439 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ .../gfortran.dg/vect/vect-8-epilogue.F90 | 6 ++++++ gcc/tree-vect-loop.c | 21 ++++++++++--------- 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/vect/vect-8-epilogue.F90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 728799d70a66..af5fddf10ce8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-09-20 Richard Sandiford + + PR tree-optimization/86877 + * tree-vect-loop.c (vect_analyze_loop_2): Call + vect_verify_datarefs_alignment. + 2018-09-19 Marek Polacek * doc/invoke.texi: Document -Wclass-conversion. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 25f61d2f7f16..ade95dbb5c90 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-09-20 Richard Sandiford + + PR tree-optimization/86877 + * gfortran.dg/vect/vect-8-epilogue.F90: New test. + 2018-09-19 Marek Polacek * 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 index 000000000000..2a09539a510b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/vect/vect-8-epilogue.F90 @@ -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" diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 640b0b9700c7..70e9157646fd 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -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) -- 2.47.2