expr.c (store_expr): Add dont_store_target.
authorJakub Jelinek <jakub@redhat.com>
Tue, 13 Mar 2001 12:09:31 +0000 (13:09 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 13 Mar 2001 12:09:31 +0000 (13:09 +0100)
* expr.c (store_expr): Add dont_store_target.  If temp is already in
target before copying to reg, don't store it into target again.

From-SVN: r40437

gcc/ChangeLog
gcc/expr.c

index 2e3fa88eed7bcb85e5ad3ab73510fa15848549b7..6bde0bc234f9d8934773b28bd5fda525cb7b1c37 100644 (file)
@@ -1,3 +1,8 @@
+2001-03-13  Jakub Jelinek  <jakub@redhat.com>
+
+       * expr.c (store_expr): Add dont_store_target.  If temp is already in
+       target before copying to reg, don't store it into target again.
+
 2001-03-12  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * cppinternals.texi: Update for file handling.
index ff3f5bf354d7ad489527290bf7db1d828d48b0a3..382bb2349165444861dae9b72cc7f59121f3c5f9 100644 (file)
@@ -3905,6 +3905,7 @@ store_expr (exp, target, want_value)
 {
   register rtx temp;
   int dont_return_target = 0;
+  int dont_store_target = 0;
 
   if (TREE_CODE (exp) == COMPOUND_EXPR)
     {
@@ -3975,7 +3976,15 @@ store_expr (exp, target, want_value)
     {
       temp = expand_expr (exp, target, GET_MODE (target), 0);
       if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode)
-       temp = copy_to_reg (temp);
+       {
+         /* If TEMP is already in the desired TARGET, only copy it from
+            memory and don't store it there again.  */
+         if (temp == target
+             || (rtx_equal_p (temp, target)
+                 && ! side_effects_p (temp) && ! side_effects_p (target)))
+           dont_store_target = 1;
+         temp = copy_to_reg (temp);
+       }
       dont_return_target = 1;
     }
   else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
@@ -4105,7 +4114,8 @@ store_expr (exp, target, want_value)
   if ((! rtx_equal_p (temp, target)
        || (temp != target && (side_effects_p (temp)
                              || side_effects_p (target))))
-      && TREE_CODE (exp) != ERROR_MARK)
+      && TREE_CODE (exp) != ERROR_MARK
+      && ! dont_store_target)
     {
       target = protect_from_queue (target, 1);
       if (GET_MODE (temp) != GET_MODE (target)