This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH][AArch64] Improve TARGET_LEGITIMIZE_ADDRESS_P hook
- From: Venkataramanan Kumar <venkataramanan dot kumar at linaro dot org>
- To: Jiong Wang <jiong dot wang at arm dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 1 Aug 2014 16:29:44 +0530
- Subject: Re: [PATCH][AArch64] Improve TARGET_LEGITIMIZE_ADDRESS_P hook
- Authentication-results: sourceware.org; auth=none
- References: <53DB504B dot 3030303 at arm dot com>
Hi Jiong,
(Snip)
+ && (op0 == virtual_stack_vars_rtx
+ || op0 == frame_pointer_rtx
+ || op0 == arg_pointer_rtx)
(Snip)
The above check is means that these are the ways to access the frame.
is it possible to have stack_pointer_rtx has op0?
On 1 August 2014 14:01, Jiong Wang <jiong.wang@arm.com> wrote:
> currently, aarch64 LEGITIMIZE_ADDRESS_P hook will reject all "reg + offset"
> address given
> "offset" is beyond supported range.
>
> while this may be too strict. we should honor the "strict_p" parameter in
> the hook. before
> reload, we accept all offset if it's a frame access, because the offset may
> change during
> later register elimination.
>
> the early reject of "reg + offset" may cause extra registers created, and if
> that register
> live range is across function invoking then callee saved reg needed, thus
> introduce extra
> reg save/restore also.
>
> give a simple example as:
>
> int
> test15 (void)
> {
> unsigned char a[480];
> initialize_array (a, 480);
>
> if (a[0] == 0x10)
> return 1;
>
> return 0;
> }
>
> .S before the patch
> (-O2 -fPIC)
> ===
> test15:
> sub sp, sp, #480
> mov w1, 480
> stp x29, x30, [sp, -32]!
> add x29, sp, 0
> str x19, [sp, 16]
> add x19, x29, 32
> mov x0, x19
> bl initialize_array
> ldrb w0, [x19]
> ldr x19, [sp, 16]
> ldp x29, x30, [sp], 32
> cmp w0, 16
> cset w0, eq
> add sp, sp, 480
> ret
>
> .S after the patch
> ===
> test15:
> stp x29, x30, [sp, -496]!
> mov w1, 480
> add x29, sp, 0
> add x0, x29, 16
> bl initialize_array
> ldrb w0, [x29, 16]
> ldp x29, x30, [sp], 496
> cmp w0, 16
> cset w0, eq
> ret
>
> test done
> =========
> no regression on aarch64-none-elf bare metal.
> bootstrap OK on aarch64.
>
> OK for trunk?
>
> thanks.
>
> 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.