expr.c (store_expr): Don't generate load-store pair if TEMP is identical (according...
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Wed, 18 Nov 1998 14:15:03 +0000 (14:15 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Wed, 18 Nov 1998 14:15:03 +0000 (14:15 +0000)
* expr.c (store_expr): Don't generate load-store pair
if TEMP is identical (according to ==) with TARGET.

From-SVN: r23696

gcc/ChangeLog
gcc/expr.c

index bb0fe6bf6c8bb03b780c1edb18ca5c0391d51244..59cb65708b3ce78e77b4ff87b5dd88d460641dea 100644 (file)
@@ -1,3 +1,8 @@
+Wed Nov 18 22:13:00 1998  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * expr.c (store_expr): Don't generate load-store pair
+       if TEMP is identical (according to ==) with TARGET.
+
 Tue Nov 17 22:25:16 1998  J"orn Rennecke <amylaar@cygnus.co.uk>
 
        * reload1.c (reload_reg_free_for_value_p): When considered reload
index 1dd7cb718d6455e7efba688457a333c033947dc8..3d46dea3f22661b1f8c80761078b5a837f44f39b 100644 (file)
@@ -3676,10 +3676,21 @@ store_expr (exp, target, want_value)
 
   /* If value was not generated in the target, store it there.
      Convert the value to TARGET's type first if nec.  */
+  /* If TEMP and TARGET compare equal according to rtx_equal_p, but
+     one or both of them are volatile memory refs, we have to distinguish
+     two cases:
+     - expand_expr has used TARGET.  In this case, we must not generate
+       another copy.  This can be detected by TARGET being equal according
+       to == .
+     - expand_expr has not used TARGET - that means that the source just
+       happens to have the same RTX form.  Since temp will have been created
+       by expand_expr, it will compare unequal according to == .
+       We must generate a copy in this case, to reach the correct number
+       of volatile memory references.  */
 
   if ((! rtx_equal_p (temp, target)
-       || side_effects_p (temp)
-       || side_effects_p (target))
+       || (temp != target && (side_effects_p (temp)
+                             || side_effects_p (target))))
       && TREE_CODE (exp) != ERROR_MARK)
     {
       target = protect_from_queue (target, 1);