On Tue, May 12, 2026 at 3:08 PM Uros Bizjak <[email protected]> wrote: > > On Tue, May 12, 2026 at 2:54 PM Uros Bizjak <[email protected]> wrote: > > > > On Tue, May 12, 2026 at 2:30 PM H.J. Lu <[email protected]> wrote: > > > > > > I am testing this patch. OK for master if there are no regressions? > > > > > > > > > -- > > > H.J. > > > In 64-bit mode, in preserve_none functions, we can use any register for > > > DRAP, except for R12, R13, R14, R15, DI, SI (which are used for parameter > > > passing), SP and BP. Use R11 instead. Since no-callee-saved functions > > > don't use R10 nor R13 for parameter passing, they are OK for DRAP. In > > > 32-bit mode, since preserve_none functions don't change parameter passing, > > > the existing choice is OK. > > Please write the above: > > "In 64-bit mode, for preserve_none functions, DRAP may use any > register except R12–R15, DI, SI (argument registers), SP, and BP. Use > R11. In non-callee-saved functions R10 and R13 are also available > since they are not used for parameter passing. In 32-bit mode, > preserve_none does not affect parameter passing, so the current > approach remains valid." > > > > DRAP register is used to restore stack pointer in epilogue for stack > > > realignment. Always save and restore DRAP register between prologue > > > and epilogue so that stack pointer can be restored. > > > > > > Tested with CPython 3.14.4 on Linux/x86-64. > > > > > > gcc/ > > > > > > PR target/120870 > > > * config/i386/i386.cc (ix86_save_reg): Return true for DRAP > > > register. > > > (find_drap_reg): Use R11_REG in preserve_none functions in > > > 64-bit mode. > > > > > > gcc/testsuite/ > > > > > > PR target/120870 > > > * gcc.target/i386/pr120870-1.c: New test. > > > * gcc.target/i386/pr120870-2.c: Likewise. > > > > > > Signed-off-by: H.J. Lu <[email protected]> > > > Co-Authored-By: Uros Bizjak <[email protected]> > > > > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc > > index 9aecd51119f..46bef11d3f8 100644 > > --- a/gcc/config/i386/i386.cc > > +++ b/gcc/config/i386/i386.cc > > @@ -6776,6 +6776,13 @@ ix86_save_reg (unsigned int regno, bool > > maybe_eh_return, bool ignore_outlined) > > { > > rtx reg; > > > > + /* Save and restore DRAP register between prologue and epilogue so > > + that stack pointer can be restored. */ > > + if (crtl->drap_reg > > + && regno == REGNO (crtl->drap_reg) > > + && !cfun->machine->no_drap_save_restore) > > + return true; > > + > > > > Please remove a copy of this code later in the ix86_save_reg function. > > It is a dead code now. > > + /* In preserve_none functions, we can use any register for DRAP, > + except for R12_REG, R13_REG, R14_REG, R15_REG, DI_REG, SI_REG > + (which are used for parameter passing), SP_REG and BP_REG. > + Pick R11_REG instead. Since no-callee-saved functions don't > + use R10_REG nor R13_REG for parameter passing, they are OK > + for DRAP. */ > > > Also, please rewrite this part similar to the commit message.
Or better, simply say: /* In preserve_none functions, any register can be used for DRAP, except R12–R15, DI, SI (argument registers), SP, and BP. */ It is quite obvious that we choose R11. No need to mention no-callee-saved function with default parameter passing. Uros.
