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.w...@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.