OSDN Git Service

PR inline-asm/6162
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Jan 2004 18:40:01 +0000 (18:40 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Jan 2004 18:40:01 +0000 (18:40 +0000)
* reload.c (find_reloads): Only support one pair of commutative
operands.

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

gcc/ChangeLog
gcc/reload.c

index 4493b21..2f8c480 100644 (file)
@@ -1,3 +1,9 @@
+2004-01-28  Ian Lance Taylor  <ian@wasabisystems.com>
+
+       PR inline-asm/6162
+       * reload.c (find_reloads): Only support one pair of commutative
+       operands.
+
 2004-01-29  Roger Sayle  <roger@eyesopen.com>
 
        PR java/13824
index 548aa7e..c1f2af9 100644 (file)
@@ -2605,7 +2605,17 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
              if (i == noperands - 1)
                abort ();
 
-             commutative = i;
+             /* We currently only support one commutative pair of
+                operands.  Some existing asm code currently uses more
+                than one pair.  Previously, that would usually work,
+                but sometimes it would crash the compiler.  We
+                continue supporting that case as well as we can by
+                silently ignoring all but the first pair.  In the
+                future we may handle it correctly.  */
+             if (commutative < 0)
+               commutative = i;
+             else if (!this_insn_is_asm)
+               abort ();
            }
          else if (ISDIGIT (c))
            {
@@ -2979,9 +2989,8 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
                break;
 
              case '%':
-               /* The last operand should not be marked commutative.  */
-               if (i != noperands - 1)
-                 commutative = i;
+               /* We only support one commutative marker, the first
+                  one.  We already set commutative above.  */
                break;
 
              case '?':