OSDN Git Service

* expr.c (store_expr): Promote all MEM intermediates to regs.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Jan 2003 06:53:07 +0000 (06:53 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Jan 2003 06:53:07 +0000 (06:53 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@62173 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/expr.c

index 99f3898..8d1fd4d 100644 (file)
@@ -4398,12 +4398,12 @@ store_expr (exp, target, want_value)
 
       temp = expand_expr (exp, inner_target, VOIDmode, 0);
 
-      /* If TEMP is a volatile MEM and we want a result value, make
-        the access now so it gets done only once.  Likewise if
-        it contains TARGET.  */
-      if (GET_CODE (temp) == MEM && want_value
-         && (MEM_VOLATILE_P (temp)
-             || reg_mentioned_p (SUBREG_REG (target), XEXP (temp, 0))))
+      /* If TEMP is a MEM and we want a result value, make the access
+        now so it gets done only once.  Strictly speaking, this is 
+        only necessary if the MEM is volatile, or if the address 
+        overlaps TARGET.  But not performing the load twice also
+        reduces the amount of rtl we generate and then have to CSE.  */
+      if (GET_CODE (temp) == MEM && want_value)
        temp = copy_to_reg (temp);
 
       /* If TEMP is a VOIDmode constant, use convert_modes to make