aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2014-05-30 07:35:47 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-05-30 07:35:47 +0000
commit98f2f031af6c7a215c607702036195dcc8faaf86 (patch)
tree355ba26239f6abd8173627db18edbe081b68b586 /gcc
parent3901578cd6f259ef124bc0492a030efbd117ef96 (diff)
downloadgcc-98f2f031af6c7a215c607702036195dcc8faaf86.zip
gcc-98f2f031af6c7a215c607702036195dcc8faaf86.tar.gz
gcc-98f2f031af6c7a215c607702036195dcc8faaf86.tar.bz2
ira.c (ira_get_dup_out_num): Check for output operands at the start of the loop.
gcc/ * ira.c (ira_get_dup_out_num): Check for output operands at the start of the loop. Handle cases where an included alternative follows an excluded one. From-SVN: r211072
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ira.c16
2 files changed, 14 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 30aaf18..a0d75fe 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-05-30 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * ira.c (ira_get_dup_out_num): Check for output operands at
+ the start of the loop. Handle cases where an included alternative
+ follows an excluded one.
+
2014-05-29 Mike Stump <mikestump@comcast.net>
PR debug/61352
diff --git a/gcc/ira.c b/gcc/ira.c
index 26d017e..eebd410 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1979,33 +1979,33 @@ ira_get_dup_out_num (int op_num, HARD_REG_SET &alts)
if (op_num < 0 || recog_data.n_alternatives == 0)
return -1;
- use_commut_op_p = false;
+ /* We should find duplications only for input operands. */
+ if (recog_data.operand_type[op_num] != OP_IN)
+ return -1;
str = recog_data.constraints[op_num];
+ use_commut_op_p = false;
for (;;)
{
#ifdef EXTRA_CONSTRAINT_STR
op = recog_data.operand[op_num];
#endif
- for (ignore_p = false, original = -1, curr_alt = 0;;)
+ for (curr_alt = 0, ignore_p = !TEST_HARD_REG_BIT (alts, curr_alt),
+ original = -1;;)
{
c = *str;
if (c == '\0')
break;
- if (c == '#' || !TEST_HARD_REG_BIT (alts, curr_alt))
+ if (c == '#')
ignore_p = true;
else if (c == ',')
{
curr_alt++;
- ignore_p = false;
+ ignore_p = !TEST_HARD_REG_BIT (alts, curr_alt);
}
else if (! ignore_p)
switch (c)
{
- /* We should find duplications only for input operands. */
- case '=':
- case '+':
- goto fail;
case 'X':
case 'p':
case 'g':