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

--- Comment #8 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---
(In reply to Jakub Jelinek from comment #7)
> (In reply to rsand...@gcc.gnu.org from comment #6)
> 
> Thanks for handling this.
> 
> > > template<unsigned int N, typename Ca>
> > > inline POLY_BINARY_COEFF (Ca, Ca)
> > > known_alignment (const poly_int_pod<N, Ca> &a)
> > > {
> > >   typedef POLY_BINARY_COEFF (Ca, Ca) C;
> > >   C r = a.coeffs[0];
> > >   for (unsigned int i = 1; i < N; ++i)
> > >     r |= a.coeffs[i];
> > >   return r & -r;
> > > }
> > > 
> > > The poly_int* stuff makes this much harder to fix, it is unclear if there 
> > > is
> > > some way to get the unsigned type for the C type and use that as r & 
> > > -(Cuns)
> > > r;
> > > to avoid the UB, and there is no poly_uint_rtx_p or something to request
> > > poly_uint64 from the rtx.  Richard?
> > 
> > Changing:
> > 
> >     (unsigned HOST_WIDE_INT) known_alignment (const_op0)
> > 
> > to:
> > 
> >     known_alignment (poly_uint64 (const_op0))
> > 
> > should work.
> 
> That will handle this specific case, I was just hoping that for
> known_alignment we could fix all the cases that could be called on
> poly_int64.  For HOST_WIDE_INT_MIN, do we want known_alignment to return
> HOST_WIDE_INT_MIN or something different?  It is maximum alignment
> admittedly only if we are treating the result as unsigned.  Or shall we in
> known_alignment assert or compile time assert that it is unsigned and fix
> all the users?

A compile-time assert sounds good.  Will try that on top to see how
invasive it ends up being.  (Shouldn't be too bad, since there aren't
many callers.)

Reply via email to