On Tue, Oct 20, 2020 at 11:20:48AM +0800, Hongtao Liu wrote:
> + unsigned HOST_WIDE_INT subreg_offset = 0;
> + if (GET_CODE (trueop0) == SUBREG
> + && GET_MODE_INNER (mode)
> + == GET_MODE_INNER (GET_MODE (SUBREG_REG (trueop0)))
> + && (GET_MODE_NUNITS (mode)).is_constant (&l1)
> + && constant_multiple_p (SUBREG_BYTE (trueop0),
> + GET_MODE_UNIT_BITSIZE (mode),
> + &subreg_offset))
> + {
> + gcc_assert (XVECLEN (trueop1, 0) == l1);
Why? If we want to check that, it should be in RTL checking (and maybe
it already is!)
> + bool success = true;
> + poly_uint64 nunits
> + = GET_MODE_NUNITS (GET_MODE (SUBREG_REG (trueop0)));
> + for (int i = 0; i != l1; i++)
> + {
> + rtx idx = XVECEXP (trueop1, 0, i);
> + if (!CONST_INT_P (idx)
> + || maybe_ge (UINTVAL (idx) + subreg_offset, nunits))
Can that ever happen in valid code? This seems to just hide problems.
> + {
> + success = false;
> + break;
> + }
> + }
> + if (success)
If you have a huge piece of code like this, factor it? Esp. if you now
need to have all kinds of booleans where you really just want to do
early returns.
Segher