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.
>
> 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.
Uros.