aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-09 14:31:25 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-09 14:31:25 +0000
commit509bb9b647516bbf6af77778d2ffe7e756be26df (patch)
tree988f7d6b12c07b237320541649d1abc670a59c9e
parent7ad429a4de1197b4b032da0981a2c91ac5d0dd06 (diff)
downloadgcc-509bb9b647516bbf6af77778d2ffe7e756be26df.zip
gcc-509bb9b647516bbf6af77778d2ffe7e756be26df.tar.gz
gcc-509bb9b647516bbf6af77778d2ffe7e756be26df.tar.bz2
[AArch64] Reject (high (const (plus anchor offset)))
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/aarch64/aarch64.c6
2 files changed, 8 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d3c313d..5ffba63 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
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
if the destination isn't an SSA_NAME.
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 03a92b6..e129362 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -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))