"Yangfei (Felix)" <felix.y...@huawei.com> writes:
> From 30a0196b0afd45bae9291cfab3fee4ad6b90cbcb Mon Sep 17 00:00:00 2001
> From: Fei Yang <felix.y...@huawei.com>
> Date: Thu, 11 Jun 2020 19:33:22 +0800
> Subject: [PATCH] vect: Fix an ICE in vect_loop_versioning [PR95570]
>
> In the test case for PR95570, the only data reference in the loop is a
> gather-statter access.  Scalar evolution analysis for this data reference
> failed, so DR_STEP is NULL_TREE.  This leads to the segmentation fault.
> We should filter out scatter-gather access in 
> vect_enhance_data_refs_alignment.

Looks good, just a couple of very minor details…

> 2020-06-11  Felix Yang  <felix.y...@huawei.com>
>
> gcc/
>         PR tree-optimization/95570
>         * tree-vect-data-refs.c (vect_relevant_for_alignment_p): New function.
>         (vect_verify_datarefs_alignment): Call it to filter out data 
> references
>         in the loop whose alignment is irrelevant.
>         (vect_get_peeling_costs_all_drs): Likewise.
>         (vect_peeling_supportable): Likewise.
>         (vect_enhance_data_refs_alignment): Likewise.
>
> gcc/testsuite/
>
>         PR tree-optimization/95570
>         * gcc.dg/vect/pr95570.c: New test.
> ---
>  gcc/testsuite/gcc.dg/vect/pr95570.c | 11 ++++
>  gcc/tree-vect-data-refs.c           | 83 ++++++++++++-----------------
>  2 files changed, 45 insertions(+), 49 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/vect/pr95570.c
>
> diff --git a/gcc/testsuite/gcc.dg/vect/pr95570.c 
> b/gcc/testsuite/gcc.dg/vect/pr95570.c
> new file mode 100644
> index 00000000000..b9362614004
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr95570.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-march=armv8.2-a+sve -msve-vector-bits=256 
> -mstrict-align -fwrapv" { target aarch64*-*-* } } */
> +
> +int x[8][32];
> +
> +void
> +foo (int start)
> +{
> +  for (int i = start; i < start + 16; i++)
> +    x[start][i] = i;
> +}
> diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
> index 39d5a1b554c..98f6fb76ff9 100644
> --- a/gcc/tree-vect-data-refs.c
> +++ b/gcc/tree-vect-data-refs.c
> @@ -1129,6 +1129,35 @@ vect_update_misalignment_for_peel (dr_vec_info 
> *dr_info,
>    SET_DR_MISALIGNMENT (dr_info, DR_MISALIGNMENT_UNKNOWN);
>  }
>  
> +/* Return TRUE if alignment is relevant for DR_INFO.  */

Just “Return true …“ for new code.  TRUE is a hold-over from C days.

> +static bool
> +vect_relevant_for_alignment_p (dr_vec_info *dr_info)
> +{
> +  stmt_vec_info stmt_info = dr_info->stmt;
> +
> +  if (!STMT_VINFO_RELEVANT_P (stmt_info))
> +    return false;
> +
> +  /* For interleaving, only the alignment of the first access matters.  */
> +  if (STMT_VINFO_GROUPED_ACCESS (stmt_info)
> +      && DR_GROUP_FIRST_ELEMENT (stmt_info) != stmt_info)
> +    return false;
> +
> +  /* For scatter-gather or invariant accesses, alignment is irrelevant
> +     for them.  */

Maybe:

  /* Scatter-gather and invariant accesses continue to address individual
     scalars, so vector-level alignment is irrelevant.  */

Thanks,
Richard

Reply via email to