[gcc r17-2207] i386: Avoid reading call_used_regs

"H.J. Lu via Gcc-cvs" <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:16355119ad3c7e209e1e5bdac5849355205ad3fb

commit r17-2207-g16355119ad3c7e209e1e5bdac5849355205ad3fb
Author: Richard Sandiford <[email protected]>
Date:   Thu May 14 22:43:40 2026 +0100

    i386: Avoid reading call_used_regs
    
    call_used_regs is a legacy interface that targets use to tell
    init_reg_sets_1 about the default (system) ABI.  In x86 terms,
    that means the ABI associated with ix86_abi.
    
    Targets can continue to read call_used_regs directly if they
    don't have multiple ABIs.  But now that x86 does, it's better
    to be explicit about which ABI is being queried.  This is
    currently a nop but becomes important with the upcoming
    function_abi patch.
    
    As the comment in ix86_emit_tls_call says:
    
          /* TLS_GD and TLS_LD_BASE instructions are normal functions which
             clobber caller-saved registers. [...]
    
    So that function really is querying the system ABI.
    
    Similarly, x86_order_regs_for_local_alloc is called when initialising
    a target, rather than once per function, so it too should query the
    system ABI.
    
    ix86_save_reg and x86_64_select_profile_regnum ask about the
    current function's ABI, which is crtl->abi.
    
    gcc/
            * config/i386/i386-features.cc: Include function-abi.h.
            (ix86_emit_tls_call): Use default_function_abi instead of
            call_used_regs.
            * config/i386/i386.cc (x86_order_regs_for_local_alloc): Likewise.
            (ix86_save_reg, x86_64_select_profile_regnum): Use crtl->abi
            instead of call_used_regs.

Diff:
---
 gcc/config/i386/i386-features.cc |  3 ++-
 gcc/config/i386/i386.cc          | 13 +++++++------
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index e0fc13efe86e..c6c3c906c8db 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -90,6 +90,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-vector-builder.h"
 #include "debug.h"
 #include "dwarf2out.h"
+#include "function-abi.h"
 #include "i386-builtins.h"
 #include "i386-features.h"
 #include "i386-expand.h"
@@ -4349,7 +4350,7 @@ ix86_emit_tls_call (rtx tls_set, x86_cse_kind kind, basic_block bb,
 	 instructions.  */
       if (kind != X86_CSE_TLSDESC)
 	for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-	  if (call_used_regs[i]
+	  if (default_function_abi.clobbers_full_reg_p (i)
 	      && !fixed_regs[i]
 	      && bitmap_bit_p (in, i))
 	    bitmap_set_bit (live_caller_saved_regs, i);
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 2e5a225574b9..c22d059e8ca5 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -6870,7 +6870,8 @@ ix86_save_reg (unsigned int regno, bool maybe_eh_return, bool ignore_outlined)
     }
 
   return (df_regs_ever_live_p (regno)
-	  && !call_used_or_fixed_reg_p (regno)
+	  && !fixed_regs[regno]
+	  && !crtl->abi->clobbers_full_reg_p (regno)
 	  && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
 }
 
@@ -23524,13 +23525,13 @@ x86_order_regs_for_local_alloc (void)
 
    /* First allocate the local general purpose registers.  */
    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-     if (GENERAL_REGNO_P (i) && call_used_or_fixed_reg_p (i))
-	reg_alloc_order [pos++] = i;
+     if (GENERAL_REGNO_P (i) && default_function_abi.clobbers_full_reg_p (i))
+       reg_alloc_order [pos++] = i;
 
    /* Global general purpose registers.  */
    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-     if (GENERAL_REGNO_P (i) && !call_used_or_fixed_reg_p (i))
-	reg_alloc_order [pos++] = i;
+     if (GENERAL_REGNO_P (i) && !default_function_abi.clobbers_full_reg_p (i))
+       reg_alloc_order [pos++] = i;
 
    /* x87 registers come first in case we are doing FP math
       using them.  */
@@ -23992,7 +23993,7 @@ x86_64_select_profile_regnum (bool r11_ok ATTRIBUTE_UNUSED)
 #endif
 	&& TEST_HARD_REG_BIT (accessible_reg_set, i)
 	&& (ix86_save_reg (i, true, true)
-	    || (call_used_regs[i]
+	    || (crtl->abi->clobbers_full_reg_p (i)
 		&& !fixed_regs[i]
 		&& !REGNO_REG_SET_P (reg_live, i))))
       return i;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.