expr.c (store_expr): If the lhs is a memory location pointed to be a postincremented...
authorCharles M. Hannum <root@ihack.net>
Wed, 6 Jan 1999 01:28:56 +0000 (18:28 -0700)
committerJeff Law <law@gcc.gnu.org>
Wed, 6 Jan 1999 01:28:56 +0000 (18:28 -0700)

        * expr.c (store_expr): If the lhs is a memory location pointed
        to be a postincremented (or postdecremented) pointer, always
        force the rhs to be evaluated into a pseudo.

From-SVN: r24507

gcc/expr.c

index 09a7eb1f16ad47c779ce7acd0b86606189dde3f3..496764244ece9d60aa9e8947e65f90e51dd808bf 100644 (file)
@@ -3528,21 +3528,6 @@ store_expr (exp, target, want_value)
 
       return want_value ? target : NULL_RTX;
     }
-  else if (want_value && GET_CODE (target) == MEM && ! MEM_VOLATILE_P (target)
-          && GET_MODE (target) != BLKmode)
-    /* If target is in memory and caller wants value in a register instead,
-       arrange that.  Pass TARGET as target for expand_expr so that,
-       if EXP is another assignment, WANT_VALUE will be nonzero for it.
-       We know expand_expr will not use the target in that case.
-       Don't do this if TARGET is volatile because we are supposed
-       to write it and then read it.  */
-    {
-      temp = expand_expr (exp, cse_not_expected ? NULL_RTX : target,
-                         GET_MODE (target), 0);
-      if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode)
-       temp = copy_to_reg (temp);
-      dont_return_target = 1;
-    }
   else if (queued_subexp_p (target))
     /* If target contains a postincrement, let's not risk
        using it as the place to generate the rhs.  */
@@ -3562,6 +3547,21 @@ store_expr (exp, target, want_value)
       if (! MEM_VOLATILE_P (target) && want_value)
        dont_return_target = 1;
     }
+  else if (want_value && GET_CODE (target) == MEM && ! MEM_VOLATILE_P (target)
+          && GET_MODE (target) != BLKmode)
+    /* If target is in memory and caller wants value in a register instead,
+       arrange that.  Pass TARGET as target for expand_expr so that,
+       if EXP is another assignment, WANT_VALUE will be nonzero for it.
+       We know expand_expr will not use the target in that case.
+       Don't do this if TARGET is volatile because we are supposed
+       to write it and then read it.  */
+    {
+      temp = expand_expr (exp, cse_not_expected ? NULL_RTX : target,
+                         GET_MODE (target), 0);
+      if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode)
+       temp = copy_to_reg (temp);
+      dont_return_target = 1;
+    }
   else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
     /* If this is an scalar in a register that is stored in a wider mode
        than the declared mode, compute the result into its declared mode