https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91102

--- Comment #3 from Segher Boessenkool <segher at gcc dot gnu.org> ---
Before combine there were also

(insn 8 7 9 3 (set (reg/v:DI 95 [ c ])
        (reg:DI 92 [ b$h ])) "91102.c":18:15 47 {*movdi_aarch64}
     (nil))
(insn 11 10 12 3 (set (reg:DI 100)
        (subreg:DI (reg:SI 99) 0)) "91102.c":19:12 47 {*movdi_aarch64}
     (expr_list:REG_DEAD (reg:SI 99)
        (nil)))

making in total

insn_cost 4 for     8: r95:DI=r92:DI
insn_cost 4 for    11: r100:DI=r99:SI#0
      REG_DEAD r99:SI
insn_cost 4 for    12: zero_extract(r95:DI,0x20,0x20)=r100:DI
      REG_DEAD r100:DI
insn_cost 4 for    15: x2:DI=r95:DI
      REG_DEAD r95:DI

becoming

replacement cost 12
modifying insn i3    15: x2:DI=r92:DI&0xffffffff|r99:SI#0<<0x20
      REG_DEAD r92:DI
      REG_DEAD r99:SI

which is just fine afaics.

Or do we want to not have hard regs on outputs either?  Do we get better
register allocation that way, for example?

Reply via email to