Commit 1c86bd80 by Vladimir Makarov Committed by Vladimir Makarov

re PR inline-asm/56148 (inline asm matching constraint with different mode)

2013-02-12  Vladimir Makarov  <vmakarov@redhat.com>

	PR inline-asm/56148
	* lra-constraints.c (process_alt_operands): Match early clobber
	operand with itself.  Check conflicts with earlyclobner only if
	the operand is not reloaded.  Prefer to reload conflicting operand
	if earlyclobber and matching operands are the same.

2013-02-12  Vladimir Makarov  <vmakarov@redhat.com>

	PR inline-asm/56148
	* gcc.target/i386/pr56148.c: New test.

From-SVN: r195988
parent 1f8aec00
2013-02-12 Vladimir Makarov <vmakarov@redhat.com>
PR inline-asm/56148
* lra-constraints.c (process_alt_operands): Match early clobber
operand with itself. Check conflicts with earlyclobner only if
the operand is not reloaded. Prefer to reload conflicting operand
if earlyclobber and matching operands are the same.
2013-02-12 Richard Biener <rguenther@suse.de> 2013-02-12 Richard Biener <rguenther@suse.de>
PR lto/56297 PR lto/56297
......
...@@ -1533,8 +1533,8 @@ process_alt_operands (int only_alternative) ...@@ -1533,8 +1533,8 @@ process_alt_operands (int only_alternative)
if (! curr_static_id->operand[m].early_clobber if (! curr_static_id->operand[m].early_clobber
|| operand_reg[nop] == NULL_RTX || operand_reg[nop] == NULL_RTX
|| (find_regno_note (curr_insn, REG_DEAD, || (find_regno_note (curr_insn, REG_DEAD,
REGNO (operand_reg[nop])) REGNO (op))
!= NULL_RTX)) || REGNO (op) == REGNO (operand_reg[m])))
match_p = true; match_p = true;
} }
if (match_p) if (match_p)
...@@ -2059,6 +2059,7 @@ process_alt_operands (int only_alternative) ...@@ -2059,6 +2059,7 @@ process_alt_operands (int only_alternative)
if ((! curr_alt_win[i] && ! curr_alt_match_win[i]) if ((! curr_alt_win[i] && ! curr_alt_match_win[i])
|| hard_regno[i] < 0) || hard_regno[i] < 0)
continue; continue;
lra_assert (operand_reg[i] != NULL_RTX);
clobbered_hard_regno = hard_regno[i]; clobbered_hard_regno = hard_regno[i];
CLEAR_HARD_REG_SET (temp_set); CLEAR_HARD_REG_SET (temp_set);
add_to_hard_reg_set (&temp_set, biggest_mode[i], clobbered_hard_regno); add_to_hard_reg_set (&temp_set, biggest_mode[i], clobbered_hard_regno);
...@@ -2073,30 +2074,49 @@ process_alt_operands (int only_alternative) ...@@ -2073,30 +2074,49 @@ process_alt_operands (int only_alternative)
else if ((curr_alt_matches[j] == i && curr_alt_match_win[j]) else if ((curr_alt_matches[j] == i && curr_alt_match_win[j])
|| (curr_alt_matches[i] == j && curr_alt_match_win[i])) || (curr_alt_matches[i] == j && curr_alt_match_win[i]))
continue; continue;
else if (uses_hard_regs_p (*curr_id->operand_loc[j], temp_set)) /* 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; break;
if (j >= n_operands) if (j >= n_operands)
continue; continue;
/* We need to reload early clobbered register. */ /* If earlyclobber operand conflicts with another
for (j = 0; j < n_operands; j++) non-matching operand which is actually the same register
if (curr_alt_matches[j] == i) as the earlyclobber operand, it is better to reload the
{ another operand as an operand matching the earlyclobber
curr_alt_match_win[j] = false; operand can be also the same. */
losers++; if (operand_reg[j] != NULL_RTX && ! curr_alt_match_win[j]
overall += LRA_LOSER_COST_FACTOR; && REGNO (operand_reg[i]) == REGNO (operand_reg[j]))
} {
if (! curr_alt_match_win[i]) curr_alt_win[j] = false;
curr_alt_dont_inherit_ops[curr_alt_dont_inherit_ops_num++] = i; curr_alt_dont_inherit_ops[curr_alt_dont_inherit_ops_num++] = j;
losers++;
overall += LRA_LOSER_COST_FACTOR;
}
else else
{ {
/* Remember pseudos used for match reloads are never /* We need to reload early clobbered register and the
inherited. */ matched registers. */
lra_assert (curr_alt_matches[i] >= 0); for (j = 0; j < n_operands; j++)
curr_alt_win[curr_alt_matches[i]] = false; if (curr_alt_matches[j] == i)
{
curr_alt_match_win[j] = false;
losers++;
overall += LRA_LOSER_COST_FACTOR;
}
if (! curr_alt_match_win[i])
curr_alt_dont_inherit_ops[curr_alt_dont_inherit_ops_num++] = i;
else
{
/* Remember pseudos used for match reloads are never
inherited. */
lra_assert (curr_alt_matches[i] >= 0);
curr_alt_win[curr_alt_matches[i]] = false;
}
curr_alt_win[i] = curr_alt_match_win[i] = false;
losers++;
overall += LRA_LOSER_COST_FACTOR;
} }
curr_alt_win[i] = curr_alt_match_win[i] = false;
losers++;
overall += LRA_LOSER_COST_FACTOR;
} }
small_class_operands_num = 0; small_class_operands_num = 0;
for (nop = 0; nop < n_operands; nop++) for (nop = 0; nop < n_operands; nop++)
......
2013-02-12 Vladimir Makarov <vmakarov@redhat.com>
PR inline-asm/56148
* gcc.target/i386/pr56148.c: New test.
2013-02-12 Dominique d'Humieres <dominiq@lps.ens.fr> 2013-02-12 Dominique d'Humieres <dominiq@lps.ens.fr>
Tobias Burnus <burnus@net-b.de> Tobias Burnus <burnus@net-b.de>
......
/* PR inline-asm/56148 */
/* { dg-do compile } */
/* { dg-options "-O2" } */
void
foo (void)
{
unsigned char e[16];
unsigned long a, b, c, d;
__asm__ __volatile__ ("" : "=d" (a), "=&c" (c), "=&D" (d), "=&a" (b)
: "0" (-1U), "mr" (e), "1" (128 >> 5), "2" (e), "3" (-1U));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment