This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 3/5] Make recog_op_alt consumers check the enabled attribute
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: Jeff Law <law at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 31 May 2014 10:15:04 +0100
- Subject: [PATCH 3/5] Make recog_op_alt consumers check the enabled attribute
- Authentication-results: sourceware.org; auth=none
- References: <87egzokglh dot fsf at talisman dot default> <537B9911 dot 7070604 at redhat dot com> <87mwdyfhhg dot fsf_-_ at talisman dot default>
As described in the covering note, it seems better to put the onus of
checking the enabled attribute on the passes that are walking each
alternative, like LRA does for its internal subpasses. That leads
to a nicer interface in patch 4 and would make it easier to precompute
the information at build time. (The only thing preventing that now is
the subunion class.)
Thanks,
Richard
gcc/
* recog.c (preprocess_constraints): Don't skip disabled alternatives.
* ira-lives.c (check_and_make_def_conflict): Check for disabled
alternatives.
(make_early_clobber_and_input_conflicts): Likewise.
* config/i386/i386.c (ix86_legitimate_combined_insn): Likewise.
Index: gcc/recog.c
===================================================================
--- gcc/recog.c 2014-05-31 08:57:57.642085058 +0100
+++ gcc/recog.c 2014-05-31 09:07:21.669714878 +0100
@@ -2352,12 +2352,6 @@ preprocess_constraints (void)
op_alt[i].matches = -1;
op_alt[i].matched = -1;
- if (!TEST_BIT (recog_data.enabled_alternatives, j))
- {
- p = skip_alternative (p);
- continue;
- }
-
if (*p == '\0' || *p == ',')
{
op_alt[i].anything_ok = 1;
Index: gcc/ira-lives.c
===================================================================
--- gcc/ira-lives.c 2014-05-31 08:54:12.238234755 +0100
+++ gcc/ira-lives.c 2014-05-31 09:07:21.670714886 +0100
@@ -641,8 +641,11 @@ check_and_make_def_conflict (int alt, in
/* If there's any alternative that allows USE to match DEF, do not
record a conflict. If that causes us to create an invalid
instruction due to the earlyclobber, reload must fix it up. */
+ alternative_mask enabled = recog_data.enabled_alternatives;
for (alt1 = 0; alt1 < recog_data.n_alternatives; alt1++)
{
+ if (!TEST_BIT (enabled, alt1))
+ continue;
operand_alternative *op_alt1 = &recog_op_alt[alt1 * n_operands];
if (op_alt1[use].matches == def
|| (use < n_operands - 1
@@ -688,30 +691,32 @@ make_early_clobber_and_input_conflicts (
int n_alternatives = recog_data.n_alternatives;
int n_operands = recog_data.n_operands;
+ alternative_mask enabled = recog_data.enabled_alternatives;
operand_alternative *op_alt = recog_op_alt;
for (alt = 0; alt < n_alternatives; alt++, op_alt += n_operands)
- for (def = 0; def < n_operands; def++)
- {
- def_cl = NO_REGS;
- if (op_alt[def].earlyclobber)
- {
- if (op_alt[def].anything_ok)
- def_cl = ALL_REGS;
- else
- def_cl = op_alt[def].cl;
- check_and_make_def_conflict (alt, def, def_cl);
- }
- if ((def_match = op_alt[def].matches) >= 0
- && (op_alt[def_match].earlyclobber
- || op_alt[def].earlyclobber))
- {
- if (op_alt[def_match].anything_ok)
- def_cl = ALL_REGS;
- else
- def_cl = op_alt[def_match].cl;
- check_and_make_def_conflict (alt, def, def_cl);
- }
- }
+ if (TEST_BIT (enabled, alt))
+ for (def = 0; def < n_operands; def++)
+ {
+ def_cl = NO_REGS;
+ if (op_alt[def].earlyclobber)
+ {
+ if (op_alt[def].anything_ok)
+ def_cl = ALL_REGS;
+ else
+ def_cl = op_alt[def].cl;
+ check_and_make_def_conflict (alt, def, def_cl);
+ }
+ if ((def_match = op_alt[def].matches) >= 0
+ && (op_alt[def_match].earlyclobber
+ || op_alt[def].earlyclobber))
+ {
+ if (op_alt[def_match].anything_ok)
+ def_cl = ALL_REGS;
+ else
+ def_cl = op_alt[def_match].cl;
+ check_and_make_def_conflict (alt, def, def_cl);
+ }
+ }
}
/* Mark early clobber hard registers of the current INSN as live (if
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c 2014-05-31 08:54:12.236234739 +0100
+++ gcc/config/i386/i386.c 2014-05-31 09:07:21.682714985 +0100
@@ -5874,8 +5874,11 @@ ix86_legitimate_combined_insn (rtx insn)
/* Operand has no constraints, anything is OK. */
win = !n_alternatives;
+ alternative_mask enabled = recog_data.enabled_alternatives;
for (j = 0; j < n_alternatives; j++, op_alt += n_operands)
{
+ if (!TEST_BIT (enabled, j))
+ continue;
if (op_alt[i].anything_ok
|| (op_alt[i].matches != -1
&& operands_match_p