OSDN Git Service

PR rtl-optimization/20466
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2005 23:21:07 +0000 (23:21 +0000)
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2005 23:21:07 +0000 (23:21 +0000)
* flow.c (invalidate_mems_from_set): Handle a MEM by checking it
for overlap of the address of each list member.
(mark_set_1): Call invalidate_mems_from_set for MEMs too.

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

gcc/ChangeLog
gcc/flow.c

index 470e221..73ec69f 100644 (file)
@@ -1,3 +1,10 @@
+2005-04-09  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR rtl-optimization/20466
+       * flow.c (invalidate_mems_from_set): Handle a MEM by checking it
+       for overlap of the address of each list member.
+       (mark_set_1): Call invalidate_mems_from_set for MEMs too.
+
 2005-04-08  Mike Stump  <mrs@apple.com>
 
        * config/darwin.c (indirect_data): Fix typo in strncmp logic.
 2005-04-08  Mike Stump  <mrs@apple.com>
 
        * config/darwin.c (indirect_data): Fix typo in strncmp logic.
index bdd72d3..96aa436 100644 (file)
@@ -2530,7 +2530,8 @@ invalidate_mems_from_autoinc (rtx *px, void *data)
   return 0;
 }
 
   return 0;
 }
 
-/* EXP is a REG.  Remove any dependent entries from pbi->mem_set_list.  */
+/* EXP is a REG or MEM.  Remove any dependent entries from
+   pbi->mem_set_list.  */
 
 static void
 invalidate_mems_from_set (struct propagate_block_info *pbi, rtx exp)
 
 static void
 invalidate_mems_from_set (struct propagate_block_info *pbi, rtx exp)
@@ -2542,7 +2543,12 @@ invalidate_mems_from_set (struct propagate_block_info *pbi, rtx exp)
   while (temp)
     {
       next = XEXP (temp, 1);
   while (temp)
     {
       next = XEXP (temp, 1);
-      if (reg_overlap_mentioned_p (exp, XEXP (temp, 0)))
+      if ((REG_P (exp) && reg_overlap_mentioned_p (exp, XEXP (temp, 0)))
+         /* When we get an EXP that is a mem here, we want to check if EXP
+            overlaps the *address* of any of the mems in the list (i.e. not
+            whether the mems actually overlap; that's done elsewhere).  */
+         || (MEM_P (exp)
+             && reg_overlap_mentioned_p (exp, XEXP (XEXP (temp, 0), 0))))
        {
          /* Splice this entry out of the list.  */
          if (prev)
        {
          /* Splice this entry out of the list.  */
          if (prev)
@@ -2748,11 +2754,12 @@ mark_set_1 (struct propagate_block_info *pbi, enum rtx_code code, rtx reg, rtx c
       break;
     }
 
       break;
     }
 
-  /* If this set is a MEM, then it kills any aliased writes.
+  /* If this set is a MEM, then it kills any aliased writes and any
+     other MEMs which use it.
      If this set is a REG, then it kills any MEMs which use the reg.  */
   if (optimize && (flags & PROP_SCAN_DEAD_STORES))
     {
      If this set is a REG, then it kills any MEMs which use the reg.  */
   if (optimize && (flags & PROP_SCAN_DEAD_STORES))
     {
-      if (REG_P (reg))
+      if (REG_P (reg) || MEM_P (reg))
        invalidate_mems_from_set (pbi, reg);
 
       /* If the memory reference had embedded side effects (autoincrement
        invalidate_mems_from_set (pbi, reg);
 
       /* If the memory reference had embedded side effects (autoincrement