https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68317

--- Comment #8 from Jiong Wang <jiwang at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #7)
> (In reply to Jiong Wang from comment #6)
> > Created attachment 36741 [details]
> > prototype-fix
> > 
> > (In reply to Richard Biener from comment #3)
> > > (gdb) p debug_generic_expr (max)
> > > 4294443008(OVF)
> > > +  # ivtmp.8_8 = PHI <4294443008(OVF)(2), ivtmp.8_11(4)>
> > > +  _5 = (int) ivtmp.8_8;
> > >    fn2 (_5);
> > > -  i_7 = i_1 + -1;
> > >  
> > >    <bb 4>:
> > > +  ivtmp.8_11 = ivtmp.8_8 - 524288;
> > >    goto <bb 3>;
> > >  
> > >  }
> > > 
> > > note that the infinite loop contains undefined overflow.
> > > 
> > > IVOPTs should simply strip the overflow flag (using drop_tree_overflow).
> > 
> > And my further investigation shows PR68326 is caused by the same issue.
> > 
> >  # ivtmp.8_8 = PHI <4294443008(OVF)(2), ivtmp.8_11(4)>
> > 
> > the new phi node destination is with unsigned int type, the constant
> > value 4294443008 can fit into it, it's marked as OVF because
> > it's treated as signed type. For the simple testcase in PR68326,
> > the overflow number is 4294967286 which is -10, while there happen be
> > another signed integer with initial value -10. So, looks like the unsigned
> > 4294967286 somehow inherited the signed type from the other value in some
> > tree pass, then some valid constant is marked with OVF unnecessarily.
> > 
> > Anyway, below is my fix, does it looks the correct approach to you?
> > 
> > drop_tree_overflow is invoked during create_iv, if the constant can actually
> > fit into the type. I only checked INTEGER_CST, not for others like REAL, as 
> > I
> > though they won't suffer from the unsigned/signed type issue.
> > 
> > x86-64 bootstrap is OK with this patch, will do more testing if the approach
> > is OK.
> > 
> > diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
> > index b614412..55a6334 100644
> > --- a/gcc/tree-ssa-loop-manip.c
> > +++ b/gcc/tree-ssa-loop-manip.c
> > @@ -136,6 +136,11 @@ create_iv (tree base, tree step, tree var, struct loop
> > *loop,
> >      gsi_insert_seq_on_edge_immediate (pe, stmts);
> >  
> >    phi = create_phi_node (vb, loop->header);
> > +  if (TREE_OVERFLOW (initial)
> > +      && TREE_CODE (initial) == INTEGER_CST
> > +      && int_fits_type_p (initial, TREE_TYPE (vb)))
> > +    initial = drop_tree_overflow (initial);
> > +
> >    add_phi_arg (phi, initial, loop_preheader_edge (loop), UNKNOWN_LOCATION);
> >    add_phi_arg (phi, va, loop_latch_edge (loop), UNKNOWN_LOCATION);
> >  }
> 
> I think it's better to track down where the constant is generated. 

OK, I will do a further tracking.


> Once the overflow value is returned from fold_* () it should be stripped
> off its overflow flag.  Unconditionally so with just
> 
>   if (TREE_OVERFLOW_P (..))
>    .. = drop_tree_overflow (..);

I don't understand the scope of OVERFLOW flag will affect, so was dropping the
flag only when it's really a overflow.

Reply via email to