This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/64331] regcprop propagates registers noted as REG_DEAD


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

Oleg Endo <olegendo at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Target|avr                         |avr sh*-*-*
                 CC|                            |olegendo at gcc dot gnu.org

--- Comment #10 from Oleg Endo <olegendo at gcc dot gnu.org> ---
I've got a similar case on SH.  In the file spacetab.c, when compiled with -O2
-m4 -ml there's a sequence:

        cmp/eq  r3,r4
        movt    r3
        movt    r12
        cmp/gt  r0,r2

which should be rather (after scheduling):

        cmp/eq  r3,r4
        movt    r3
        cmp/gt  r0,r2
        mov     r3,r12

The sequence can be caught with a simple peephole:

(define_peephole2
  [(set (match_operand:SI 0 "arith_reg_dest")
        (match_operand:SI 1 "t_reg_operand"))
   (set (match_operand:SI 2 "arith_reg_dest")
        (match_operand:SI 3 "t_reg_operand"))]
  "TARGET_SH1"
  [(set (match_dup 0) (reg:SI T_REG))
   (set (match_dup 2) (match_dup 0))])

which doesn't work for some reason.

So I thought maybe something like this:

(define_peephole2
  [(set (match_operand:SI 0 "arith_reg_dest")
        (match_operand:SI 1 "t_reg_operand"))
   (set (match_operand:SI 2 "arith_reg_dest")
        (match_operand:SI 3 "t_reg_operand"))]
  "TARGET_SH1"
  [(const_int 0)]
{
  emit_insn (gen_movt (operands[0], get_t_reg_rtx ()));
  emit_move_insn (operands[2], operands[0]);
  DONE;
})

which emits the insns in the peephole2 pass as intended, but regcprop changes
them again into the undesired movt-movt sequence.  So I've tried adding a
REG_DEAD note to the first insn:

(define_peephole2
  [(set (match_operand:SI 0 "arith_reg_dest")
        (match_operand:SI 1 "t_reg_operand"))
   (set (match_operand:SI 2 "arith_reg_dest")
        (match_operand:SI 3 "t_reg_operand"))]
  "TARGET_SH1"
  [(const_int 0)]
{
  add_reg_note (emit_insn (gen_movt (operands[0], get_t_reg_rtx ())),
                REG_DEAD, get_t_reg_rtx ());

  emit_move_insn (operands[2], operands[0]);
  DONE;
})

and it is still ignored.  regcprop also doesn't look at any costs, so the only
solution to "fix" this is searching and replacing insns manually in split4.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]