Hi, the constraint modifier % applies to all the alternatives of a pattern and hence is mostly added to the first constraint of an operand. IRA currently ignores it if the alternative with the % gets disabled by using the `enabled' attribute or if it is not among the preferred alternatives.
Fixed with the attached patch by moving the % check to the first loop which walks unconditionally over all the constraints. Ok for mainline? Bye, -Andreas- gcc/ChangeLog: 2015-12-14 Andreas Krebbel <kreb...@linux.vnet.ibm.com> * ira.c (ira_setup_alts): Move the scan for commutative modifier to the first loop to make it work even with disabled alternatives. diff --git a/gcc/ira.c b/gcc/ira.c index 97edf8c..9824e4a 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -1800,7 +1800,13 @@ ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts) { insn_constraints[nop * recog_data.n_alternatives + nalt] = p; while (*p && *p != ',') - p++; + { + /* We only support one commutative marker, the first + one. We already set commutative above. */ + if (*p == '%' && commutative < 0) + commutative = nop; + p++; + } if (*p) p++; } @@ -1831,11 +1837,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts) break; case '%': - /* We only support one commutative marker, the - first one. We already set commutative - above. */ - if (commutative < 0) - commutative = nop; + /* The commutative modifier is handled above. */ break; case '0': case '1': case '2': case '3': case '4':