> -----Original Message-----
> From: Richard Biener <rguent...@suse.de>
> Sent: Tuesday, July 16, 2024 12:47 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: fix 0 offset creation and folding [PR115936]
> 
> On Tue, 16 Jul 2024, Tamar Christina wrote:
> 
> > Hi All,
> >
> > As shown in PR115936 SCEV and IVOPTS create an invalidate IV when the IV is
> > a pointer type:
> >
> > ivtmp.39_65 = ivtmp.39_59 + 0B;
> >
> > where the IVs are DI mode and the offset is a pointer.
> > This comes from this weird candidate:
> >
> > Candidate 8:
> >   Var befor: ivtmp.39_59
> >   Var after: ivtmp.39_65
> >   Incr POS: before exit test
> >   IV struct:
> >     Type:       sizetype
> >     Base:       0
> >     Step:       0B
> >     Biv:        N
> >     Overflowness wrto loop niter:       No-overflow
> >
> > This IV was always created just ended up not being used.
> >
> > This is created by SCEV.
> >
> > simple_iv_with_niters in the case where no CHREC is found creates an IV with
> > base == ev, offset == 0;
> >
> > however in this case EV is a POINTER_PLUS_EXPR and so the type is a pointer.
> > it ends up creating an unusable expression.
> >
> > However IVOPTS also has code to refold expression in case the IV is a 
> > pointer.
> > For most cases it uses basetype to fold both operand but the 0 case it 
> > ommitted
> > it.  This leads to us creating a PLUS expression with mismatched types.
> >
> > This fixes that bug as well.
> >
> > Bootstrapped Regtested on aarch64-none-linux-gnu,
> > x86_64-pc-linux-gnu -m32, -m64 and no issues.
> >
> > Ok for master?
> >
> > Thanks,
> > Tamar
> >
> > gcc/ChangeLog:
> >
> >     PR tree-optimization/115936
> >     * tree-scalar-evolution.cc (simple_iv_with_niters): Use sizetype for
> >     pointers.
> >     * tree-ssa-loop-ivopts.cc (add_iv_candidate_for_use): Use same type for
> >     both operands.
> >
> > ---
> > diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc
> > index
> 5aa95a2497a317f9b43408ce78a2d50c20151314..abb2bad777375889d6c980b
> 54d60699672fd5742 100644
> > --- a/gcc/tree-scalar-evolution.cc
> > +++ b/gcc/tree-scalar-evolution.cc
> > @@ -3243,7 +3243,11 @@ simple_iv_with_niters (class loop *wrto_loop, class
> loop *use_loop,
> >    if (tree_does_not_contain_chrecs (ev))
> >      {
> >        iv->base = ev;
> > -      iv->step = build_int_cst (TREE_TYPE (ev), 0);
> > +      tree ev_type = TREE_TYPE (ev);
> > +      if (POINTER_TYPE_P (ev_type))
> > +   ev_type = sizetype;
> > +
> > +      iv->step = build_int_cst (ev_type, 0);
> >        iv->no_overflow = true;
> >        return true;
> >      }
> 
> This hunk is OK.
> 
> > diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
> > index
> c3218a3e8eedbb8d0a7f14c01eeb069cb6024c29..fe130541526e74fb80fee633f
> 6c96b41437aa1c1 100644
> > --- a/gcc/tree-ssa-loop-ivopts.cc
> > +++ b/gcc/tree-ssa-loop-ivopts.cc
> > @@ -3529,7 +3529,8 @@ add_iv_candidate_for_use (struct ivopts_data *data,
> struct iv_use *use)
> >    basetype = TREE_TYPE (iv->base);
> >    if (POINTER_TYPE_P (basetype))
> >      basetype = sizetype;
> > -  record_common_cand (data, build_int_cst (basetype, 0), iv->step, use);
> > +  record_common_cand (data, build_int_cst (basetype, 0),
> > +                 fold_convert (basetype, iv->step), use);
> 
> But this looks redundant?  iv->step should already be sizetype for a
> pointer base?

Yeah, on a correctly formed candidate.  I thought it would be a good idea to be 
a bit more
resilient in the cases where we're changing the base anyway.  But I equally 
understand that
we'd want to know when a candidate is malformed.

So I'll go with only the first hunk.

Thanks,
Tamar

> 
> Thanks,
> Richard.
> 
> >    /* Compare the cost of an address with an unscaled index with the cost of
> >      an address with a scaled index and add candidate if useful.  */
> >
> >
> >
> >
> >
> 
> --
> 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