On Mon, Oct 12, 2020 at 1:26 PM Richard Biener <richard.guent...@gmail.com> wrote: > > 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?
Btw, POLY_INT_CST can likely be handled the same as INTEGER_CST - I suppose you tried that? (it might need further adjustments downstream). Richard. > > Thanks, > Richard. > > > else if (TREE_CODE (op) == SSA_NAME) > > { > > bool op_single_use_p = true; > > -- > > 2.28.0 > >