https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107704
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |rsandifo at gcc dot gnu.org
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Oh late_combine2 rejects it:
```
trying to combine definition of r1 in:
109: r1:SI=t:SI
into:
110: r1:SI=-r1:SI
register 147 is both clobbered and used as an input:
(parallel [
(set (reg:SI 1 r1 [191])
(neg:SI (reg:SI 147 t)))
(clobber (reg:SI 147 t))
])
```
Maybe I misunderstand why it is being rejected. The pattern is:
```
(define_insn_and_split "mov_neg_si_t"
[(set (match_operand:SI 0 "arith_reg_dest" "=r")
(neg:SI (match_operand 1 "treg_set_expr")))
(clobber (reg:SI T_REG))]
"TARGET_SH1"
{
gcc_assert (t_reg_operand (operands[1], VOIDmode));
return "subc %0,%0";
}
"&& !t_reg_operand (operands[1], VOIDmode)"
[(const_int 0)]
{
sh_treg_insns ti = sh_split_treg_set_expr (operands[1], curr_insn);
emit_insn (gen_mov_neg_si_t (operands[0], get_t_reg_rtx ()));
if (ti.remove_trailing_nott ())
emit_insn (gen_one_cmplsi2 (operands[0], operands[0]));
DONE;
}
[(set_attr "type" "arith")])
```
In this case treg_set_expr regcognizes T reg and t_reg_operand is true since it
is a T reg.