[AArch64] Reject (high (const (plus anchor offset)))
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 9 Jan 2018 14:31:25 +0000 (14:31 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 9 Jan 2018 14:31:25 +0000 (14:31 +0000)
The aarch64_legitimate_constant_p tests for HIGH and CONST seem
to be the wrong way round: (high (const ...)) is valid rtl that
could be passed in, but (const (high ...)) isn't.  As it stands,
we disallow anchor+offset but allow (high anchor+offset).

2018-01-09  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* config/aarch64/aarch64.c (aarch64_legitimate_constant_p): Fix
order of HIGH and CONST checks.

From-SVN: r256384

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

index d3c313d8329cd55d411c50006696ac238b5adbe2..5ffba6348bcea884c38d889edcefab6b80a52e24 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-09  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * config/aarch64/aarch64.c (aarch64_legitimate_constant_p): Fix
+       order of HIGH and CONST checks.
+
 2018-01-09  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * tree-vect-stmts.c (permute_vec_elements): Create a fresh variable
index 03a92b6d695b056fa2ccb575b5bc49b23a7b0000..e129362ef66796f5a185d41518b5b11393fa4b41 100644 (file)
@@ -10449,6 +10449,9 @@ aarch64_legitimate_constant_p (machine_mode mode, rtx x)
   if (CONST_WIDE_INT_P (x))
     return false;
 
+  if (GET_CODE (x) == HIGH)
+    x = XEXP (x, 0);
+
   /* Do not allow const (plus (anchor_symbol, const_int)).  */
   if (GET_CODE (x) == CONST)
     {
@@ -10460,9 +10463,6 @@ aarch64_legitimate_constant_p (machine_mode mode, rtx x)
        return false;
     }
 
-  if (GET_CODE (x) == HIGH)
-    x = XEXP (x, 0);
-
   /* 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))