[aarch64]: force frame pointer setup before tlsdesc call
authorSylvia Taylor <sylvia.taylor@arm.com>
Wed, 3 Jul 2019 10:57:28 +0000 (10:57 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Wed, 3 Jul 2019 10:57:28 +0000 (10:57 +0000)
The operation that sets up the tlsdesc register is really a function
call; as such, the frame pointer should really be correctly set up
before this happens.  However, because it does not appear as a
call_insn in the RTL the normal dependencies are not added
automatically.  We fix this by adding a USE of FP_REGNUM to prevent
migration of the frame-pointer setup past the call by the scheduler.
If a frame pointer is not being used, this is harmless since it only
represents a scheduling constraint.

2019-07-03  Sylvia Taylor  <sylvia.taylor@arm.com>

* config/aarch64/aarch64.md (FP_REGNUM): New constant.
(tlsdesc_small_advsimd_<mode>): Add use of FP_REGNUM.
(tlsdesc_small_sve_<mode>): Likewise.

From-SVN: r273000

gcc/ChangeLog
gcc/config/aarch64/aarch64.md

index 5b255adaa16a51a52a326157665dba47757829fc..68eb338e7fa9d0214718b77664757a7ba6dca241 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-03  Sylvia Taylor  <sylvia.taylor@arm.com>
+
+       * config/aarch64/aarch64.md (FP_REGNUM): New constant.
+       (tlsdesc_small_advsimd_<mode>): Add use of FP_REGNUM.
+       (tlsdesc_small_sve_<mode>): Likewise.
+
 2019-07-03  Martin Liska  <mliska@suse.cz>
 
        * Makefile.in: Define ZSTD_LIB.
index 7026b3a3b92be94cb916dfcc1d45930dff93177b..b11bf154c9b6c0ed3c137ecc6626dbf3045edac3 100644 (file)
     ;; Scratch registers used in frame layout.
     (IP0_REGNUM         16)
     (IP1_REGNUM         17)
+    (FP_REGNUM         29)
     (LR_REGNUM          30)
   ]
 )
                    UNSPEC_TLSDESC))
    (clobber (reg:DI LR_REGNUM))
    (clobber (reg:CC CC_REGNUM))
-   (clobber (match_scratch:DI 1 "=r"))]
+   (clobber (match_scratch:DI 1 "=r"))
+   (use (reg:DI FP_REGNUM))]
   "TARGET_TLS_DESC && !TARGET_SVE"
   "adrp\\tx0, %A0\;ldr\\t%<w>1, [x0, #%L0]\;add\\t<w>0, <w>0, %L0\;.tlsdesccall\\t%0\;blr\\t%1"
   [(set_attr "type" "call")
    (clobber (reg:VNx2BI P13_REGNUM))
    (clobber (reg:VNx2BI P14_REGNUM))
    (clobber (reg:VNx2BI P15_REGNUM))
-   (clobber (match_scratch:DI 1 "=r"))]
+   (clobber (match_scratch:DI 1 "=r"))
+   (use (reg:DI FP_REGNUM))]
   "TARGET_TLS_DESC && TARGET_SVE"
   "adrp\\tx0, %A0\;ldr\\t%<w>1, [x0, #%L0]\;add\\t<w>0, <w>0, %L0\;.tlsdesccall\\t%0\;blr\\t%1"
   [(set_attr "type" "call")