https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71680
--- Comment #7 from Segher Boessenkool <segher at gcc dot gnu.org> --- We have an insn: (insn 32 33 34 3 (set (reg:DI 165) (unspec:DI [ (fix:SI (subreg:SF (reg:SI 160 [ a ]) 0)) ] UNSPEC_FCTIWZ)) 71680.c:11 334 {fctiwz_sf} (expr_list:REG_DEAD (reg:SI 160 [ a ]) (nil))) 160 is allocated memory by IRA. LRA does: Changing pseudo 160 in operand 1 of insn 32 on equiv [r162:SI] Creating newreg=167, assigning class ALL_REGS to subreg reg r167 32: r165:DI=unspec[fix(r167:SI#0)] 7 REG_DEAD r160:SI Inserting subreg reload before: 37: r167:SI=[r162:SI] and from then on it keeps loading 167 into another (new) SImode reg, which never magically becomes a float reg ;-)