Re: [27/32] Remove global call sets: reload.c

2019-09-29 Thread Jeff Law
On 9/11/19 1:16 PM, Richard Sandiford wrote:
> The inheritance code in find_equiv_reg can use clobbers_reg_p
> to test whether a call clobbers either of the equivalent registers.
> 
> reload and find_reg use crtl->abi to test whether a register needs
> to be saved in the prologue before use.
> 
> reload_as_needed can use full_and_partial_reg_clobbers and thus
> avoid needing to keep its own record of which registers are part
> call-clobbered.
> 
> 
> 2019-09-11  Richard Sandiford  
> 
> gcc/
>   * reload.c: Include function-abi.h.
>   (find_equiv_reg): Use clobbers_reg_p to test whether either
>   of the equivalent registers is clobbered by a call.
>   * reload1.c: Include function-abi.h.
>   (reg_reloaded_call_part_clobbered): Delete.
>   (reload): Use crtl->abi to test which registers would need
>   saving in the prologue before use.
>   (find_reg): Likewise.
>   (emit_reload_insns): Remove code for reg_reloaded_call_part_clobbered.
>   (reload_as_needed): Likewise.  Use full_and_partial_reg_clobbers
>   instead of call_used_or_fixed_regs | reg_reloaded_call_part_clobbered.
> 
OK
jeff


[27/32] Remove global call sets: reload.c

2019-09-11 Thread Richard Sandiford
The inheritance code in find_equiv_reg can use clobbers_reg_p
to test whether a call clobbers either of the equivalent registers.

reload and find_reg use crtl->abi to test whether a register needs
to be saved in the prologue before use.

reload_as_needed can use full_and_partial_reg_clobbers and thus
avoid needing to keep its own record of which registers are part
call-clobbered.


2019-09-11  Richard Sandiford  

gcc/
* reload.c: Include function-abi.h.
(find_equiv_reg): Use clobbers_reg_p to test whether either
of the equivalent registers is clobbered by a call.
* reload1.c: Include function-abi.h.
(reg_reloaded_call_part_clobbered): Delete.
(reload): Use crtl->abi to test which registers would need
saving in the prologue before use.
(find_reg): Likewise.
(emit_reload_insns): Remove code for reg_reloaded_call_part_clobbered.
(reload_as_needed): Likewise.  Use full_and_partial_reg_clobbers
instead of call_used_or_fixed_regs | reg_reloaded_call_part_clobbered.

Index: gcc/reload.c
===
--- gcc/reload.c2019-09-11 19:47:32.902202887 +0100
+++ gcc/reload.c2019-09-11 19:49:00.269587248 +0100
@@ -106,6 +106,7 @@ #define REG_OK_STRICT
 #include "reload.h"
 #include "addresses.h"
 #include "params.h"
+#include "function-abi.h"
 
 /* True if X is a constant that can be forced into the constant pool.
MODE is the mode of the operand, or VOIDmode if not known.  */
@@ -6904,24 +6905,19 @@ find_equiv_reg (rtx goal, rtx_insn *insn
 if either of the two is in a call-clobbered register, or memory.  */
   if (CALL_P (p))
{
- int i;
-
  if (goal_mem || need_stable_sp)
return 0;
 
- if (regno >= 0 && regno < FIRST_PSEUDO_REGISTER)
-   for (i = 0; i < nregs; ++i)
- if (call_used_or_fixed_reg_p (regno + i)
- || targetm.hard_regno_call_part_clobbered (0, regno + i,
-mode))
-   return 0;
+ function_abi abi = call_insn_abi (p);
+ if (regno >= 0
+ && regno < FIRST_PSEUDO_REGISTER
+ && abi.clobbers_reg_p (mode, regno))
+   return 0;
 
- if (valueno >= 0 && valueno < FIRST_PSEUDO_REGISTER)
-   for (i = 0; i < valuenregs; ++i)
- if (call_used_or_fixed_reg_p (valueno + i)
- || targetm.hard_regno_call_part_clobbered (0, valueno + i,
-mode))
-   return 0;
+ if (valueno >= 0
+ && valueno < FIRST_PSEUDO_REGISTER
+ && abi.clobbers_reg_p (mode, valueno))
+   return 0;
}
 
   if (INSN_P (p))
Index: gcc/reload1.c
===
--- gcc/reload1.c   2019-09-11 19:47:32.902202887 +0100
+++ gcc/reload1.c   2019-09-11 19:49:00.273587220 +0100
@@ -42,6 +42,7 @@ Software Foundation; either version 3, o
 #include "except.h"
 #include "dumpfile.h"
 #include "rtl-iter.h"
+#include "function-abi.h"
 
 /* This file contains the reload pass of the compiler, which is
run after register allocation has been done.  It checks that
@@ -120,11 +121,6 @@ #define spill_indirect_levels  \
This is only valid if reg_reloaded_contents is set and valid.  */
 static HARD_REG_SET reg_reloaded_dead;
 
-/* Indicate whether the register's current value is one that is not
-   safe to retain across a call, even for registers that are normally
-   call-saved.  This is only meaningful for members of reg_reloaded_valid.  */
-static HARD_REG_SET reg_reloaded_call_part_clobbered;
-
 /* Number of spill-regs so far; number of valid elements of spill_regs.  */
 static int n_spills;
 
@@ -795,7 +791,7 @@ reload (rtx_insn *first, int global)
 
   if (crtl->saves_all_registers)
 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-  if (! call_used_or_fixed_reg_p (i)
+  if (! crtl->abi->clobbers_full_reg_p (i)
  && ! fixed_regs[i]
  && ! LOCAL_REGNO (i))
df_set_regs_ever_live (i, true);
@@ -1908,8 +1904,8 @@ find_reg (class insn_chain *chain, int o
  && (inv_reg_alloc_order[regno]
  < inv_reg_alloc_order[best_reg])
 #else
- && call_used_or_fixed_reg_p (regno)
- && ! call_used_or_fixed_reg_p (best_reg)
+ && crtl->abi->clobbers_full_reg_p (regno)
+ && !crtl->abi->clobbers_full_reg_p (best_reg)
 #endif
  ))
{
@@ -4464,7 +4460,6 @@ reload_as_needed (int live_known)
   reg_last_reload_reg = XCNEWVEC (rtx, max_regno);
   INIT_REG_SET (®_has_output_reload);
   CLEAR_HARD_REG_SET (reg_reloaded_valid);
-  CLEAR_HARD_REG_SET (reg_reloaded_call_part_clobbered);
 
   set_initial_elim_offsets ();
 
@@ -4786,8 +4781,8