On Tue, Jan 30, 2018 at 03:45:17PM +0000, Renlin Li wrote:
> Hi Richard,
> 
> Thanks for the review!
> 
> On 29/01/18 20:23, Richard Sandiford wrote:
> > 
> > The patch looks good to me FWIW.  How about adding something like
> > the following testcase?
> > 
> > ------------------------------------
> > /* { dg-do run } */
> > /* { dg-options "-O2" } */
> > 
> > typedef void (*fun) (void);
> > 
> > void __attribute__ ((noipa))
> > f (fun x1)
> > {
> >    register fun x2 asm ("x16");
> >    int arr[5000];
> >    int *volatile ptr = arr;
> >    asm ("mov %0, %1" : "=r" (x2) : "r" (x1));
> >    x2 ();
> > }
> > 
> > void g (void) {}
> > 
> > int
> > main (void)
> > {
> >    f (g);
> > }
> > ------------------------------------
> 
> It was hard for me to construct an test case at that time.
> Your example here exactly reflect the problem. The code-gen before the change 
> is:
> 
> f:
>       mov     x16, 20016
>       sub     sp, sp, x16
>       add     x0, sp, 16
>       mov     x16, 20016
>       str     x0, [sp, 8]
>       add     sp, sp, x16
>       br      x16
> 
> After the change to the register constraint:
> 
> f:
>       mov     x16, 20016
>       sub     sp, sp, x16
>       // Start of user assembly
> // 9 "indirect_tail_call_reg.c" 1
>       mov x16, x0
> // 0 "" 2
>       // End of user assembly
>       add     x0, sp, 16
>       str     x0, [sp, 8]
>       mov     x0, x16
>       mov     x16, 20016
>       add     sp, sp, x16
>       br      x0
> 
> I updated the patch with the new test case,
> the wording about the register constraint is also updated.

This patch is OK.

Thanks,
James

> gcc/ChangeLog:
> 
> 2018-01-30  Renlin Li  <renlin...@arm.com>
> 
>      * config/aarch64/aarch64.c (aarch64_class_max_nregs): Handle
>      TAILCALL_ADDR_REGS.
>      (aarch64_register_move_cost): Likewise.
>      * config/aarch64/aarch64.h (reg_class): Rename CALLER_SAVE_REGS to
>      TAILCALL_ADDR_REGS.
>      (REG_CLASS_NAMES): Likewise.
>      (REG_CLASS_CONTENTS): Rename CALLER_SAVE_REGS to
>      TAILCALL_ADDR_REGS. Remove IP registers.
>      * config/aarch64/aarch64.md (Ucs): Update register constraint.
> 
> gcc/testsuite/ChangeLog:
> 
> 2018-01-30  Richard Sandiford  <richard.sandif...@linaro.org>
> 
>      * gcc.target/aarch64/indirect_tail_call_reg.c: New.
> 

Reply via email to