> -----Original Message-----
> From: Richard Biener <rguent...@suse.de>
> Sent: Monday, January 8, 2024 12:07 PM
> To: Tamar Christina <tamar.christ...@arm.com>
> Cc: gcc-patches@gcc.gnu.org; nd <n...@arm.com>; j...@ventanamicro.com
> Subject: Re: [PATCH]middle-end: rejects loops with nonlinear inductions and 
> early
> breaks [PR113163]
> 
> On Fri, 29 Dec 2023, Tamar Christina wrote:
> 
> > Hi All,
> >
> > We can't support nonlinear inductions other than neg when vectorizing
> > early breaks and iteration count is known.
> >
> > For early break we currently require a peeled epilog but in these cases
> > we can't compute the remaining values.
> >
> > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
> > tested on cross cc1 for amdgcn-amdhsa and issue fixed.
> >
> > Ok for master?
> >
> > Thanks,
> > Tamar
> >
> > gcc/ChangeLog:
> >
> >     PR middle-end/113163
> >     * tree-vect-loop-manip.cc (vect_can_peel_nonlinear_iv_p):
> 
> Misses sth.
> 
> > gcc/testsuite/ChangeLog:
> >
> >     PR middle-end/113163
> >     * gcc.target/gcn/pr113163.c: New test.
> >
> > --- inline copy of patch --
> > diff --git a/gcc/testsuite/gcc.target/gcn/pr113163.c
> b/gcc/testsuite/gcc.target/gcn/pr113163.c
> > new file mode 100644
> > index
> 0000000000000000000000000000000000000000..99b0fdbaf3a3152ca008b5
> 109abf6e80d8cb3d6a
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/gcn/pr113163.c
> > @@ -0,0 +1,30 @@
> > +/* { dg-do compile } */
> > +/* { dg-additional-options "-O2 -ftree-vectorize" } */
> > +
> > +struct _reent { union { struct { char _l64a_buf[8]; } _reent; } _new; };
> > +static const char R64_ARRAY[] =
> "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
> ;
> > +char *
> > +_l64a_r (struct _reent *rptr,
> > +     long value)
> > +{
> > +  char *ptr;
> > +  char *result;
> > +  int i, index;
> > +  unsigned long tmp = (unsigned long)value & 0xffffffff;
> > +  result =
> > +          ((
> > +          rptr
> > +          )->_new._reent._l64a_buf)
> > +                               ;
> > +  ptr = result;
> > +  for (i = 0; i < 6; ++i)
> > +    {
> > +      if (tmp == 0)
> > + {
> > +   *ptr = '\0';
> > +   break;
> > + }
> > +      *ptr++ = R64_ARRAY[index];
> > +      tmp >>= 6;
> > +    }
> > +}
> > diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
> > index
> 3810983a80c8b989be9fd9a9993642069fd39b99..f1bf43b3731868e7b053c18
> 6302fbeaf515be8cf 100644
> > --- a/gcc/tree-vect-loop-manip.cc
> > +++ b/gcc/tree-vect-loop-manip.cc
> > @@ -2075,6 +2075,22 @@ vect_can_peel_nonlinear_iv_p (loop_vec_info
> loop_vinfo,
> >        return false;
> >      }
> >
> > +  /* We can't support partial vectors and early breaks with an induction
> > +     type other than add or neg since we require the epilog and can't
> > +     perform the peeling.  PR113163.  */
> > +  if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)
> > +      && LOOP_VINFO_VECT_FACTOR (loop_vinfo).is_constant ()
> 
> But why's that only for constant VF?  We might never end up here
> with variable VF but the check looks odd ...

It's mirroring the condition in vect_gen_vector_loop_niters where we
create step_vector which is not 1. This is the case which causes
niters_vector_mult_vf_var to become a tree var instead.

I'll update the comment to say this.

Thanks,
Tamar
> 
> OK with that clarified and/or the test removed.
> 
> Thanks,
> Richard.
> 
> > +      && LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo)
> > +      && induction_type != vect_step_op_neg)
> > +    {
> > +      if (dump_enabled_p ())
> > +   dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> > +                    "Peeling for epilogue is not supported"
> > +                    " for nonlinear induction except neg"
> > +                    " when iteration count is known and early breaks.\n");
> > +      return false;
> > +    }
> > +
> >    return true;
> >  }
> >
> >
> >
> >
> >
> >
> 
> --
> Richard Biener <rguent...@suse.de>
> SUSE Software Solutions Germany GmbH,
> Frankenstrasse 146, 90461 Nuernberg, Germany;
> GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to