arm: correct constraints on movsi_compare0 [PR91913]
authorRichard Earnshaw <rearnsha@arm.com>
Mon, 10 Feb 2020 15:37:23 +0000 (15:37 +0000)
committerRichard Earnshaw <rearnsha@arm.com>
Mon, 10 Feb 2020 15:53:12 +0000 (15:53 +0000)
The peephole that detects a mov of one register to another followed by
a comparison of the original register against zero is only used in Arm
state; but the instruction that matches this is generic to all 32-bit
compilation states.  That instruction lacks support for SP which is
permitted in Arm state, but has restrictions in Thumb2 code.

This patch fixes the problem by allowing SP when in ARM state for all
registers; in Thumb state it allows SP only as a source when the
register really is copied to another target.

* config/arm/arm.md (movsi_compare0): Allow SP as a source register
in Thumb state and also as a destination in Arm state.  Add T16
variants.

gcc/ChangeLog
gcc/config/arm/arm.md

index a5c24dba24a931b78fa2a02677519e2dd3a32afc..60bd34758c0c5f00c7e5bd63f0acf24e8538ffee 100644 (file)
@@ -1,3 +1,10 @@
+2020-02-10  Richard Earnshaw  <rearnsha@arm.com>
+
+       PR target/91913
+       * config/arm/arm.md (movsi_compare0): Allow SP as a source register
+       in Thumb state and also as a destination in Arm state.  Add T16
+       variants.
+
 2020-02-10  Hans-Peter Nilsson  <hp@axis.com>
 
        * md.texi (Define Subst): Match closing paren in example.
index 5baf82d2ad6f423bc0e63a01be35e9fb67ebadb1..ab277996462cbb99b4338144ca3f87d75f9fe0ce 100644 (file)
 
 (define_insn "*movsi_compare0"
   [(set (reg:CC CC_REGNUM)
-       (compare:CC (match_operand:SI 1 "s_register_operand" "0,r")
+       (compare:CC (match_operand:SI 1 "s_register_operand" "0,0,l,rk,rk")
                    (const_int 0)))
-   (set (match_operand:SI 0 "s_register_operand" "=r,r")
+   (set (match_operand:SI 0 "s_register_operand" "=l,rk,l,r,rk")
        (match_dup 1))]
   "TARGET_32BIT"
   "@
    cmp%?\\t%0, #0
+   cmp%?\\t%0, #0
+   subs%?\\t%0, %1, #0
+   subs%?\\t%0, %1, #0
    subs%?\\t%0, %1, #0"
   [(set_attr "conds" "set")
-   (set_attr "type" "alus_imm,alus_imm")]
+   (set_attr "arch" "t2,*,t2,t2,a")
+   (set_attr "type" "alus_imm")
+   (set_attr "length" "2,4,2,4,4")]
 )
 
 ;; Subroutine to store a half word from a register into memory.