Commit 508a909e by Richard Sandiford Committed by Richard Sandiford

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  <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
parent a599af84
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> 2018-09-19 Marek Polacek <polacek@redhat.com>
* doc/invoke.texi: Document -Wclass-conversion. * doc/invoke.texi: Document -Wclass-conversion.
......
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> 2018-09-19 Marek Polacek <polacek@redhat.com>
* g++.dg/conversion/op4.C: Add dg-warning. * g++.dg/conversion/op4.C: Add dg-warning.
......
! { 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"
...@@ -1979,13 +1979,15 @@ start_over: ...@@ -1979,13 +1979,15 @@ start_over:
if (!ok) if (!ok)
return false; return false;
/* Do not invoke vect_enhance_data_refs_alignment for eplilogue /* Do not invoke vect_enhance_data_refs_alignment for epilogue
vectorization. */ vectorization, since we do not want to add extra peeling or
add versioning for alignment. */
if (!LOOP_VINFO_EPILOGUE_P (loop_vinfo)) if (!LOOP_VINFO_EPILOGUE_P (loop_vinfo))
{
/* This pass will decide on using loop versioning and/or loop peeling in /* This pass will decide on using loop versioning and/or loop peeling in
order to enhance the alignment of data references in the loop. */ order to enhance the alignment of data references in the loop. */
ok = vect_enhance_data_refs_alignment (loop_vinfo); ok = vect_enhance_data_refs_alignment (loop_vinfo);
else
ok = vect_verify_datarefs_alignment (loop_vinfo);
if (!ok) if (!ok)
{ {
if (dump_enabled_p ()) if (dump_enabled_p ())
...@@ -1993,7 +1995,6 @@ start_over: ...@@ -1993,7 +1995,6 @@ start_over:
"bad data alignment.\n"); "bad data alignment.\n");
return false; return false;
} }
}
if (slp) if (slp)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment