[PATCH 1/5] Use alternative_mask for add_insn_allocno_copies
Richard Sandiford
richard.sandiford@arm.com
Fri Jun 21 13:40:00 GMT 2019
add_insn_allocno_copies and its subroutines used HARD_REG_SET to
represent a bitmask of alternatives. There's not really any connection
between the number of registers and the maximum number of alternatives,
so this patch uses alternative_mask instead (which wasn't around when
this code was added).
This is just a minor clean-up making way for later patches.
2019-06-21 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* ira-int.h (ira_setup_alts, ira_get_dup_out_num): Use
alternative_mask instead of HARD_REG_SET to represent a
bitmask of alternatives.
* ira.c (ira_setup_alts, ira_get_dup_out_num): Likewise.
* ira-conflicts.c (add_insn_allocno_copies): Likewise.
Index: gcc/ira-int.h
===================================================================
--- gcc/ira-int.h 2019-06-21 14:34:05.000000000 +0100
+++ gcc/ira-int.h 2019-06-21 14:34:05.883715050 +0100
@@ -963,8 +963,8 @@ extern void ira_print_disposition (FILE
extern void ira_debug_disposition (void);
extern void ira_debug_allocno_classes (void);
extern void ira_init_register_move_cost (machine_mode);
-extern void ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts);
-extern int ira_get_dup_out_num (int op_num, HARD_REG_SET &alts);
+extern alternative_mask ira_setup_alts (rtx_insn *);
+extern int ira_get_dup_out_num (int, alternative_mask);
/* ira-build.c */
Index: gcc/ira.c
===================================================================
--- gcc/ira.c 2019-06-21 14:34:05.000000000 +0100
+++ gcc/ira.c 2019-06-21 14:34:05.887715020 +0100
@@ -1784,9 +1784,12 @@ setup_prohibited_mode_move_regs (void)
-/* Setup possible alternatives in ALTS for INSN. */
-void
-ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts)
+/* Extract INSN and return the set of alternatives that we should consider.
+ This excludes any alternatives whose constraints are obviously impossible
+ to meet (e.g. because the constraint requires a constant and the operand
+ is nonconstant). */
+alternative_mask
+ira_setup_alts (rtx_insn *insn)
{
/* MAP nalt * nop -> start of constraints for given operand and
alternative. */
@@ -1798,7 +1801,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
extract_insn (insn);
alternative_mask preferred = get_preferred_alternatives (insn);
- CLEAR_HARD_REG_SET (alts);
+ alternative_mask alts = 0;
insn_constraints.release ();
insn_constraints.safe_grow_cleared (recog_data.n_operands
* recog_data.n_alternatives + 1);
@@ -1833,8 +1836,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
}
for (nalt = 0; nalt < recog_data.n_alternatives; nalt++)
{
- if (!TEST_BIT (preferred, nalt)
- || TEST_HARD_REG_BIT (alts, nalt))
+ if (!TEST_BIT (preferred, nalt) || TEST_BIT (alts, nalt))
continue;
for (nop = 0; nop < recog_data.n_operands; nop++)
@@ -1906,7 +1908,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
;
}
if (nop >= recog_data.n_operands)
- SET_HARD_REG_BIT (alts, nalt);
+ alts |= ALTERNATIVE_BIT (nalt);
}
if (commutative < 0)
break;
@@ -1916,6 +1918,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
if (curr_swapped)
break;
}
+ return alts;
}
/* Return the number of the output non-early clobber operand which
@@ -1923,7 +1926,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
negative value if there is no such operand). The function takes
only really possible alternatives into consideration. */
int
-ira_get_dup_out_num (int op_num, HARD_REG_SET &alts)
+ira_get_dup_out_num (int op_num, alternative_mask alts)
{
int curr_alt, c, original, dup;
bool ignore_p, use_commut_op_p;
@@ -1940,7 +1943,7 @@ ira_get_dup_out_num (int op_num, HARD_RE
{
rtx op = recog_data.operand[op_num];
- for (curr_alt = 0, ignore_p = !TEST_HARD_REG_BIT (alts, curr_alt),
+ for (curr_alt = 0, ignore_p = !TEST_BIT (alts, curr_alt),
original = -1;;)
{
c = *str;
@@ -1951,7 +1954,7 @@ ira_get_dup_out_num (int op_num, HARD_RE
else if (c == ',')
{
curr_alt++;
- ignore_p = !TEST_HARD_REG_BIT (alts, curr_alt);
+ ignore_p = !TEST_BIT (alts, curr_alt);
}
else if (! ignore_p)
switch (c)
Index: gcc/ira-conflicts.c
===================================================================
--- gcc/ira-conflicts.c 2019-06-21 14:34:05.000000000 +0100
+++ gcc/ira-conflicts.c 2019-06-21 14:34:05.883715050 +0100
@@ -358,7 +358,7 @@ add_insn_allocno_copies (rtx_insn *insn)
rtx set, operand, dup;
bool bound_p[MAX_RECOG_OPERANDS];
int i, n, freq;
- HARD_REG_SET alts;
+ alternative_mask alts;
freq = REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn));
if (freq == 0)
@@ -379,7 +379,7 @@ add_insn_allocno_copies (rtx_insn *insn)
there are no dead registers, there will be no such copies. */
if (! find_reg_note (insn, REG_DEAD, NULL_RTX))
return;
- ira_setup_alts (insn, alts);
+ alts = ira_setup_alts (insn);
for (i = 0; i < recog_data.n_operands; i++)
bound_p[i] = false;
for (i = 0; i < recog_data.n_operands; i++)
More information about the Gcc-patches
mailing list