On Fri, May 16, 2025 at 4:05 AM Hongtao Liu <crazy...@gmail.com> wrote:
>
> It's https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119181

Please mention that in the changelog.  Also ...

> On Fri, May 16, 2025 at 10:02 AM liuhongt <hongtao....@intel.com> wrote:
> >
> > The patch tries to solve miss vectorization for below case.
> >
> > void
> > foo (int* a, int* restrict b)
> > {
> >     b[0] = a[0] * a[64];
> >     b[1] = a[65] * a[1];
> >     b[2] = a[2] * a[66];
> >     b[3] = a[67] * a[3];
> >     b[4] = a[68] * a[4];
> >     b[5] = a[69] * a[5];
> >     b[6] = a[6] * a[70];
> >     b[7] = a[7] * a[71];
> > }
> >
> > In vect_analyze_data_ref_accesses, a[0], a[1], .. a[7], a[64], ...,
> > a[71] are in same group with size of 71. It caused vectorization
> > unprofitable.
> >
> > Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}.
> > Ok for trunk?
> >
> > gcc/ChangeLog:
> >
> >         * tree-vect-data-refs.cc (vect_analyze_data_ref_accesses):
> >         Split datarefs when there's a gap bigger than
> >         MAX_BITSIZE_MODE_ANY_MODE.
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * gcc.dg/vect/bb-slp-pr119181.c: New test.
> > ---
> >  gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c | 15 +++++++++++++++
> >  gcc/tree-vect-data-refs.cc                  |  6 ++++++
> >  2 files changed, 21 insertions(+)
> >  create mode 100644 gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c
> >
> > diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c 
> > b/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c
> > new file mode 100644
> > index 00000000000..b0d3e5a3cb8
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c
> > @@ -0,0 +1,15 @@
> > +/* { dg-do compile } */
> > +void
> > +foo (int* a, int* restrict b)
> > +{
> > +    b[0] = a[0] * a[64];
> > +    b[1] = a[65] * a[1];
> > +    b[2] = a[2] * a[66];
> > +    b[3] = a[67] * a[3];
> > +    b[4] = a[68] * a[4];
> > +    b[5] = a[69] * a[5];
> > +    b[6] = a[6] * a[70];
> > +    b[7] = a[7] * a[71];
> > +}
> > +
> > +/* { dg-final { scan-tree-dump-times "optimized: basic block" 1 "slp2" { 
> > target vect_int_mult } } } */
> > diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
> > index 9fd1ef29650..387e8ac8b61 100644
> > --- a/gcc/tree-vect-data-refs.cc
> > +++ b/gcc/tree-vect-data-refs.cc
> > @@ -3657,6 +3657,12 @@ vect_analyze_data_ref_accesses (vec_info *vinfo,
> >                       && init_a <= init_prev
> >                       && init_prev <= init_b);
> >
> > +         /* For datarefs with big gap, it's better to split them into 
> > different
> > +            groups.
> > +            .i.e a[0], a[1], a[2], .. a[7], a[100], a[101],..., a[107]  */
> > +         if ((unsigned HOST_WIDE_INT)(init_b - init_prev) * tree_to_uhwi 
> > (szb)
> > +             > MAX_BITSIZE_MODE_ANY_MODE / BITS_PER_UNIT)
> > +           break;

Please put this condition in the set of conds we test in the else branch of ...

> >           /* Do not place the same access in the interleaving chain twice.  
> > */
> >           if (init_b == init_prev)
> >             {

... this if.  There we have conditions grouped spltting groups.

OK with those changes.

Richard.

> > --
> > 2.34.1
> >
>
>
> --
> BR,
> Hongtao

Reply via email to