On Wed, Nov 20, 2019 at 4:28 PM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> 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.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?

OK.

> Richard
>
>
> 2019-11-20  Richard Sandiford  <richard.sandif...@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.
>
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> --- gcc/tree-vect-data-refs.c   2019-11-16 11:40:19.105159717 +0000
> +++ gcc/tree-vect-data-refs.c   2019-11-20 15:27:49.385346722 +0000
> @@ -2266,13 +2266,15 @@ vect_enhance_data_refs_alignment (loop_v
>                   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);
>              }
> Index: gcc/testsuite/gcc.target/aarch64/pr92526.c
> ===================================================================
> --- /dev/null   2019-09-17 11:41:18.176664108 +0100
> +++ gcc/testsuite/gcc.target/aarch64/pr92526.c  2019-11-20 15:27:49.385346722 
> +0000
> @@ -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];
> +}

Reply via email to