https://gcc.gnu.org/g:00e551bfbd4023047a42ccb022a35707b8ef42e6

commit r16-1611-g00e551bfbd4023047a42ccb022a35707b8ef42e6
Author: Takayuki 'January June' Suwa <jjsuwa_sys3...@yahoo.co.jp>
Date:   Mon Jun 16 22:33:36 2025 +0900

    xtensa: Implement TARGET_ZERO_CALL_USED_REGS
    
    This patch implements the target-specific ZERO_CALL_USED_REGS hook, since
    if -fzero-call-used-regs=all the default hook tries to assign 0 to B0
    (bit 0 of the BR register) and the ICE will be thrown.
    
    gcc/ChangeLog:
    
            * config/xtensa/xtensa.cc (xtensa_zero_call_used_regs):
            New prototype and function.
            (TARGET_ZERO_CALL_USED_REGS): Define macro.

Diff:
---
 gcc/config/xtensa/xtensa.cc | 56 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc
index 90b5ff93042f..92a236440c4a 100644
--- a/gcc/config/xtensa/xtensa.cc
+++ b/gcc/config/xtensa/xtensa.cc
@@ -198,6 +198,7 @@ static void xtensa_output_mi_thunk (FILE *file, tree thunk 
ATTRIBUTE_UNUSED,
 static rtx xtensa_delegitimize_address (rtx);
 static reg_class_t xtensa_ira_change_pseudo_allocno_class (int, reg_class_t,
                                                           reg_class_t);
+static HARD_REG_SET xtensa_zero_call_used_regs (HARD_REG_SET);
 
 
 
@@ -370,6 +371,9 @@ static reg_class_t xtensa_ira_change_pseudo_allocno_class 
(int, reg_class_t,
 #undef TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS
 #define TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS 
xtensa_ira_change_pseudo_allocno_class
 
+#undef TARGET_ZERO_CALL_USED_REGS
+#define TARGET_ZERO_CALL_USED_REGS xtensa_zero_call_used_regs
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 
@@ -5467,4 +5471,56 @@ xtensa_ira_change_pseudo_allocno_class (int regno, 
reg_class_t allocno_class,
   return FLOAT_MODE_P (PSEUDO_REGNO_MODE (regno)) ? FP_REGS : AR_REGS;
 }
 
+/* Implement TARGET_ZERO_CALL_USED_REGS.  */
+
+static HARD_REG_SET
+xtensa_zero_call_used_regs (HARD_REG_SET selected_regs)
+{
+  unsigned int regno;
+  int zeroed_regno = -1;
+  hard_reg_set_iterator hrsi;
+  rtvec argvec, convec;
+
+  EXECUTE_IF_SET_IN_HARD_REG_SET (selected_regs, 1, regno, hrsi)
+    {
+      if (GP_REG_P (regno))
+       {
+         emit_move_insn (gen_rtx_REG (SImode, regno), const0_rtx);
+         if (zeroed_regno < 0)
+           zeroed_regno = regno;
+         continue;
+       }
+      if (TARGET_BOOLEANS && BR_REG_P (regno))
+       {
+         gcc_assert (zeroed_regno >= 0);
+         argvec = rtvec_alloc (1);
+         RTVEC_ELT (argvec, 0) = gen_rtx_REG (SImode, zeroed_regno);
+         convec = rtvec_alloc (1);
+         RTVEC_ELT (convec, 0) = gen_rtx_ASM_INPUT (SImode, "r");
+         emit_insn (gen_rtx_ASM_OPERANDS (VOIDmode, "wsr\t%0, BR",
+                                          "", 0, argvec, convec,
+                                          rtvec_alloc (0),
+                                          UNKNOWN_LOCATION));
+         continue;
+       }
+      if (TARGET_HARD_FLOAT && FP_REG_P (regno))
+       {
+         gcc_assert (zeroed_regno >= 0);
+         emit_move_insn (gen_rtx_REG (SFmode, regno),
+                         gen_rtx_REG (SFmode, zeroed_regno));
+         continue;
+       }
+      if (TARGET_MAC16 && ACC_REG_P (regno))
+       {
+         gcc_assert (zeroed_regno >= 0);
+         emit_move_insn (gen_rtx_REG (SImode, regno),
+                         gen_rtx_REG (SImode, zeroed_regno));
+         continue;
+       }
+      CLEAR_HARD_REG_BIT (selected_regs, regno);
+    }
+
+  return selected_regs;
+}
+
 #include "gt-xtensa.h"

Reply via email to