]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
loop.c (prescan_loop): Don't check unknown_address_altered when deciding if insert_lo...
authorJohn Wehle <john@feith.com>
Tue, 29 Aug 2000 19:15:26 +0000 (19:15 +0000)
committerJohn Wehle <wehle@gcc.gnu.org>
Tue, 29 Aug 2000 19:15:26 +0000 (19:15 +0000)
* loop.c (prescan_loop): Don't check unknown_address_altered
when deciding if insert_loop_mem is safe.  Add BLKmode MEMs
to loop_store_mems as necessary.
(loop_invariant_p): Don't check unknown_address_altered
or unknown_constant_address_altered.

From-SVN: r36045

gcc/ChangeLog
gcc/loop.c

index 0a91a6cf2f1e7d9c472ec6f909b44f06a56e1fc0..991af6cc155a460931e844e6ce0ee67d9c3c69ba 100644 (file)
@@ -1,3 +1,11 @@
+Tue Aug 29 15:17:54 EDT 2000  John Wehle  (john@feith.com)
+
+       * loop.c (prescan_loop): Don't check unknown_address_altered
+       when deciding if insert_loop_mem is safe.  Add BLKmode MEMs
+       to loop_store_mems as necessary.
+       (loop_invariant_p): Don't check unknown_address_altered
+       or unknown_constant_address_altered.
+
 2000-08-29  J. David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * vax.md (sltu, sgeu): Delete sltu and sgeu insn patterns.
index 04fe7ccbab0df1fd3d2ef36aea10e8de67d81954..5c70055d26551163aa40e1a8fa10956851f49844 100644 (file)
@@ -2451,11 +2451,9 @@ prescan_loop (loop)
     }
 
   /* Now, rescan the loop, setting up the LOOP_MEMS array.  */
-  if (/* We can't tell what MEMs are aliased by what.  */
-      ! unknown_address_altered
-      /* An exception thrown by a called function might land us
+  if (/* An exception thrown by a called function might land us
         anywhere.  */
-      && ! loop_info->has_call
+      ! loop_info->has_call
       /* We don't want loads for MEMs moved to a location before the
         one at which their stack memory becomes allocated.  (Note
         that this is not a problem for malloc, etc., since those
@@ -2467,6 +2465,23 @@ prescan_loop (loop)
     for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
         insn = NEXT_INSN (insn))
       for_each_rtx (&insn, insert_loop_mem, 0);
+
+  /* BLKmode MEMs are added to LOOP_STORE_MEM as necessary so
+     that loop_invariant_p and load_mems can use true_dependence
+     to determine what is really clobbered.  */
+  if (unknown_address_altered)
+    {
+      rtx mem = gen_rtx_MEM (BLKmode, const0_rtx);
+
+      loop_store_mems = gen_rtx_EXPR_LIST (VOIDmode, mem, loop_store_mems);
+    }
+  if (unknown_constant_address_altered)
+    {
+      rtx mem = gen_rtx_MEM (BLKmode, const0_rtx);
+
+      RTX_UNCHANGING_P (mem) = 1;
+      loop_store_mems = gen_rtx_EXPR_LIST (VOIDmode, mem, loop_store_mems);
+    }
 }
 \f
 /* LOOP->CONT_DOMINATOR is now the last label between the loop start
@@ -3136,9 +3151,8 @@ note_set_pseudo_multiple_uses (x, y, data)
 
    The value is 2 if we refer to something only conditionally invariant.
 
-   If `unknown_address_altered' is nonzero, no memory ref is invariant.
-   Otherwise, a memory ref is invariant if it does not conflict with
-   anything stored in `loop_store_mems'.  */
+   A memory ref is invariant if it is not volatile and does not conflict
+   with anything stored in `loop_store_mems'.  */
 
 int
 loop_invariant_p (loop, x)
@@ -3207,14 +3221,6 @@ loop_invariant_p (loop, x)
       if (MEM_VOLATILE_P (x))
        return 0;
 
-      /* If we had a subroutine call, any location in memory could
-        have been clobbered.  We used to test here for volatile and
-        readonly, but true_dependence knows how to do that better
-        than we do.  */
-      if (RTX_UNCHANGING_P (x)
-         ? unknown_constant_address_altered : unknown_address_altered)
-       return 0;
-
       /* See if there is any dependence between a store and this load.  */
       mem_list_entry = loop_store_mems;
       while (mem_list_entry)