> The crash is in find_valid_class() called from push_reload(), via this > code block around line 1184 of reload.c: > > enum reg_class in_out_class > = find_valid_class (outmode, GET_MODE (SUBREG_REG (out)), > subreg_regno_offset (REGNO (SUBREG_REG (out)), > GET_MODE (SUBREG_REG (out)), > SUBREG_BYTE (out), > GET_MODE (out)), > REGNO (SUBREG_REG (out))); > > 'out' is: > > (subreg:DI (reg/v:V4QI 50 %f18 [orig:314 s2hi4_ ] [314]) 0) > > so subreg_regno_offset() returns -1, and find_valid_class() isn't too happy > about getting "-1" for it's 'n' argument. OK, Alan's case is the same-sized and yours is the paradoxical one. Clearly we shouldn't have tried to change anything for them. Tentative fix attached, it should restore the old behavior for the cases where everything was working fine before. I'm going to give it some testing. PR rtl-optimization/46603 * reload.c (push_reload): In the out case, restore previous behavior for subregs that don't have word mode. -- Eric Botcazou