]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
recog.c (preprocess_constraints): Don't skip disabled alternatives.
authorRichard Sandiford <rdsandiford@googlemail.com>
Wed, 4 Jun 2014 17:34:19 +0000 (17:34 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 4 Jun 2014 17:34:19 +0000 (17:34 +0000)
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.

From-SVN: r211239

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/ira-lives.c
gcc/recog.c

index c585b9395a69267cfefcdf104440d172461b1e7f..0cc10d25b6aabc9aaa87d31206eb6cf86a29b84b 100644 (file)
@@ -1,3 +1,11 @@
+2014-06-04  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * 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.
+
 2014-06-04  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * recog.h (alternative_class): New function.
index 21fa8f445b8bb8843564575403014932e2e4b4e4..e0e55d51cfd7ad92b8c8d6a8e8e3633d4973dac8 100644 (file)
@@ -5875,8 +5875,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
index 34d4175892ae7acbd470717b16a1c976240f7965..62e3768aea60a7e42d11fb7cda451d33fca3c257 100644 (file)
@@ -641,8 +641,11 @@ check_and_make_def_conflict (int alt, int def, enum reg_class def_cl)
       /* 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 (void)
 
   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 c4ab620711ccc64717d007bb68d02e40ee384b79..15e07527ba84c6e044981c31cbe19e9d69f9e31f 100644 (file)
@@ -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;