re PR target/55212 ([SH] Switch to LRA)
authorOleg Endo <olegendo@gcc.gnu.org>
Sun, 21 Dec 2014 23:37:42 +0000 (23:37 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Sun, 21 Dec 2014 23:37:42 +0000 (23:37 +0000)
gcc/
PR target/55212
* config/sh/sh.md (*addsi3_compact): Add parentheses around &&
condition.  Add comments.

From-SVN: r218999

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

index bee3813269f74d6fbb51aa793d99c78a9ad9b7b9..e5d16f9d01e2eee35315f996f346f9d9240c6304 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-17  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/55212
+       * config/sh/sh.md (*addsi3_compact): Add parentheses around &&
+       condition.  Add comments.
+
 2014-12-20  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR target/64358
index a74e17f151f459dc988739714c923653df2f4bf4..7b68aa1b912ff584c2fde01d025cc0fc97172509 100644 (file)
   [(set_attr "type" "arith_media")
    (set_attr "highpart" "ignore")])
 
+;; The *addsi3_compact is made an insn_and_split and accepts actually
+;; impossible constraints to make LRA's register elimination work well on SH.
+;; 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.
 (define_insn_and_split "*addsi3_compact"
   [(set (match_operand:SI 0 "arith_reg_dest" "=r,&r")
        (plus:SI (match_operand:SI 1 "arith_operand" "%0,r")
                 (match_operand:SI 2 "arith_or_int_operand" "rI08,rn")))]
   "TARGET_SH1
-   && (rtx_equal_p (operands[0], operands[1])
-       && arith_operand (operands[2], SImode))
-      || ! reg_overlap_mentioned_p (operands[0], operands[1])"
+   && ((rtx_equal_p (operands[0], operands[1])
+        && arith_operand (operands[2], SImode))
+       || ! reg_overlap_mentioned_p (operands[0], operands[1]))"
   "@
        add     %2,%0
        #"