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':

Reply via email to