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

            Bug ID: 95442
           Summary: LRA inserts a reload insn for REG_DEAD register
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hjl.tools at gmail dot com
                CC: vmakarov at redhat dot com
  Target Milestone: ---

match_reload has

  if (find_reg_note (curr_insn, REG_UNUSED, out_rtx) == NULL_RTX)
    {    
      start_sequence ();
      lra_emit_move (out_rtx, copy_rtx (new_out_reg));
      emit_insn (*after);
      *after = get_insns ();
      end_sequence ();
    }    

For

(insn 68 67 69 10 (parallel [
            (set (reg:CC 17 flags)
                (if_then_else:CC (ne (reg:DI 104 [ _1 ])
                        (const_int 0 [0]))
                    (compare:CC (mem:BLK (reg/v/f:DI 86 [ s2 ]) [0 MEM
<char[1:(sizetype) _1]> [(void *)s2_5(D)]+0 A8])
                        (mem:BLK (reg/v/f:DI 85 [ s1 ]) [0 MEM
<char[1:(sizetype) _1]> [(void *)s1_6(D)]+0 A8]))
                    (const_int 0 [0])))
            (use (const_int 8 [0x8]))
            (use (reg:CC 17 flags))
            (clobber (reg/f:DI 102 [ s2 ]))
            (clobber (reg/f:DI 103 [ s1 ]))
            (clobber (reg:DI 104 [ _1 ]))
        ]) "foo.c":9:7 1011 {*cmpstrnqi_1}
     (expr_list:REG_DEAD (reg:DI 104 [ _1 ])
        (expr_list:REG_UNUSED (reg:DI 104 [ _1 ])
            (expr_list:REG_UNUSED (reg/f:DI 103 [ s1 ])
                (expr_list:REG_UNUSED (reg/f:DI 102 [ s2 ])
                    (expr_list:REG_EQUAL (if_then_else:CC (ne (reg:DI 82 [ _1
])
                                (const_int 0 [0]))
                            (compare:CC (mem:BLK (reg/v/f:DI 86 [ s2 ]) [0 MEM
<char[1:(sizetype) _1]> [(void *)s2_5(D)]+0 A8])
                                (mem:BLK (reg/v/f:DI 85 [ s1 ]) [0 MEM
<char[1:(sizetype) _1]> [(void *)s1_6(D)]+0 A8]))
                            (const_int 0 [0]))
                        (nil)))))))
(insn 69 68 70 10 (set (reg:QI 105)
        (gtu:QI (reg:CC 17 flags)
            (const_int 0 [0]))) "foo.c":9:7 732 {*setcc_qi}
     (nil))

LRA inserts a reload insn for REG_DEAD (reg:DI 104 [ _1 ] after it.  Should
it be

diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index bf6d4a2fd4b..570ee37e34d 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -1068,7 +1068,8 @@ match_reload (signed char out, signed char *ins, signed
char *outs,
     return;
   /* See a comment for the input operand above.  */
   narrow_reload_pseudo_class (out_rtx, goal_class);
-  if (find_reg_note (curr_insn, REG_UNUSED, out_rtx) == NULL_RTX)
+  if (find_reg_note (curr_insn, REG_UNUSED, out_rtx) == NULL_RTX
+      && find_reg_note (curr_insn, REG_DEAD, out_rtx) == NULL_RTX)
     {
       start_sequence ();
       lra_emit_move (out_rtx, copy_rtx (new_out_reg));

Reply via email to