On Fri, 15 May 2026, Xi Ruoyao wrote:

> On Thu, 2026-05-14 at 13:01 +0200, Richard Biener wrote:
> > 
> > 
> > > Am 14.05.2026 um 10:59 schrieb Xi Ruoyao <[email protected]>:
> > > 
> > > On Thu, 2026-05-14 at 09:51 +0200, Richard Biener wrote:
> > > 
> > > 
> > > /* snip */
> > > 
> > > > > diff --git a/gcc/tree-scalar-evolution.cc 
> > > > > b/gcc/tree-scalar-evolution.cc
> > > > > index f524786f33b..ec3c9ab4f3d 100644
> > > > > --- a/gcc/tree-scalar-evolution.cc
> > > > > +++ b/gcc/tree-scalar-evolution.cc
> > > > > @@ -1391,10 +1391,22 @@ simplify_peeled_chrec (class loop *loop, tree 
> > > > > arg, tree init_cond)
> > > > >      && wi::to_widest (init_cond) == wi::to_widest (left_before)
> > > > >      && !scev_probably_wraps_p (NULL_TREE, left_before, right, NULL,
> > > > >                     loop, false))
> > > > > -    return build_polynomial_chrec (loop->num, init_cond,
> > > > > -                       chrec_convert (TREE_TYPE (ev),
> > > > > -                              right, NULL,
> > > > > -                              false, NULL_TREE));
> > > > > +    {
> > > > > +      tree tp = TREE_TYPE (right);
> > > > > +
> > > > > +      /* We likely need a sign-extension to make things like
> > > > > +         u8(6, 4, 2) => i32(6, 4, 2), instead of i32(6, 260, 514).
> > > > > +         But u8(1, 129) shouldn't be i32(1, -127) either.  */
> > > > > +      if (TYPE_UNSIGNED (tp)
> > > > > +          && wi::to_widest (TYPE_MAX_VALUE (tp)) <
> > > > > +         (wi::to_widest (init_cond) + wi::to_widest (right)))
> > > > 
> > > > I’d say we just want the TYPE_UNSIGNED check here, esp. it shouldn’t 
> > > > depend on init_cond and also work for symbolic right.
> > > 
> > > So wouldn't doing so make u8(1, 129) => i32(1, -127) and misoptimize
> > > that?  Or maybe we cannot have a loop iterating only twice here?
> > 
> > I think SCEV probably warp_p guarantees the unsigned IV doesn’t
> > underflow when the step is interpreted as signed (underflow zero).  So
> > yes, I think we know u8(1, 128) does not actually iterate.
> 
> I'd not pretend I really understand SCEV but after reading the code for
> an hour my brain seems to agree.

Mine too, and yeah, I'm only spottily into SCEV (though I guess I'd
call myself responsible given the original author is no longer around).
It's also the reason I missed this when introducing this bug ...

> And I've also bootstrapped & regtested
> with a debug assert checking this.  So I'll simply use TYPE_UNSIGNED in
> v3.
> 
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to