(protect_from_queue): If (MEM (QUEUED ...)), modify a new MEM instead
authorRichard Kenner <kenner@gcc.gnu.org>
Tue, 11 Jan 1994 00:23:47 +0000 (19:23 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Tue, 11 Jan 1994 00:23:47 +0000 (19:23 -0500)
of the one we were passed.

From-SVN: r6375

gcc/expr.c

index 97272a3a627b36d09a8a70ab5560dd6ec887b0ca..7361503ea06c3a310d9b761252cf78b3fbf10e5c 100644 (file)
@@ -416,24 +416,29 @@ protect_from_queue (x, modify)
 
   if (code != QUEUED)
     {
-      /* A special hack for read access to (MEM (QUEUED ...))
-        to facilitate use of autoincrement.
-        Make a copy of the contents of the memory location
-        rather than a copy of the address, but not
-        if the value is of mode BLKmode.  */
+      /* A special hack for read access to (MEM (QUEUED ...)) to facilitate
+        use of autoincrement.  Make a copy of the contents of the memory
+        location rather than a copy of the address, but not if the value is
+        of mode BLKmode.  Don't modify X in place since it might be
+        shared.  */
       if (code == MEM && GET_MODE (x) != BLKmode
          && GET_CODE (XEXP (x, 0)) == QUEUED && !modify)
        {
          register rtx y = XEXP (x, 0);
-         XEXP (x, 0) = QUEUED_VAR (y);
+         register rtx new = gen_rtx (MEM, GET_MODE (x), QUEUED_VAR (y));
+
+         MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
+         RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
+         MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
+
          if (QUEUED_INSN (y))
            {
-             register rtx temp = gen_reg_rtx (GET_MODE (x));
-             emit_insn_before (gen_move_insn (temp, x),
+             register rtx temp = gen_reg_rtx (GET_MODE (new));
+             emit_insn_before (gen_move_insn (temp, new),
                                QUEUED_INSN (y));
              return temp;
            }
-         return x;
+         return new;
        }
       /* Otherwise, recursively protect the subexpressions of all
         the kinds of rtx's that can contain a QUEUED.  */