On Thu, Mar 27, 2025 at 09:28:31PM +0100, Uros Bizjak wrote:
> plus_constant expects integer as its third argument, not rtx.
>
> gcc/ChangeLog:
>
> * config/i386/i386.cc (ix86_redzone_clobber): Use integer, not rtx
> as the third argument of plus_constant.
Oops, thanks for catching this.
And guess we should improve the poly-int.h ctors so that it rejects mistakes
like this, rather than doing something really weird.
If I read it right, I think it was just casting the rtx (i.e. a pointer)
to HOST_WIDE_INT:
void poly_int<1, long int>::poly_int<rtx_def*> (struct poly_int * const this,
struct rtx_def * const & cs#0)
{
struct poly_int_full D.324089;
[../../gcc/poly-int.h:455:1] [../../gcc/poly-int.h:455:1] *this =
{CLOBBER(bob)};
[../../gcc/poly-int.h:457:16] {
[../../gcc/poly-int.h:457:13] poly_int<1, long int>::poly_int<rtx_def*>
(this, D.324089, cs#0);
}
}
void poly_int<1, long int>::poly_int<rtx_def*> (struct poly_int * const this,
struct poly_int_full D.289987, struct rtx_def * const & cs#0)
{
[../../gcc/poly-int.h:470:1] [../../gcc/poly-int.h:470:1] *this =
{CLOBBER(bob)};
[../../gcc/poly-int.h:472:49] {
[../../gcc/poly-int.h:471:5] _1 = [../../gcc/poly-int.h:471:5] *cs#0;
[../../gcc/poly-int.h:471:5] _2 = (long int) _1;
[../../gcc/poly-int.h:471:5] [../../gcc/poly-int.h:471:5] this->coeffs[0] =
_2;
}
}
/* Initialize with cs... directly, casting where necessary. */
template<unsigned int N, typename C>
template<typename ...Cs>
inline constexpr
poly_int<N, C>::poly_int (poly_int_full, const Cs &... cs)
: coeffs { (typename poly_coeff_traits<C>::
template init_cast<Cs>::type (cs))... } {}
Wonder if we shouldn't static_assert that Cs is not a pointer
somewhere or something like that (or floating point type).
I bet the intent is to support there integral types and the various
wide_int flavors.
Jakub