]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
expr.c (store_expr): Don't generate load-store pair if TEMP is identical (according...
authorJeffrey A Law <law@cygnus.com>
Thu, 11 Feb 1999 00:57:47 +0000 (00:57 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 11 Feb 1999 00:57:47 +0000 (17:57 -0700)
        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.
Bring over from the mainline tree.  Fixes bugs with volatile memory references
being read/written too many times.

From-SVN: r25151

gcc/ChangeLog
gcc/expr.c

index cd635564a26b80e4e25478860bcb3cba8e913334..17cbbf102acde653427b7df5a11873d1a452fea0 100644 (file)
@@ -1,3 +1,9 @@
+Thu Feb 11 01:53:10 1999  Jeffrey A Law  (law@cygnus.com)
+
+       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.
+
 Thu Feb 11 01:06:49 1999  Nathan Sidwell  <nathan@acm.org>
 
        * fold-const.c (range_binop): Take account of the bounded nature
index 706718dcab465b0de05ffdd5b4afd28e20abf015..f88d5edfbd62cbeb39d4635ea7eab4b9e300d466 100644 (file)
@@ -3457,10 +3457,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);