https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99863
--- Comment #11 from rguenther at suse dot de <rguenther at suse dot de> --- On Thu, 1 Apr 2021, jakub at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99863 > > Jakub Jelinek <jakub at gcc dot gnu.org> changed: > > What |Removed |Added > ---------------------------------------------------------------------------- > CC| |jakub at gcc dot gnu.org > > --- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- > I think the REG_DEAD note isn't the problem here. > At least, when I dump bb 2 in rest_of_handle_dse right before df_analyze call, > there is > (insn 6 3 7 2 (set (reg:CCZ 17 flags) > (compare:CCZ (reg/v:DI 203 [ y ]) > (const_int 0 [0]))) "pr99863.c":14:12 8 {*cmpdi_ccno_1} > (nil)) > (insn 7 6 8 2 (set (reg:QI 205) > (eq:QI (reg:CCZ 17 flags) > (const_int 0 [0]))) "pr99863.c":14:12 802 {*setcc_qi} > (expr_list:REG_DEAD (reg:CCZ 17 flags) > (nil))) > ... > (insn 40 38 41 2 (set (reg:QI 220) > (ne:QI (reg:CCZ 17 flags) > (const_int 0 [0]))) "pr99863.c":15:11 802 {*setcc_qi} > (expr_list:REG_DEAD (reg:CCZ 17 flags) > (nil))) > but if I dump it right after df_analyze call, I see: > (insn 6 3 7 2 (set (reg:CCZ 17 flags) > (compare:CCZ (reg/v:DI 203 [ y ]) > (const_int 0 [0]))) "pr99863.c":14:12 8 {*cmpdi_ccno_1} > (expr_list:REG_DEAD (reg/v:DI 203 [ y ]) > (nil))) > (insn 7 6 8 2 (set (reg:QI 205) > (eq:QI (reg:CCZ 17 flags) > (const_int 0 [0]))) "pr99863.c":14:12 802 {*setcc_qi} > (nil)) > ... > (insn 40 38 41 2 (set (reg:QI 220) > (ne:QI (reg:CCZ 17 flags) > (const_int 0 [0]))) "pr99863.c":15:11 802 {*setcc_qi} > (expr_list:REG_DEAD (reg:CCZ 17 flags) > (nil))) > > i.e. the problematic REG_DEAD note is gone and I think at this point DF knows > that CC is live there. > But replace_read has code to check for live hard regs, see > note_stores (this_insn, look_for_hardregs, regs_set); > in there etc. But find_shift_sequence doesn't seem to check whether the emitted insns contain any extra hardreg clobbers that make the replacement invalid.