Hi.
The fixed_reg_set contain all fixed and global registers. This patch change code
"fixed_regs[r] || global_regs[r]" with "TEST_HARD_REG_BIT (fixed_reg_set, r)".
Bootstrapped and reg-tested on x86_64-unknown-linux-gnu and
powerpc64le-unknown-linux-gnu.
OK for trunk?
2015-08-24 Anatoly Sokolov <ae...@post.ru>
* cse.c (FIXED_REGNO_P): Don't check global_regs. Use fixed_reg_set
instead of fixed_regs.
* df-problems.c (can_move_insns_across): Ditto.
* postreload.c (reload_combine_recognize_pattern): Ditto.
* recog.c (peep2_find_free_register): Ditto.
* regcprop.c (copy_value): Ditto.
* regrename.c (check_new_reg_p, rename_chains): Ditto.
* sel-sched.c (init_regs_for_mode, mark_unavailable_hard_regs): Ditto.
Index: gcc/cse.c
===================================================================
--- gcc/cse.c (revision 226953)
+++ gcc/cse.c (working copy)
@@ -463,7 +463,7 @@
A reg wins if it is either the frame pointer or designated as fixed. */
#define FIXED_REGNO_P(N) \
((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
- || fixed_regs[N] || global_regs[N])
+ || TEST_HARD_REG_BIT (fixed_reg_set, N))
/* Compute cost of X, as stored in the `cost' field of a table_elt. Fixed
hard registers and pointers into the frame are the cheapest with a cost
Index: gcc/df-problems.c
===================================================================
--- gcc/df-problems.c (revision 226953)
+++ gcc/df-problems.c (working copy)
@@ -3871,8 +3871,7 @@
EXECUTE_IF_SET_IN_BITMAP (merge_set, 0, i, bi)
{
if (i < FIRST_PSEUDO_REGISTER
- && ! fixed_regs[i]
- && ! global_regs[i])
+ && ! TEST_HARD_REG_BIT (fixed_reg_set, i))
{
fail = 1;
break;
Index: gcc/postreload.c
===================================================================
--- gcc/postreload.c (revision 226953)
+++ gcc/postreload.c (working copy)
@@ -1144,7 +1144,7 @@
&& reg_state[i].store_ruid <= reg_state[regno].use_ruid
&& (call_used_regs[i] || df_regs_ever_live_p (i))
&& (!frame_pointer_needed || i != HARD_FRAME_POINTER_REGNUM)
- && !fixed_regs[i] && !global_regs[i]
+ && !TEST_HARD_REG_BIT (fixed_reg_set, i)
&& hard_regno_nregs[i][GET_MODE (reg)] == 1
&& targetm.hard_regno_scratch_ok (i))
{
Index: gcc/recog.c
===================================================================
--- gcc/recog.c (revision 226953)
+++ gcc/recog.c (working copy)
@@ -3162,17 +3162,11 @@
for (j = 0; success && j < hard_regno_nregs[regno][mode]; j++)
{
/* Don't allocate fixed registers. */
- if (fixed_regs[regno + j])
+ if (TEST_HARD_REG_BIT (fixed_reg_set, regno + j))
{
success = 0;
break;
}
- /* Don't allocate global registers. */
- if (global_regs[regno + j])
- {
- success = 0;
- break;
- }
/* Make sure the register is of the right class. */
if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno + j))
{
Index: gcc/regcprop.c
===================================================================
--- gcc/regcprop.c (revision 226953)
+++ gcc/regcprop.c (working copy)
@@ -315,7 +315,7 @@
/* Do not propagate copies to fixed or global registers, patterns
can be relying to see particular fixed register or users can
expect the chosen global register in asm. */
- if (fixed_regs[dr] || global_regs[dr])
+ if (TEST_HARD_REG_BIT (fixed_reg_set, dr))
return;
/* If SRC and DEST overlap, don't record anything. */
Index: gcc/regrename.c
===================================================================
--- gcc/regrename.c (revision 226953)
+++ gcc/regrename.c (working copy)
@@ -311,8 +311,7 @@
for (i = nregs - 1; i >= 0; --i)
if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
- || fixed_regs[new_reg + i]
- || global_regs[new_reg + i]
+ || TEST_HARD_REG_BIT (fixed_reg_set, new_reg + i)
/* Can't use regs which aren't saved by the prologue. */
|| (! df_regs_ever_live_p (new_reg + i)
&& ! call_used_regs[new_reg + i])
@@ -440,7 +439,7 @@
if (this_head->cannot_rename)
continue;
- if (fixed_regs[reg] || global_regs[reg]
+ if (TEST_HARD_REG_BIT (fixed_reg_set, reg)
|| (!HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
&& reg == HARD_FRAME_POINTER_REGNUM)
|| (HARD_FRAME_POINTER_REGNUM && frame_pointer_needed
Index: gcc/sel-sched.c
===================================================================
--- gcc/sel-sched.c (revision 226953)
+++ gcc/sel-sched.c (working copy)
@@ -1089,8 +1089,7 @@
nregs = hard_regno_nregs[cur_reg][mode];
for (i = nregs - 1; i >= 0; --i)
- if (fixed_regs[cur_reg + i]
- || global_regs[cur_reg + i]
+ if (TEST_HARD_REG_BIT (fixed_reg_set, cur_reg + i)
/* Can't use regs which aren't saved by
the prologue. */
|| !TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, cur_reg + i)
@@ -1189,8 +1188,7 @@
/* Stop if the original register is one of the fixed_regs, global_regs or
frame pointer, or we could not discover its class. */
- if (fixed_regs[regno]
- || global_regs[regno]
+ if (TEST_HARD_REG_BIT (fixed_reg_set, regno)
|| (!HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
&& regno == HARD_FRAME_POINTER_REGNUM)
|| (HARD_FRAME_POINTER_REGNUM && frame_pointer_needed
Anatoly Sokolov.