[AArch64] Tighten address register subreg checks
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 31 Aug 2017 10:11:41 +0000 (10:11 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 31 Aug 2017 10:11:41 +0000 (10:11 +0000)
Previously we allowed subregs of non-GPR modes to be base and index
registers in non-strict mode.  In practice such subregs will always
require a reload, so we get better code by disallowing them.

2017-08-31  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* config/aarch64/aarch64.c (aarch64_base_register_rtx_p): Only allow
subregs whose inner modes can be stored in GPRs.
(aarch64_classify_index): Likewise.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r251557

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

index 8d724510a4528ba2785d32551e909a4f9b468f0a..dfde0b011857834c2ceef8fff6063c61890777c2 100644 (file)
@@ -1,3 +1,11 @@
+2017-08-31  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_base_register_rtx_p): Only allow
+       subregs whose inner modes can be stored in GPRs.
+       (aarch64_classify_index): Likewise.
+
 2017-08-31  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index aede22ceaf59a1c61ac386e03e0999cd08a03411..ca0775272af2bebe5319ce487c973178092e5ad7 100644 (file)
@@ -4196,7 +4196,9 @@ aarch64_regno_ok_for_base_p (int regno, bool strict_p)
 static bool
 aarch64_base_register_rtx_p (rtx x, bool strict_p)
 {
-  if (!strict_p && GET_CODE (x) == SUBREG)
+  if (!strict_p
+      && GET_CODE (x) == SUBREG
+      && contains_reg_of_mode[GENERAL_REGS][GET_MODE (SUBREG_REG (x))])
     x = SUBREG_REG (x);
 
   return (REG_P (x) && aarch64_regno_ok_for_base_p (REGNO (x), strict_p));
@@ -4343,7 +4345,9 @@ aarch64_classify_index (struct aarch64_address_info *info, rtx x,
   else
     return false;
 
-  if (GET_CODE (index) == SUBREG)
+  if (!strict_p
+      && GET_CODE (index) == SUBREG
+      && contains_reg_of_mode[GENERAL_REGS][GET_MODE (SUBREG_REG (index))])
     index = SUBREG_REG (index);
 
   if ((shift == 0 ||