OSDN Git Service

* recog.c (constrain_operands): Only look for earlyclobber operand
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Jan 2005 21:14:44 +0000 (21:14 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Jan 2005 21:14:44 +0000 (21:14 +0000)
conflicts if an '&' constraint was seen.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94493 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/recog.c

index 7591aec..76e28d1 100644 (file)
@@ -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
index 4dfdca1..28b2410 100644 (file)
@@ -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.  */