Add missing alignment checks in epilogue loop vectorisation (PR 86877)
Richard Biener
richard.guenther@gmail.com
Thu Sep 20 12:49:00 GMT 2018
On Thu, Sep 20, 2018 at 1:42 PM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> 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.
>
> Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf
> and x86_64-linux-gnu. OK to install?
OK.
Richard.
> Richard
>
>
> 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.
>
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c 2018-09-20 12:39:06.341625036 +0100
> +++ gcc/tree-vect-loop.c 2018-09-20 12:39:14.541555902 +0100
> @@ -1979,20 +1979,21 @@ vect_analyze_loop_2 (loop_vec_info loop_
> 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)
> Index: gcc/testsuite/gfortran.dg/vect/vect-8-epilogue.F90
> ===================================================================
> --- /dev/null 2018-09-14 11:16:31.122530289 +0100
> +++ gcc/testsuite/gfortran.dg/vect/vect-8-epilogue.F90 2018-09-20 12:39:14.537555936 +0100
> @@ -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"
More information about the Gcc-patches
mailing list