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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|needs-bisection             |

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
In reload dump I see no changes (except function_decl/var_decl addresses), in
vzeroupper, postreload, split2, ree and cmpelim dumps a bunch of extra REG_DEAD
notes
here and there in r14-5355 compared to r14-5354, and finally pro_and_epilogue
deletes
(insn 20 19 62 2 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 0 ax [110])
            (reg:SI 1 dx [111]))) "pr112760.c":6:22 11 {*cmpsi_1}
     (expr_list:REG_UNUSED (reg:CCZ 17 flags)
        (nil)))
insn.
In reload dump there is:
(insn 20 19 44 2 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 0 ax [110])
            (reg:SI 1 dx [111]))) "pr112760.c":6:22 11 {*cmpsi_1}
     (nil))
(insn 44 20 62 2 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 0 ax [110])
            (reg:SI 1 dx [111]))) "pr112760.c":6:22 11 {*cmpsi_1}
     (nil))
(insn 62 44 46 2 (set (reg:HI 0 ax [118])
        (const_int 1 [0x1])) "pr112760.c":6:22 86 {*movhi_internal}
     (expr_list:REG_EQUIV (const_int 1 [0x1])
        (nil)))
(insn 46 62 25 2 (set (reg:HI 3 bx [orig:103 _8+2 ] [103])
        (if_then_else:HI (eq (reg:CCZ 17 flags)
                (const_int 0 [0]))
            (reg:HI 3 bx [orig:103 _8+2 ] [103])
            (reg:HI 0 ax [118]))) "pr112760.c":6:22 1381 {*movhicc_noc}
     (nil))
so the insn 20 is indeed useless and in vzeroupper pass that was correctly
marked in
the notes:
(insn 20 19 44 2 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 0 ax [110])
            (reg:SI 1 dx [111]))) "pr112760.c":6:22 11 {*cmpsi_1}
     (expr_list:REG_UNUSED (reg:CCZ 17 flags)
        (nil)))
(insn 44 20 62 2 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 0 ax [110])
            (reg:SI 1 dx [111]))) "pr112760.c":6:22 11 {*cmpsi_1}
     (expr_list:REG_DEAD (reg:SI 1 dx [111])
        (expr_list:REG_DEAD (reg:SI 0 ax [110])
            (nil))))
(insn 62 44 46 2 (set (reg:HI 0 ax [118])
        (const_int 1 [0x1])) "pr112760.c":6:22 86 {*movhi_internal}
     (expr_list:REG_EQUIV (const_int 1 [0x1])
        (nil)))
(insn 46 62 25 2 (set (reg:HI 3 bx [orig:103 _8+2 ] [103])
        (if_then_else:HI (eq (reg:CCZ 17 flags)
                (const_int 0 [0]))
            (reg:HI 3 bx [orig:103 _8+2 ] [103])
            (reg:HI 0 ax [118]))) "pr112760.c":6:22 1381 {*movhicc_noc}
     (expr_list:REG_DEAD (reg:CCZ 17 flags)
        (expr_list:REG_DEAD (reg:HI 0 ax [118])
            (nil))))
But then postreload deletes insn 44 rather than 20 and keeps the notes around
unchanged.
Insn 20 is deleted in
#2  0x0000000000cce9df in copyprop_hardreg_forward_1 (bb=<basic_block
0x7fffea2f7c60 (2)>, vd=0x3bd2be0) at ../../gcc/regcprop.cc:829
#3  0x0000000000ccfe1c in copyprop_hardreg_forward_bb_without_debug_insn
(bb=<basic_block 0x7fffea2f7c60 (2)>) at ../../gcc/regcprop.cc:1235
#4  0x0000000000d5b371 in prepare_shrink_wrap (entry_block=<basic_block
0x7fffea2f7c60 (2)>) at ../../gcc/shrink-wrap.cc:451
#5  0x0000000000d5bb70 in try_shrink_wrapping (entry_edge=0x7fffffffd900,
prologue_seq=0x7fffe9f25240) at ../../gcc/shrink-wrap.cc:674
#6  0x00000000008b4320 in thread_prologue_and_epilogue_insns () at
../../gcc/function.cc:6056
and regcprop.cc documents it relies on up to date REG_DEAD/REG_UNUSED notes;
after all
the removal happens in
      /* Detect obviously dead sets (via REG_UNUSED notes) and remove them.  */
      if (set
          && !RTX_FRAME_RELATED_P (insn)
          && NONJUMP_INSN_P (insn)
          && !may_trap_p (set)
          && find_reg_note (insn, REG_UNUSED, SET_DEST (set))
          && !side_effects_p (SET_SRC (set))
          && !side_effects_p (SET_DEST (set)))
        {
          bool last = insn == BB_END (bb);
          delete_insn (insn);
          if (last)
            break;
          continue;
        }
and regcprop.cc calls df_note_add_problem (); before calling df_analyze (). 
Except
in the pro_and_epilogue case it is done elsewhere and it just calls into the
regcprop.cc functions.

Reply via email to