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