[ARM] Do no clobber r4 in Armv8-M nonsecure call
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Mon, 20 Nov 2017 11:06:05 +0000 (11:06 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Mon, 20 Nov 2017 11:06:05 +0000 (11:06 +0000)
Expanders for Armv8-M nonsecure call unnecessarily clobber r4 despite
the libcall they perform not writing to r4.  Furthermore, the
requirement for the branch target address to be in r4 as expected by
the libcall is modeled in a convoluted way in the define_insn patterns:
the address is a register match_operand constrained by the match_dup
for the clobber which is guaranteed to be r4 due to the expander.

This patch simplifies all this by simply requiring the address to be in
r4 and removing the clobbers. Expanders are left alone because
cmse_nonsecure_call_clear_caller_saved relies on branch target memory
attributes which would be lost if expanding to reg:SI R4_REGNUM.

2017-11-20  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    gcc/
    * config/arm/arm.md (R4_REGNUM): Define constant.
    (nonsecure_call_internal): Remove r4 clobber.
    (nonsecure_call_value_internal): Likewise.
    * config/arm/thumb1.md (nonsecure_call_reg_thumb1_v5): Remove second
    clobber and resequence match_operands.
    (nonsecure_call_value_reg_thumb1_v5): Likewise.
    * config/arm/thumb2.md (nonsecure_call_reg_thumb2): Likewise.
    (nonsecure_call_value_reg_thumb2): Likewise.

From-SVN: r254950

gcc/ChangeLog
gcc/config/arm/arm.md
gcc/config/arm/thumb1.md
gcc/config/arm/thumb2.md

index 48f87abfd97784be3ecf55cab96d4676c6cdf0f7..4df4d801854b70c54ead21a33eb1861fa18c14e4 100644 (file)
@@ -1,3 +1,14 @@
+2017-11-20  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * config/arm/arm.md (R4_REGNUM): Define constant.
+       (nonsecure_call_internal): Remove r4 clobber.
+       (nonsecure_call_value_internal): Likewise.
+       * config/arm/thumb1.md (nonsecure_call_reg_thumb1_v5): Remove second
+       clobber and resequence match_operands.
+       (nonsecure_call_value_reg_thumb1_v5): Likewise.
+       * config/arm/thumb2.md (nonsecure_call_reg_thumb2): Likewise.
+       (nonsecure_call_value_reg_thumb2): Likewise.
+
 2017-11-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/78821
index fd3aebd428a4653add534c706859f566e814ff55..545ee257699abc47abdab8b4959a16a512526cb5 100644 (file)
@@ -30,6 +30,7 @@
 (define_constants
   [(R0_REGNUM         0)       ; First CORE register
    (R1_REGNUM        1)        ; Second CORE register
+   (R4_REGNUM        4)        ; Fifth CORE register
    (IP_REGNUM       12)        ; Scratch register
    (SP_REGNUM       13)        ; Stack pointer
    (LR_REGNUM        14)       ; Return address register
                               UNSPEC_NONSECURE_MEM)
                    (match_operand 1 "general_operand" ""))
              (use (match_operand 2 "" ""))
-             (clobber (reg:SI LR_REGNUM))
-             (clobber (reg:SI 4))])]
+             (clobber (reg:SI LR_REGNUM))])]
   "use_cmse"
   "
   {
     rtx tmp;
     tmp = copy_to_suggested_reg (XEXP (operands[0], 0),
-                                gen_rtx_REG (SImode, 4),
+                                gen_rtx_REG (SImode, R4_REGNUM),
                                 SImode);
 
     operands[0] = replace_equiv_address (operands[0], tmp);
                                    UNSPEC_NONSECURE_MEM)
                         (match_operand 2 "general_operand" "")))
              (use (match_operand 3 "" ""))
-             (clobber (reg:SI LR_REGNUM))
-             (clobber (reg:SI 4))])]
+             (clobber (reg:SI LR_REGNUM))])]
   "use_cmse"
   "
   {
     rtx tmp;
     tmp = copy_to_suggested_reg (XEXP (operands[1], 0),
-                                gen_rtx_REG (SImode, 4),
+                                gen_rtx_REG (SImode, R4_REGNUM),
                                 SImode);
 
     operands[1] = replace_equiv_address (operands[1], tmp);
index 5d196a673355a7acf7d0ed30f21b997b815913f5..f91659386bf240172bd9a3076722683c8a50dff4 100644 (file)
 )
 
 (define_insn "*nonsecure_call_reg_thumb1_v5"
-  [(call (unspec:SI [(mem:SI (match_operand:SI 0 "register_operand" "l*r"))]
+  [(call (unspec:SI [(mem:SI (reg:SI R4_REGNUM))]
                    UNSPEC_NONSECURE_MEM)
-        (match_operand 1 "" ""))
-   (use (match_operand 2 "" ""))
-   (clobber (reg:SI LR_REGNUM))
-   (clobber (match_dup 0))]
+        (match_operand 0 "" ""))
+   (use (match_operand 1 "" ""))
+   (clobber (reg:SI LR_REGNUM))]
   "TARGET_THUMB1 && use_cmse && !SIBLING_CALL_P (insn)"
   "bl\\t__gnu_cmse_nonsecure_call"
   [(set_attr "length" "4")
 (define_insn "*nonsecure_call_value_reg_thumb1_v5"
   [(set (match_operand 0 "" "")
        (call (unspec:SI
-              [(mem:SI (match_operand:SI 1 "register_operand" "l*r"))]
+              [(mem:SI (reg:SI R4_REGNUM))]
               UNSPEC_NONSECURE_MEM)
-             (match_operand 2 "" "")))
-   (use (match_operand 3 "" ""))
-   (clobber (reg:SI LR_REGNUM))
-   (clobber (match_dup 1))]
+             (match_operand 1 "" "")))
+   (use (match_operand 2 "" ""))
+   (clobber (reg:SI LR_REGNUM))]
   "TARGET_THUMB1 && use_cmse"
   "bl\\t__gnu_cmse_nonsecure_call"
   [(set_attr "length" "4")
index abe90d4f4e4509f643a2cfcd6e0d225b3b4186a9..60f71c768adb0cb86808a0454cdc028365236c3a 100644 (file)
 )
 
 (define_insn "*nonsecure_call_reg_thumb2"
-  [(call (unspec:SI [(mem:SI (match_operand:SI 0 "s_register_operand" "r"))]
+  [(call (unspec:SI [(mem:SI (reg:SI R4_REGNUM))]
                    UNSPEC_NONSECURE_MEM)
-        (match_operand 1 "" ""))
-   (use (match_operand 2 "" ""))
-   (clobber (reg:SI LR_REGNUM))
-   (clobber (match_dup 0))]
+        (match_operand 0 "" ""))
+   (use (match_operand 1 "" ""))
+   (clobber (reg:SI LR_REGNUM))]
   "TARGET_THUMB2 && use_cmse"
   "bl\\t__gnu_cmse_nonsecure_call"
   [(set_attr "length" "4")
 (define_insn "*nonsecure_call_value_reg_thumb2"
   [(set (match_operand 0 "" "")
        (call
-        (unspec:SI [(mem:SI (match_operand:SI 1 "register_operand" "l*r"))]
+        (unspec:SI [(mem:SI (reg:SI R4_REGNUM))]
                    UNSPEC_NONSECURE_MEM)
-        (match_operand 2 "" "")))
-   (use (match_operand 3 "" ""))
-   (clobber (reg:SI LR_REGNUM))
-   (clobber (match_dup 1))]
+        (match_operand 1 "" "")))
+   (use (match_operand 2 "" ""))
+   (clobber (reg:SI LR_REGNUM))]
   "TARGET_THUMB2 && use_cmse"
   "bl\t__gnu_cmse_nonsecure_call"
   [(set_attr "length" "4")