+2019-07-01 Richard Sandiford <richard.sandiford@arm.com>
+
+ * 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.
+
2019-07-01 Martin Liska <mliska@suse.cz>
* edit-context.c (test_applying_fixits_unreadable_file): Do not
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)
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++)
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 */
\f
-/* 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. */
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);
}
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++)
;
}
if (nop >= recog_data.n_operands)
- SET_HARD_REG_BIT (alts, nalt);
+ alts |= ALTERNATIVE_BIT (nalt);
}
if (commutative < 0)
break;
if (curr_swapped)
break;
}
+ return alts;
}
/* Return the number of the output non-early clobber operand which
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;
{
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;
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)