]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
SH: Fix outage caused by recently added 2nd combine pass after reg alloc
authorOleg Endo <olegendo@gcc.gnu.org>
Sun, 21 Jul 2024 05:11:21 +0000 (14:11 +0900)
committerOleg Endo <olegendo@gcc.gnu.org>
Sun, 21 Jul 2024 05:30:58 +0000 (14:30 +0900)
I've also confirmed on the CSiBE set that the secondary combine pass is
actually beneficial on SH.  It does result in some code size reductions.

gcc/CHangeLog:
* config/sh/sh.md (mov_neg_si_t): Allow insn and split after
register allocation.
(*treg_noop_move): New insn.

gcc/config/sh/sh.md

index 3e978254ab0c8b1e8ce8b6a6915fb31e92c7582a..7eee12ca6b8a6c19b7f1212b6e37425392c929dd 100644 (file)
   gcc_assert (t_reg_operand (operands[1], VOIDmode));
   return "subc %0,%0";
 }
-  "&& can_create_pseudo_p () && !t_reg_operand (operands[1], VOIDmode)"
+  "&& !t_reg_operand (operands[1], VOIDmode)"
   [(const_int 0)]
 {
   sh_treg_insns ti = sh_split_treg_set_expr (operands[1], curr_insn);
 }
   [(set_attr "type" "arith")])
 
+;; no-op T bit move which can result from other optimizations.
+(define_insn_and_split "*treg_noop_move"
+  [(set (reg:SI T_REG) (reg:SI T_REG))]
+  "TARGET_SH1"
+  "#"
+  "&& 1"
+  [(const_int 0)])
+
 ;; Invert the T bit.
 ;; On SH2A we can use the nott insn.  On anything else this must be done with
 ;; multiple insns like: