"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