OSDN Git Service

PR middle-end/6279
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Apr 2002 06:09:39 +0000 (06:09 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Apr 2002 06:09:39 +0000 (06:09 +0000)
* expr.c (store_expr): Don't copy if DECL_RTL (exp) == target.

* expr.c (safe_from_p): Cleanup: use DECL_RTL_IF_SET.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52356 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c

index 8362777..6fc0b24 100644 (file)
@@ -1,3 +1,10 @@
+2002-04-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/6279
+       * expr.c (store_expr): Don't copy if DECL_RTL (exp) == target.
+
+       * expr.c (safe_from_p): Cleanup: use DECL_RTL_IF_SET.
+
 2002-04-15  Richard Henderson  <rth@redhat.com>
 
        * config/mips/abi64.h (SUBTARGET_CONDITIONAL_REGISTER_USAGE): Set
index c5b1ece..55002af 100644 (file)
@@ -4125,7 +4125,12 @@ store_expr (exp, target, want_value)
        || (temp != target && (side_effects_p (temp)
                              || side_effects_p (target))))
       && TREE_CODE (exp) != ERROR_MARK
-      && ! dont_store_target)
+      && ! dont_store_target
+        /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET,
+           but TARGET is not valid memory reference, TEMP will differ
+           from TARGET although it is really the same location.  */
+      && (TREE_CODE_CLASS (TREE_CODE (exp)) != 'd'
+         || target != DECL_RTL_IF_SET (exp)))
     {
       target = protect_from_queue (target, 1);
       if (GET_MODE (temp) != GET_MODE (target)
@@ -5598,7 +5603,7 @@ safe_from_p (x, exp, top_p)
   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
     {
     case 'd':
-      exp_rtl = DECL_RTL_SET_P (exp) ? DECL_RTL (exp) : NULL_RTX;
+      exp_rtl = DECL_RTL_IF_SET (exp);
       break;
 
     case 'c':