This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/64331] regcprop propagates registers noted as REG_DEAD
- From: "olegendo at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 28 Sep 2015 16:26:57 +0000
- Subject: [Bug target/64331] regcprop propagates registers noted as REG_DEAD
- Auto-submitted: auto-generated
- References: <bug-64331-4 at http dot gcc dot gnu dot org/bugzilla/>
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.