Fix queueing related bugs
authorBernd Schmidt <bernds@redhat.com>
Thu, 17 May 2001 17:02:35 +0000 (17:02 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Thu, 17 May 2001 17:02:35 +0000 (17:02 +0000)
From-SVN: r42206

gcc/ChangeLog
gcc/expr.c

index 6f7e0731c58fbf2327e00f52a51cd054eff968df..b256242e0ee909b6380289ec9b7f1126be34ea21 100644 (file)
@@ -1,3 +1,10 @@
+2001-05-17  Bernd Schmidt  <bernds@redhat.com>
+
+       * expr.c (protect_from_queue): Protect against subsequent calls to
+       emit_queue.
+       (expand_expr, case ADDR_EXPR): Prevent protect_from_queue from being
+       too clever.
+
 Thu May 17 18:17:34 CEST 2001  Jan Hubicka  <jh@suse.cz>
 
        * simplify_rtx.c (simplify_subreg): Fix simplification of nested subregs.
index 0f75b6912f99d4fccc71725f03efadefecb884d8..beafdfdec0f5f24c65fbd3829d6cf21be96665a9 100644 (file)
@@ -396,6 +396,9 @@ protect_from_queue (x, modify)
                                QUEUED_INSN (y));
              return temp;
            }
+         /* Copy the address into a pseudo, so that the returned value
+            remains correct across calls to emit_queue.  */
+         XEXP (new, 0) = copy_to_reg (XEXP (new, 0));
          return new;
        }
       /* Otherwise, recursively protect the subexpressions of all
@@ -422,9 +425,11 @@ protect_from_queue (x, modify)
        }
       return x;
     }
-  /* If the increment has not happened, use the variable itself.  */
+  /* If the increment has not happened, use the variable itself.  Copy it
+     into a new pseudo so that the value remains correct across calls to
+     emit_queue.  */
   if (QUEUED_INSN (x) == 0)
-    return QUEUED_VAR (x);
+    return copy_to_reg (QUEUED_VAR (x));
   /* If the increment has happened and a pre-increment copy exists,
      use that copy.  */
   if (QUEUED_COPY (x) != 0)
@@ -8588,7 +8593,9 @@ expand_expr (exp, target, tmode, modifier)
          if (ignore)
            return op0;
 
-         op0 = protect_from_queue (op0, 0);
+         /* Pass 1 for MODIFY, so that protect_from_queue doesn't get
+            clever and returns a REG when given a MEM.  */
+         op0 = protect_from_queue (op0, 1);
 
          /* We would like the object in memory.  If it is a constant, we can
             have it be statically allocated into memory.  For a non-constant,