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.