re PR target/55212 ([SH] Switch to LRA)
authorOleg Endo <olegendo@gcc.gnu.org>
Thu, 8 Jan 2015 11:07:45 +0000 (11:07 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Thu, 8 Jan 2015 11:07:45 +0000 (11:07 +0000)
gcc/
PR target/55212
* config/sh/sh.md (*addsi3_compact): Emit reg-reg copy instead of
constant load if constant operand fits into I08.

From-SVN: r219341

gcc/ChangeLog
gcc/config/sh/sh.md

index 26615505ec8091a04e12713a920536090364ea4a..2d5fcb383df474b723e9302d6e320e36678261b1 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-08  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/55212
+       * config/sh/sh.md (*addsi3_compact): Emit reg-reg copy instead of
+       constant load if constant operand fits into I08.
+
 2015-01-08  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/64336
index 6e0b97f2fddde865b525a3874acb845419bfea84..bbbdc1960e40e4ef58e50ccedb7ac4d636e508b1 100644 (file)
 ;; The problem is that LRA expects something like
 ;;    (set rA (plus rB (const_int N)))
 ;; to work.  We can do that, but we have to split out an additional reg-reg
-;; copy before the actual add insn.  Use u constraint for that case to avoid
-;; the invalid value in the stack pointer.
+;; copy or constant load before the actual add insn.
+;; Use u constraint for that case to avoid the invalid value in the stack
+;; pointer.
 (define_insn_and_split "*addsi3_compact"
   [(set (match_operand:SI 0 "arith_reg_dest" "=r,&u")
        (plus:SI (match_operand:SI 1 "arith_operand" "%0,r")
    && ! reg_overlap_mentioned_p (operands[0], operands[1])"
   [(set (match_dup 0) (match_dup 2))
    (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 1)))]
-  ""
+{
+  /* Prefer 'mov r0,r1; add #imm8,r1' over 'mov #imm8,r1; add r0,r1'  */
+  if (satisfies_constraint_I08 (operands[2]))
+    std::swap (operands[1], operands[2]);
+}
   [(set_attr "type" "arith")])
 
 ;; -------------------------------------------------------------------------