gcse.c (compute_ld_motion_mems): For MEM destinations...
authorHans-Peter Nilsson <hp@bitrange.com>
Fri, 18 Apr 2003 01:29:19 +0000 (01:29 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Fri, 18 Apr 2003 01:29:19 +0000 (01:29 +0000)
* gcse.c (compute_ld_motion_mems): For MEM destinations, only
consider those to be movable where the source matches
want_to_gcse_p.
(update_ld_motion_stores): In comment, refer to
compute_ld_motion_mems for validity of replacement.

From-SVN: r65766

gcc/ChangeLog
gcc/gcse.c

index f128fe5ecde2f19dd532f36a59a7313e74c1f455..abbec33da066af879d601485eecbde693ecbc37a 100644 (file)
@@ -1,3 +1,11 @@
+2003-04-18  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * gcse.c (compute_ld_motion_mems): For MEM destinations, only
+       consider those to be movable where the source matches
+       want_to_gcse_p.
+       (update_ld_motion_stores): In comment, refer to
+       compute_ld_motion_mems for validity of replacement.
+
 Fri Apr 18 01:28:51 CEST 2003  Jan Hubicka  <jh@suse.cz>
 
        * gcov-dump.c (tag_summary): Remove max_sum
index da4632cb0aa0a7923e5cded7a267f81016762c66..528aaca9980b20aeead00468af21c1d34c9bde93 100644 (file)
@@ -6771,11 +6771,13 @@ invalidate_any_buried_refs (x)
     }
 }
 
-/* Find all the 'simple' MEMs which are used in LOADs and STORES. Simple
-   being defined as MEM loads and stores to symbols, with no
-   side effects and no registers in the expression. If there are any
-   uses/defs which don't match this criteria, it is invalidated and
-   trimmed out later.  */
+/* Find all the 'simple' MEMs which are used in LOADs and STORES.  Simple
+   being defined as MEM loads and stores to symbols, with no side effects
+   and no registers in the expression.  For a MEM destination, we also
+   check that the insn is still valid if we replace the destination with a
+   REG, as is done in update_ld_motion_stores.  If there are any uses/defs
+   which don't match this criteria, they are invalidated and trimmed out
+   later.  */
 
 static void
 compute_ld_motion_mems ()
@@ -6823,7 +6825,10 @@ compute_ld_motion_mems ()
                      ptr = ldst_entry (dest);
 
                      if (GET_CODE (src) != MEM
-                         && GET_CODE (src) != ASM_OPERANDS)
+                         && GET_CODE (src) != ASM_OPERANDS
+                         /* Check for REG manually since want_to_gcse_p
+                            returns 0 for all REGs.  */
+                         && (REG_P (src) || want_to_gcse_p (src)))
                        ptr->stores = alloc_INSN_LIST (insn, ptr->stores);
                      else
                        ptr->invalid = 1;
@@ -6918,10 +6923,10 @@ update_ld_motion_stores (expr)
         matter to set the reaching reg everywhere...  some might be
         dead and should be eliminated later.  */
 
-      /* We replace  SET mem = expr   with
-          SET reg = expr
-          SET mem = reg , where reg is the
-          reaching reg used in the load.  */
+      /* We replace (set mem expr) with (set reg expr) (set mem reg)
+        where reg is the reaching reg used in the load.  We checked in
+        compute_ld_motion_mems that we can replace (set mem expr) with
+        (set reg expr) in that insn.  */
       rtx list = mem_ptr->stores;
 
       for ( ; list != NULL_RTX; list = XEXP (list, 1))