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.

Reply via email to