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. > + || (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