On Mon, Apr 14, 2025 at 8:54 AM Hongtao Liu <crazy...@gmail.com> wrote:
>
> On Mon, Apr 14, 2025 at 7:36 AM H.J. Lu <hjl.to...@gmail.com> wrote:
> >
> > Don't use red-zone when there are no caller-saved registers and APX is
> > enabled since 128-byte red-zone is too small for 31 GPRs.
> >
> > gcc/
> >
> >         PR target/119784
> >         * config/i386/i386.cc (ix86_using_red_zone): Don't use red-zone
> >         with APX and no caller-saved registers.
> >
> > gcc/testsuite/
> >
> >         PR target/119784
> >         * gcc.target/i386/pr119784a.c: New test.
> >         * gcc.target/i386/pr119784b.c: Likewise.
> >
> > Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
> > ---
> >  gcc/config/i386/i386.cc                   |  6 ++
> >  gcc/testsuite/gcc.target/i386/pr119784a.c | 96 +++++++++++++++++++++++
> >  gcc/testsuite/gcc.target/i386/pr119784b.c | 87 ++++++++++++++++++++
> >  3 files changed, 189 insertions(+)
> >  create mode 100644 gcc/testsuite/gcc.target/i386/pr119784a.c
> >  create mode 100644 gcc/testsuite/gcc.target/i386/pr119784b.c
> >
> > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> > index 4f8380c4a58..91af239d484 100644
> > --- a/gcc/config/i386/i386.cc
> > +++ b/gcc/config/i386/i386.cc
> > @@ -458,6 +458,9 @@ int ix86_arch_specified;
> >     indirect thunk pushes the return address onto stack, destroying
> >     red-zone.
> >
> > +   NB: Don't use red-zone for functions with no_caller_saved_registers
> > +   when APX is enabled since 128-byte red-zone is too small for 31 GPRs.
> > +
> >     TODO: If we can reserve the first 2 WORDs, for PUSH and, another
> >     for CALL, in red-zone, we can allow local indirect jumps with
> >     indirect thunk.  */
> > @@ -467,6 +470,9 @@ ix86_using_red_zone (void)
> >  {
> >    return (TARGET_RED_ZONE
> >           && !TARGET_64BIT_MS_ABI
> > +         && (!TARGET_APX_F
> Could we use !TARGET_APX_EGPR, it's more clear.
> Others LGTM, but please wait for a while in case Uros has a different opinion.

LGTM too.

Thanks,
Uros.

> > +             || (cfun->machine->call_saved_registers
> > +                 != TYPE_NO_CALLER_SAVED_REGISTERS))
> >           && (!cfun->machine->has_local_indirect_jump
> >               || cfun->machine->indirect_branch_type == 
> > indirect_branch_keep));
> >  }
> > diff --git a/gcc/testsuite/gcc.target/i386/pr119784a.c 
> > b/gcc/testsuite/gcc.target/i386/pr119784a.c
> > new file mode 100644
> > index 00000000000..8a119d4cc1f
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/i386/pr119784a.c
> > @@ -0,0 +1,96 @@
> > +/* { dg-do compile { target { *-*-linux* && lp64 } } } */
> > +/* { dg-options "-O2 -fno-pic -mtune=generic -mgeneral-regs-only -mapxf 
> > -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
> > +/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
> > +/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } 
> > {^\t?\.}  } } */
> > +
> > +/* start must save and restore all caller saved registers.  */
> > +
> > +/*
> > +**start:
> > +**.LFB[0-9]+:
> > +**     .cfi_startproc
> > +**     subq    \$248, %rsp
> > +**...
> > +**     movq    %rax, \(%rsp\)
> > +**     movq    %rdx, 8\(%rsp\)
> > +**     movq    %rcx, 16\(%rsp\)
> > +**     movq    %rbx, 24\(%rsp\)
> > +**     movq    %rsi, 32\(%rsp\)
> > +**     movq    %rdi, 40\(%rsp\)
> > +**...
> > +**     movq    %rbp, 48\(%rsp\)
> > +**     movq    %r8, 56\(%rsp\)
> > +**     movq    %r9, 64\(%rsp\)
> > +**     movq    %r10, 72\(%rsp\)
> > +**     movq    %r11, 80\(%rsp\)
> > +**     movq    %r12, 88\(%rsp\)
> > +**     movq    %r13, 96\(%rsp\)
> > +**     movq    %r14, 104\(%rsp\)
> > +**     movq    %r15, 112\(%rsp\)
> > +**     movq    %r16, 120\(%rsp\)
> > +**     movq    %r17, 128\(%rsp\)
> > +**     movq    %r18, 136\(%rsp\)
> > +**     movq    %r19, 144\(%rsp\)
> > +**     movq    %r20, 152\(%rsp\)
> > +**     movq    %r21, 160\(%rsp\)
> > +**     movq    %r22, 168\(%rsp\)
> > +**     movq    %r23, 176\(%rsp\)
> > +**     movq    %r24, 184\(%rsp\)
> > +**     movq    %r25, 192\(%rsp\)
> > +**     movq    %r26, 200\(%rsp\)
> > +**     movq    %r27, 208\(%rsp\)
> > +**     movq    %r28, 216\(%rsp\)
> > +**     movq    %r29, 224\(%rsp\)
> > +**     movq    %r30, 232\(%rsp\)
> > +**     movq    %r31, 240\(%rsp\)
> > +**...
> > +**     call    \*code\(%rip\)
> > +**     movq    \(%rsp\), %rax
> > +**     movq    8\(%rsp\), %rdx
> > +**     movq    16\(%rsp\), %rcx
> > +**     movq    24\(%rsp\), %rbx
> > +**     movq    32\(%rsp\), %rsi
> > +**     movq    40\(%rsp\), %rdi
> > +**     movq    48\(%rsp\), %rbp
> > +**     movq    56\(%rsp\), %r8
> > +**     movq    64\(%rsp\), %r9
> > +**     movq    72\(%rsp\), %r10
> > +**     movq    80\(%rsp\), %r11
> > +**     movq    88\(%rsp\), %r12
> > +**     movq    96\(%rsp\), %r13
> > +**     movq    104\(%rsp\), %r14
> > +**     movq    112\(%rsp\), %r15
> > +**     movq    120\(%rsp\), %r16
> > +**     movq    128\(%rsp\), %r17
> > +**     movq    136\(%rsp\), %r18
> > +**     movq    144\(%rsp\), %r19
> > +**     movq    152\(%rsp\), %r20
> > +**     movq    160\(%rsp\), %r21
> > +**     movq    168\(%rsp\), %r22
> > +**     movq    176\(%rsp\), %r23
> > +**     movq    184\(%rsp\), %r24
> > +**     movq    192\(%rsp\), %r25
> > +**     movq    200\(%rsp\), %r26
> > +**     movq    208\(%rsp\), %r27
> > +**     movq    216\(%rsp\), %r28
> > +**     movq    224\(%rsp\), %r29
> > +**     movq    232\(%rsp\), %r30
> > +**     movq    240\(%rsp\), %r31
> > +**     addq    \$248, %rsp
> > +**...
> > +**     ret
> > +**     .cfi_endproc
> > +**...
> > +*/
> > +
> > +#define DONT_SAVE_REGS __attribute__((no_callee_saved_registers))
> > +#define SAVE_REGS __attribute__((no_caller_saved_registers))
> > +
> > +typedef DONT_SAVE_REGS void (*op_t)(void);
> > +
> > +extern op_t code[];
> > +
> > +SAVE_REGS void start()
> > +{
> > +  code[0]();
> > +}
> > diff --git a/gcc/testsuite/gcc.target/i386/pr119784b.c 
> > b/gcc/testsuite/gcc.target/i386/pr119784b.c
> > new file mode 100644
> > index 00000000000..c6761976ed6
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/i386/pr119784b.c
> > @@ -0,0 +1,87 @@
> > +/* { dg-do compile { target { *-*-linux* && x32 } } } */
> > +/* { dg-options "-O2 -fno-pic -mtune=generic -mgeneral-regs-only -mapxf 
> > -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
> > +/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
> > +/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } 
> > {^\t?\.}  } } */
> > +
> > +/* start must save and restore all caller saved registers.  */
> > +
> > +/*
> > +**start:
> > +**.LFB[0-9]+:
> > +**     .cfi_startproc
> > +**     subl    \$248, %esp
> > +**...
> > +**     movq    %rax, \(%rsp\)
> > +**     movq    %rdx, 8\(%rsp\)
> > +**     movq    %rcx, 16\(%rsp\)
> > +**     movq    %rbx, 24\(%rsp\)
> > +**     movq    %rsi, 32\(%rsp\)
> > +**     movq    %rdi, 40\(%rsp\)
> > +**...
> > +**     movq    %rbp, 48\(%rsp\)
> > +**     movq    %r8, 56\(%rsp\)
> > +**     movq    %r9, 64\(%rsp\)
> > +**     movq    %r10, 72\(%rsp\)
> > +**     movq    %r11, 80\(%rsp\)
> > +**     movq    %r12, 88\(%rsp\)
> > +**     movq    %r13, 96\(%rsp\)
> > +**     movq    %r14, 104\(%rsp\)
> > +**     movq    %r15, 112\(%rsp\)
> > +**     movq    %r16, 120\(%rsp\)
> > +**     movq    %r17, 128\(%rsp\)
> > +**     movq    %r18, 136\(%rsp\)
> > +**     movq    %r19, 144\(%rsp\)
> > +**     movq    %r20, 152\(%rsp\)
> > +**     movq    %r21, 160\(%rsp\)
> > +**     movq    %r22, 168\(%rsp\)
> > +**     movq    %r23, 176\(%rsp\)
> > +**     movq    %r24, 184\(%rsp\)
> > +**     movq    %r25, 192\(%rsp\)
> > +**     movq    %r26, 200\(%rsp\)
> > +**     movq    %r27, 208\(%rsp\)
> > +**     movq    %r28, 216\(%rsp\)
> > +**     movq    %r29, 224\(%rsp\)
> > +**     movq    %r30, 232\(%rsp\)
> > +**     movq    %r31, 240\(%rsp\)
> > +**...
> > +**     movl    code\(%rip\), %ebp
> > +**     call    \*%rbp
> > +**     movq    \(%rsp\), %rax
> > +**     movq    8\(%rsp\), %rdx
> > +**     movq    16\(%rsp\), %rcx
> > +**     movq    24\(%rsp\), %rbx
> > +**     movq    32\(%rsp\), %rsi
> > +**     movq    40\(%rsp\), %rdi
> > +**     movq    48\(%rsp\), %rbp
> > +**     movq    56\(%rsp\), %r8
> > +**     movq    64\(%rsp\), %r9
> > +**     movq    72\(%rsp\), %r10
> > +**     movq    80\(%rsp\), %r11
> > +**     movq    88\(%rsp\), %r12
> > +**     movq    96\(%rsp\), %r13
> > +**     movq    104\(%rsp\), %r14
> > +**     movq    112\(%rsp\), %r15
> > +**     movq    120\(%rsp\), %r16
> > +**     movq    128\(%rsp\), %r17
> > +**     movq    136\(%rsp\), %r18
> > +**     movq    144\(%rsp\), %r19
> > +**     movq    152\(%rsp\), %r20
> > +**     movq    160\(%rsp\), %r21
> > +**     movq    168\(%rsp\), %r22
> > +**     movq    176\(%rsp\), %r23
> > +**     movq    184\(%rsp\), %r24
> > +**     movq    192\(%rsp\), %r25
> > +**     movq    200\(%rsp\), %r26
> > +**     movq    208\(%rsp\), %r27
> > +**     movq    216\(%rsp\), %r28
> > +**     movq    224\(%rsp\), %r29
> > +**     movq    232\(%rsp\), %r30
> > +**     movq    240\(%rsp\), %r31
> > +**     addl    \$248, %esp
> > +**...
> > +**     ret
> > +**     .cfi_endproc
> > +**...
> > +*/
> > +
> > +#include "pr119784a.c"
> > --
> > 2.49.0
> >
>
>
> --
> BR,
> Hongtao

Reply via email to