On Mon, Oct 12, 2020 at 12:59 PM Martin Liška <mli...@suse.cz> wrote:
>
> The patch fixes the following 2 issues:
>
>    .MASK_STORE_LANES (&a, 4B, max_mask_34, vect_array.12);
>
> here we miss to return the last argument as stored value.
>
> ivtmp_32 = ivtmp_31 + POLY_INT_CST [4, 4];
>
> here we miss a bail out in vect_recog_over_widening_pattern.
>
> gcc/ChangeLog:
>
>         PR tree-optimization/97079
>         * internal-fn.c (internal_fn_stored_value_index): Handle also
>         .MASK_STORE_LANES.
>         * tree-vect-patterns.c (vect_recog_over_widening_pattern): Bail
>         out for POLY_INT_CST.
>
> gcc/testsuite/ChangeLog:
>
>         PR tree-optimization/97079
>         * gcc.target/aarch64/sve/pr97079.c: New test.
>
> I'm running tests on x86_64-linux-gnu and I would appreciate running that
> on a SVE aarch64 machine.
>
> Ready for master?
> Thanks,
> Martin
>
> ---
>   gcc/internal-fn.c                             |  1 +
>   .../gcc.target/aarch64/sve/pr97079.c          | 22 +++++++++++++++++++
>   gcc/tree-vect-patterns.c                      |  2 ++
>   3 files changed, 25 insertions(+)
>   create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr97079.c
>
> diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
> index 92cb3cd845a..792d2ca568a 100644
> --- a/gcc/internal-fn.c
> +++ b/gcc/internal-fn.c
> @@ -3795,6 +3795,7 @@ internal_fn_stored_value_index (internal_fn fn)
>     switch (fn)
>       {
>       case IFN_MASK_STORE:
> +    case IFN_MASK_STORE_LANES:
>       case IFN_SCATTER_STORE:
>       case IFN_MASK_SCATTER_STORE:
>       case IFN_LEN_STORE:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr97079.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/pr97079.c
> new file mode 100644
> index 00000000000..06e6a7cde94
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr97079.c
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -march=armv8.2-a+sve" } */
> +
> +void g(void);
> +
> +int a[8][3];
> +int b;
> +void c(void)
> +{
> +  int d[] = {7, 3};
> +  int *e = a[0];
> +  int f;
> +  b = 0;
> +  for (; b < 8; b++)
> +    {
> +      f = 0;
> +      for (; f < 3; f++)
> +       a[b][f] = 0;
> +    }
> +  g();
> +  *e = (long)d;
> +}
> diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
> index 71e4e106202..6302bc42f46 100644
> --- a/gcc/tree-vect-patterns.c
> +++ b/gcc/tree-vect-patterns.c
> @@ -1571,6 +1571,8 @@ vect_recog_over_widening_pattern (vec_info *vinfo,
>         tree op = gimple_op (last_stmt, first_op + i);
>         if (TREE_CODE (op) == INTEGER_CST)
>         unprom[i].set_op (op, vect_constant_def);
> +      else if (TREE_CODE (op) == POLY_INT_CST)
> +       return NULL;

can you make this a simpler

          else
             return NULL;

at the end of the if please?

Thanks,
Richard.

>         else if (TREE_CODE (op) == SSA_NAME)
>         {
>           bool op_single_use_p = true;
> --
> 2.28.0
>

Reply via email to