Richard Earnshaw wrote:

> What testing has this had with -fpic?  I'm not convinced that this
> assertion is true in that case?

I ran the GLIBC tests which pass. -fpic works since it does also form a
constant address, ie. instead of:

adrp  x1, global
add x1, x1, :lo12:global

we do:

adrp  x1, :got:global
ldr x1, [x1, :got_lo12:global]

CSEing or rematerializing either sequence works in the same way.

With TLS the resulting addresses are also constant, however this could
cause rather complex TLS sequences to be rematerialized.  It seems
best to block that.  Updated patch below:


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.

int x0 = 1, x1 = 2, x2 = 3;

int 
f (int x, int y)
{
  x += x1;
  if (x > 100)
    y += x2;
  x += x0;
  return x + y;
}

Before:
        adrp    x3, .LANCHOR0
        add     x4, x3, :lo12:.LANCHOR0
        ldr     w2, [x3, #:lo12:.LANCHOR0]
        add     w0, w0, w2
        cmp     w0, 100
        ble     .L5
        ldr     w2, [x4, 8]
        add     w1, w1, w2
.L5:
        add     x3, x3, :lo12:.LANCHOR0
        ldr     w2, [x3, 4]
        add     w0, w0, w2
        add     w0, w0, w1
        ret

After:
        adrp    x2, .LANCHOR0
        add     x3, x2, :lo12:.LANCHOR0
        ldr     w2, [x2, #:lo12:.LANCHOR0]
        add     w0, w0, w2
        cmp     w0, 100
        ble     .L5
        ldr     w2, [x3, 8]
        add     w1, w1, w2
.L5:
        ldr     w2, [x3, 4]
        add     w0, w0, w2
        add     w0, w0, w1
        ret

Bootstrap OK, OK for commit?

ChangeLog:
2017-06-20  Wilco Dijkstra  <wdijk...@arm.com>

        * config/aarch64/aarch64.c (aarch64_legitimate_constant_p):
        Return true for non-tls symbols.
--
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 
5ec6bbfcf484baa4005b8a88cb98d0d04f710877..060cd8476d2954119daac495ecb059c9be73edbe
 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -10111,6 +10111,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);
 }
 

Reply via email to