Mark symbols as constant
authorWilco Dijkstra <wdijkstr@arm.com>
Wed, 21 Jun 2017 10:40:21 +0000 (10:40 +0000)
committerWilco Dijkstra <wilco@gcc.gnu.org>
Wed, 21 Jun 2017 10:40:21 +0000 (10:40 +0000)
Aarch64_legitimate_constant_p currently returns false for symbols,
eventhough they are always valid constants.  This means LOSYM isn't
CSEd correctly.  If we return true CSE works better, resulting in
smaller/faster code (0.3% smaller code on SPEC2006).  Avoid this
for TLS symbols since their sequence is complex.

    gcc/
* config/aarch64/aarch64.c (aarch64_legitimate_constant_p):
Return true for non-tls symbols.

From-SVN: r249442

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index e08150c612c5684153d9fbe1faa8d40b0c4ec17a..1aaaf61a073ce2789629d4f0c991a168c06df793 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-21  Wilco Dijkstra  <wdijkstr@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_legitimate_constant_p):
+       Return true for non-tls symbols.
+
 2017-06-21  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/aarch64/aarch64-cores.def (cortex-a55): New.
index 04417dcd609f6e8ff594a9c5853b3143696d3208..ba6b45fcb3d5d663dcaf5273a91a7ec03b0618ae 100644 (file)
@@ -10129,6 +10129,11 @@ aarch64_legitimate_constant_p (machine_mode mode, rtx x)
       && aarch64_valid_symref (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
     return true;
 
+  /* Treat symbols as constants.  Avoid TLS symbols as they are complex,
+     so spilling them is better than rematerialization.  */
+  if (SYMBOL_REF_P (x) && !SYMBOL_REF_TLS_MODEL (x))
+    return true;
+
   return aarch64_constant_address_p (x);
 }