https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117360
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Priority|P3 |P1
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
That commit looks just weird.
carry_backpropagate starts with
enum machine_mode mode = GET_MODE_INNER (GET_MODE (x));
unsigned HOST_WIDE_INT mmask = GET_MODE_MASK (mode);
...
scalar_int_mode smode;
if (!is_a <scalar_int_mode> (mode, &smode)
|| GET_MODE_BITSIZE (smode) > HOST_BITS_PER_WIDE_INT)
return mmask;
So, first of all, I don't see why
known_lt (UINTVAL (XEXP (x, 1)), GET_MODE_BITSIZE (mode))
and not
UINTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (smode)
and
GET_MODE_BITSIZE (mode).to_constant ()
instead of
GET_MODE_BITSIZE (smode)
etc.
But then comes the SIGN_EXTEND/ZERO_EXTEND case, and those have the
if (!GET_MODE_BITSIZE (GET_MODE (x)).is_constant ()
|| !GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))).is_constant ())
return -1;
which I don't understand at all, if we handle vectors by just looking at the
element modes, why do we care if it is a variable length vector or not?
In any case, that
mode = GET_MODE (XEXP (x, 0));
if (mask & ~GET_MODE_MASK (GET_MODE_INNER (mode)))
mask |= 1ULL << (GET_MODE_BITSIZE (mode).to_constant () - 1);
IMHO should just be
mode = GET_MODE_INNER (GET_MODE (XEXP (x, 0)));
if (mask & ~GET_MODE_MASK (mode))
mask |= 1ULL << (GET_MODE_BITSIZE (mode).to_constant () - 1);