https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93997
--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> --- Before my patch, the compiler generated this IR: #(insn 42 291 43 2 (set (strict_low_part (mem/c:HI (plus:SI (reg/f:SI 6 bp) # (const_int -40 [0xffffffffffffffd8])) [5 %sfp+-16 S2 A128])) # (reg:HI 1 dx [orig:91 _14 ] [91])) "vector-scalar.c":9:17 83 {*movstricthi_1} # (nil)) movw %dx, -40(%ebp) # 42 [c=4 l=4] *movstricthi_1/0 This is strict_low_part of a memory operand, which isn't valid according to docs: '(strict_low_part (subreg:M (reg:N R) 0))' This expression code is used in only one context: as the destination operand of a 'set' expression. In addition, the operand of this expression must be a non-paradoxical 'subreg' expression. The presence of 'strict_low_part' says that the part of the register which is meaningful in mode N, but is not part of mode M, is not to be altered. Normally, an assignment to such a subreg is allowed to have undefined effects on the rest of the register when M is smaller than 'REGMODE_NATURAL_SIZE (N)'. After the patch, we have: (insn 42 41 43 2 (set (strict_low_part (subreg:HI (reg:TI 135) 0)) (reg:HI 91 [ _14 ])) "vector-scalar.c":9:17 83 {*movstricthi_1} (nil)) but TImode is not valid for general regs. Probably we have to reject TImode in case of 32bit targets from the expander.