flow.c (insn_dead_p): Don't consider two memrefs equivalent unless anti_dependence...
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Mon, 12 Mar 2001 19:09:57 +0000 (19:09 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 12 Mar 2001 19:09:57 +0000 (14:09 -0500)
* flow.c (insn_dead_p): Don't consider two memrefs equivalent
unless anti_dependence says they are.
* alias.c (objects_must_conflict): If neither has a type specified,
they must conflict.

From-SVN: r40420

gcc/ChangeLog
gcc/alias.c
gcc/flow.c

index ebbcd041ce4d47d75626290a6537f9e7b11f7b49..ea73863cfbe67f36a34c736dd19e869a08fb984f 100644 (file)
@@ -1,3 +1,10 @@
+Mon Mar 12 14:05:32 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * flow.c (insn_dead_p): Don't consider two memrefs equivalent
+       unless anti_dependence says they are.
+       * alias.c (objects_must_conflict): If neither has a type specified,
+       they must conflict.
+
 2001-03-12  Neil Booth  <neil@daikokuya.demon.co.uk>
            David Billinghurst <David.Billinghurst@riotinto.com>
 
index 85bce38c70f0fd80e1d47d9cf256280a05abeccd..6d794ba98c5dcea7861fdd41aea64bf60182811f 100644 (file)
@@ -309,6 +309,12 @@ int
 objects_must_conflict_p (t1, t2)
      tree t1, t2;
 {
+  /* If neither has a type specified, we don't know if they'll conflict
+     because we may be using them to store objects of various types, for
+     example the argument and local variables areas of inlined functions.  */
+  if (t1 == 0 && t1 == 0)
+    return 0;
+
   /* If one or the other has readonly fields or is readonly,
      then they may not conflict.  */
   if ((t1 != 0 && readonly_fields_p (t1))
index 82e90174063ae6d4ab8239e875e23e2411c8e208..819765523a2053c137ea1e97fb055c343a4a3b18 100644 (file)
@@ -4420,27 +4420,28 @@ insn_dead_p (pbi, x, call_ok, notes)
          /* Walk the set of memory locations we are currently tracking
             and see if one is an identical match to this memory location.
             If so, this memory write is dead (remember, we're walking
-            backwards from the end of the block to the start).  */
-         temp = pbi->mem_set_list;
-         while (temp)
-           {
-             rtx mem = XEXP (temp, 0);
+            backwards from the end of the block to the start).  Since
+            rtx_equal_p does not check the alias set or flags, we also
+            must have the potential for them to conflict (anti_dependence). */
+         for (temp = pbi->mem_set_list; temp != 0; temp = XEXP (temp, 1))
+           if (anti_dependence (r, XEXP (temp, 0)))
+             {
+               rtx mem = XEXP (temp, 0);
 
-             if (rtx_equal_p (mem, r))
-               return 1;
+               if (rtx_equal_p (mem, r))
+                 return 1;
 #ifdef AUTO_INC_DEC
-             /* Check if memory reference matches an auto increment. Only
-                post increment/decrement or modify are valid.  */
-             if (GET_MODE (mem) == GET_MODE (r)
-                 && (GET_CODE (XEXP (mem, 0)) == POST_DEC
-                     || GET_CODE (XEXP (mem, 0)) == POST_INC
-                     || GET_CODE (XEXP (mem, 0)) == POST_MODIFY)
-                 && GET_MODE (XEXP (mem, 0)) == GET_MODE (r)
-                 && rtx_equal_p (XEXP (XEXP (mem, 0), 0), XEXP (r, 0)))
-               return 1;
+               /* Check if memory reference matches an auto increment. Only
+                  post increment/decrement or modify are valid.  */
+               if (GET_MODE (mem) == GET_MODE (r)
+                   && (GET_CODE (XEXP (mem, 0)) == POST_DEC
+                       || GET_CODE (XEXP (mem, 0)) == POST_INC
+                       || GET_CODE (XEXP (mem, 0)) == POST_MODIFY)
+                   && GET_MODE (XEXP (mem, 0)) == GET_MODE (r)
+                   && rtx_equal_p (XEXP (XEXP (mem, 0), 0), XEXP (r, 0)))
+                 return 1;
 #endif
-             temp = XEXP (temp, 1);
-           }
+             }
        }
       else
        {