diff mbox

[AArch64] Improve TARGET_LEGITIMIZE_ADDRESS_P hook

Message ID 53DB8CE0.901@arm.com
State New
Headers show

Commit Message

Jiong Wang Aug. 1, 2014, 12:49 p.m. UTC
On 01/08/14 13:20, Marcus Shawcroft wrote:
> On 1 August 2014 09:31, Jiong Wang <jiong.wang@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.

Comments

Marcus Shawcroft Aug. 1, 2014, 1:08 p.m. UTC | #1
On 1 August 2014 13:49, Jiong Wang <jiong.wang@arm.com> wrote:

>
>
> Hmm... thanks for pointing this out.
>
>
> updated the patch to match three keyword. "mem", "plus" and
> "virtual-stack-vars"
>
> ok for trunk?

OK /Marcus
diff mbox

Patch

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" } } */