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.

Reply via email to