On 01/08/14 13:20, Marcus Shawcroft wrote:
On 1 August 2014 09:31, Jiong Wang <jiong.w...@arm.com> wrote:

gcc/
   * config/aarch64/aarch64.c (aarch64_classify_address): Accept all offset
for frame access
   when strict_p is false.

This part is OK.

gcc/testsuite
   * gcc.target/aarch64/legitimize_stack_var_before_reload_1.c: New testcase.
This test case relies on:
+/* { dg-final { scan-rtl-dump "mem/j/c:QI \\(plus:DI" "expand" } } */
... which is not very specific.  Can we tighten this up to look for
something directly related to the relevant frame access?

Hmm... thanks for pointing this out.


updated the patch to match three keyword. "mem", "plus" and "virtual-stack-vars"

ok for trunk?

thanks.

-- Jiong

gcc/
   * config/aarch64/aarch64.c (aarch64_classify_address): Accept all offset for 
frame access
   when strict_p is false.

gcc/testsuite
   * gcc.target/aarch64/legitimize_stack_var_before_reload_1.c: New testcase.
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index ed80269..c8e5808 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -3248,6 +3248,21 @@ aarch64_classify_address (struct aarch64_address_info *info,
     case PLUS:
       op0 = XEXP (x, 0);
       op1 = XEXP (x, 1);
+
+      if (! strict_p
+	  && GET_CODE (op0) == REG
+	  && (op0 == virtual_stack_vars_rtx
+	      || op0 == frame_pointer_rtx
+	      || op0 == arg_pointer_rtx)
+	  && GET_CODE (op1) == CONST_INT)
+	{
+	  info->type = ADDRESS_REG_IMM;
+	  info->base = op0;
+	  info->offset = op1;
+
+	  return true;
+	}
+
       if (GET_MODE_SIZE (mode) != 0
 	  && CONST_INT_P (op1)
 	  && aarch64_base_register_rtx_p (op0, strict_p))
diff --git a/gcc/testsuite/gcc.target/aarch64/legitimize_stack_var_before_reload_1.c b/gcc/testsuite/gcc.target/aarch64/legitimize_stack_var_before_reload_1.c
new file mode 100644
index 0000000..e5f0bd1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/legitimize_stack_var_before_reload_1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-rtl-expand" } */
+
+extern void initialize_array (unsigned char *, int);
+
+int
+test15 (void)
+{
+  unsigned char a[480];
+
+  initialize_array (a, 480);
+
+  if (a[0] == 0x10)
+    return 1;
+
+  return 0;
+}
+
+/* { dg-final { scan-rtl-dump "\\(mem\[^\\n\]*\\(plus\[^\\n\]*virtual-stack-vars" "expand" } } */
+
+/* { dg-final { cleanup-rtl-dump "expand" } } */

Reply via email to