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

Reply via email to