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.)