re PR inline-asm/56148 (inline asm matching constraint with different mode)
authorVladimir Makarov <vmakarov@redhat.com>
Fri, 22 Feb 2013 16:30:22 +0000 (16:30 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Fri, 22 Feb 2013 16:30:22 +0000 (16:30 +0000)
2013-02-22  Vladimir Makarov  <vmakarov@redhat.com>

PR inline-asm/56148
* lra-constraints.c (process_alt_operands): Reload operand
conflicting with earlier clobber only if no more other conflicting
operands.

From-SVN: r196223

gcc/ChangeLog
gcc/lra-constraints.c

index e7cd74931d91663c5bbc9c361bc70e98a612e4e3..2b2180c15aea2e326f80a693f528ebb8a91edd53 100644 (file)
@@ -1,3 +1,10 @@
+2013-02-22  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR inline-asm/56148
+       * lra-constraints.c (process_alt_operands): Reload operand
+       conflicting with earlier clobber only if no more other conflicting
+       operands.
+
 2013-02-22  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/56393
index d3f4420b6a0013b9a267dfc28657fcfffbf1775f..e3b4add9f18bf51023b19a5ad263d389e89c3c2c 100644 (file)
@@ -2052,7 +2052,7 @@ process_alt_operands (int only_alternative)
       curr_alt_dont_inherit_ops_num = 0;
       for (nop = 0; nop < early_clobbered_regs_num; nop++)
        {
-         int i, j, clobbered_hard_regno;
+         int i, j, clobbered_hard_regno, first_conflict_j, last_conflict_j;
          HARD_REG_SET temp_set;
 
          i = early_clobbered_nops[nop];
@@ -2063,6 +2063,7 @@ process_alt_operands (int only_alternative)
          clobbered_hard_regno = hard_regno[i];
          CLEAR_HARD_REG_SET (temp_set);
          add_to_hard_reg_set (&temp_set, biggest_mode[i], clobbered_hard_regno);
+         first_conflict_j = last_conflict_j = -1;
          for (j = 0; j < n_operands; j++)
            if (j == i
                /* We don't want process insides of match_operator and
@@ -2077,19 +2078,26 @@ process_alt_operands (int only_alternative)
            /* If we don't reload j-th operand, check conflicts.  */
            else if ((curr_alt_win[j] || curr_alt_match_win[j])
                     && uses_hard_regs_p (*curr_id->operand_loc[j], temp_set))
-             break;
-         if (j >= n_operands)
+             {
+               if (first_conflict_j < 0)
+                 first_conflict_j = j;
+               last_conflict_j = j;
+             }
+         if (last_conflict_j < 0)
            continue;
          /* If earlyclobber operand conflicts with another
             non-matching operand which is actually the same register
             as the earlyclobber operand, it is better to reload the
             another operand as an operand matching the earlyclobber
             operand can be also the same.  */
-         if (operand_reg[j] != NULL_RTX && ! curr_alt_match_win[j]
-             && REGNO (operand_reg[i]) == REGNO (operand_reg[j]))
+         if (first_conflict_j == last_conflict_j
+             && operand_reg[last_conflict_j]
+             != NULL_RTX && ! curr_alt_match_win[last_conflict_j]
+             && REGNO (operand_reg[i]) == REGNO (operand_reg[last_conflict_j]))
            {
-             curr_alt_win[j] = false;
-             curr_alt_dont_inherit_ops[curr_alt_dont_inherit_ops_num++] = j;
+             curr_alt_win[last_conflict_j] = false;
+             curr_alt_dont_inherit_ops[curr_alt_dont_inherit_ops_num++]
+               = last_conflict_j;
              losers++;
              overall += LRA_LOSER_COST_FACTOR;
            }