https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86635
--- Comment #1 from Senthil Kumar Selvaraj <saaadhu at gcc dot gnu.org> --- Created attachment 44422 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44422&action=edit pr86635.patch Looks like ud_dce removes the insn that sets reg:SF r22 because the insn says r22 is clobbered. The below insn is in the previous pass dump (init-regs), and ud_dce deletes insns 8, presumably because the output register is clobbered by the insn. (insn 8 7 9 2 (parallel [ (set (reg:SF 22 r22) (mem/u/c:SF (reg/f:PSI 47) [1 a+0 S4 A8 AS7])) (clobber (reg:SF 22 r22)) (clobber (reg:QI 21 r21)) (clobber (reg:HI 30 r30)) ]) "test.c":4 36 {xloadsf_A} (expr_list:REG_DEAD (reg/f:PSI 47) (expr_list:REG_UNUSED (reg:HI 30 r30) (expr_list:REG_EQUAL (mem/u/c:SF (symbol_ref:PSI ("a") [flags 0xe40] <var_decl 0x7fabf444c900 a>) [1 a+0 S4 A8 AS7]) (nil))))) This pattern is generated via a gen_xload<mode>_A call in mov<mode> expander, so adding constraints to xload<mode>_A will not help. Forcing the dest to be a pseudo (attached patch) fixes the problem - other passes see the clobber, remove it and use reg:SF r22 as the output reg.