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