aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/recog.c9
2 files changed, 12 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7591aec..76e28d1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-31 Steven Bosscher <stevenb@suse.de>
+
+ * recog.c (constrain_operands): Only look for earlyclobber operand
+ conflicts if an '&' constraint was seen.
+
2005-01-31 Marc Espie <espie@openbsd.org>
* config.gcc: Don't include embedded systems fragment, switches default
diff --git a/gcc/recog.c b/gcc/recog.c
index 4dfdca1..28b2410 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -2233,6 +2233,7 @@ constrain_operands (int strict)
do
{
+ int seen_earlyclobber_at = -1;
int opno;
int lose = 0;
funny_match_index = 0;
@@ -2295,6 +2296,8 @@ constrain_operands (int strict)
case '&':
earlyclobber[opno] = 1;
+ if (seen_earlyclobber_at < 0)
+ seen_earlyclobber_at = opno;
break;
case '0': case '1': case '2': case '3': case '4':
@@ -2543,8 +2546,10 @@ constrain_operands (int strict)
/* See if any earlyclobber operand conflicts with some other
operand. */
- if (strict > 0)
- for (eopno = 0; eopno < recog_data.n_operands; eopno++)
+ if (strict > 0 && seen_earlyclobber_at >= 0)
+ for (eopno = seen_earlyclobber_at;
+ eopno < recog_data.n_operands;
+ eopno++)
/* Ignore earlyclobber operands now in memory,
because we would often report failure when we have
two memory operands, one of which was formerly a REG. */