This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][AArch64] Improve TARGET_LEGITIMIZE_ADDRESS_P hook


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]