OSDN Git Service

PR optimization/8967
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Sep 2003 15:07:50 +0000 (15:07 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Sep 2003 15:07:50 +0000 (15:07 +0000)
* alias.c (write_dependence_p): Modify to take an additional constp
argument that controls whether the UNCHANGING_RTX_P flags are used.
(anti_dependence, output_dependence): Adjust write_dependence_p
callers to pass this additional argument, to return the same result.
(unchanging_anti_dependence): New variant of anti_dependence that
ignores the UNCHANGING_RTX_P property on memory references.
* rtl.h (unchaning_anti_dependence): Prototype here.
* flow.c (init_propagate_block): Place fake constant mem writes on
the mem_set_list so that dead writes to const variables are deleted.
(insn_dead_p): Change anti_dependence to unchanging_anti_dependence.
(mark_used_regs): Likewise.

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

gcc/ChangeLog
gcc/alias.c
gcc/flow.c
gcc/rtl.h

index 6a17614..eb5e258 100644 (file)
@@ -1,3 +1,18 @@
+2003-09-12  Roger Sayle  <roger@eyesopen.com>
+
+       PR optimization/8967
+       * alias.c (write_dependence_p): Modify to take an additional constp
+       argument that controls whether the UNCHANGING_RTX_P flags are used.
+       (anti_dependence, output_dependence): Adjust write_dependence_p
+       callers to pass this additional argument, to return the same result.
+       (unchanging_anti_dependence): New variant of anti_dependence that
+       ignores the UNCHANGING_RTX_P property on memory references.
+       * rtl.h (unchaning_anti_dependence): Prototype here.
+       * flow.c (init_propagate_block): Place fake constant mem writes on
+       the mem_set_list so that dead writes to const variables are deleted.
+       (insn_dead_p): Change anti_dependence to unchanging_anti_dependence.
+       (mark_used_regs): Likewise.
+
 2003-09-12  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mcore/mcore-protos.h (mcore_r15_operand_p): Declare.
index 3951fd6..f56820e 100644 (file)
@@ -110,7 +110,7 @@ static bool nonoverlapping_component_refs_p (tree, tree);
 static tree decl_for_component_ref (tree);
 static rtx adjust_offset_for_component_ref (tree, rtx);
 static int nonoverlapping_memrefs_p (rtx, rtx);
-static int write_dependence_p (rtx, rtx, int);
+static int write_dependence_p (rtx, rtx, int, int);
 
 static int nonlocal_mentioned_p_1 (rtx *, void *);
 static int nonlocal_mentioned_p (rtx);
@@ -2202,10 +2202,11 @@ canon_true_dependence (rtx mem, enum machine_mode mem_mode, rtx mem_addr,
 }
 
 /* Returns nonzero if a write to X might alias a previous read from
-   (or, if WRITEP is nonzero, a write to) MEM.  */
+   (or, if WRITEP is nonzero, a write to) MEM.  If CONSTP is non-zero,
+   honor the RTX_UNCHANGING_P flags on X and MEM.  */
 
 static int
-write_dependence_p (rtx mem, rtx x, int writep)
+write_dependence_p (rtx mem, rtx x, int writep, int constp)
 {
   rtx x_addr, mem_addr;
   rtx fixed_scalar;
@@ -2224,15 +2225,18 @@ write_dependence_p (rtx mem, rtx x, int writep)
   if (DIFFERENT_ALIAS_SETS_P (x, mem))
     return 0;
 
-  /* Unchanging memory can't conflict with non-unchanging memory.  */
-  if (RTX_UNCHANGING_P (x) != RTX_UNCHANGING_P (mem))
-    return 0;
+  if (constp)
+    {
+      /* Unchanging memory can't conflict with non-unchanging memory.  */
+      if (RTX_UNCHANGING_P (x) != RTX_UNCHANGING_P (mem))
+       return 0;
 
-  /* If MEM is an unchanging read, then it can't possibly conflict with
-     the store to X, because there is at most one store to MEM, and it must
-     have occurred somewhere before MEM.  */
-  if (! writep && RTX_UNCHANGING_P (mem))
-    return 0;
+      /* If MEM is an unchanging read, then it can't possibly conflict with
+        the store to X, because there is at most one store to MEM, and it
+        must have occurred somewhere before MEM.  */
+      if (! writep && RTX_UNCHANGING_P (mem))
+       return 0;
+    }
 
   if (nonoverlapping_memrefs_p (x, mem))
     return 0;
@@ -2273,7 +2277,7 @@ write_dependence_p (rtx mem, rtx x, int writep)
 int
 anti_dependence (rtx mem, rtx x)
 {
-  return write_dependence_p (mem, x, /*writep=*/0);
+  return write_dependence_p (mem, x, /*writep=*/0, /*constp*/1);
 }
 
 /* Output dependence: X is written after store in MEM takes place.  */
@@ -2281,7 +2285,16 @@ anti_dependence (rtx mem, rtx x)
 int
 output_dependence (rtx mem, rtx x)
 {
-  return write_dependence_p (mem, x, /*writep=*/1);
+  return write_dependence_p (mem, x, /*writep=*/1, /*constp*/1);
+}
+
+/* Unchanging anti dependence: Like anti_dependence but ignores
+   the UNCHANGING_RTX_P property on const variable references.  */
+
+int
+unchanging_anti_dependence (rtx mem, rtx x)
+{
+  return write_dependence_p (mem, x, /*writep=*/0, /*constp*/0);
 }
 \f
 /* A subroutine of nonlocal_mentioned_p, returns 1 if *LOC mentions
index 4bc33e2..66c04ee 100644 (file)
@@ -1974,13 +1974,6 @@ init_propagate_block_info (basic_block bb, regset live, regset local_set,
            rtx mem = SET_DEST (set);
            rtx canon_mem = canon_rtx (mem);
 
-           /* This optimization is performed by faking a store to the
-              memory at the end of the block.  This doesn't work for
-              unchanging memories because multiple stores to unchanging
-              memory is illegal and alias analysis doesn't consider it.  */
-           if (RTX_UNCHANGING_P (canon_mem))
-             continue;
-
            if (XEXP (canon_mem, 0) == frame_pointer_rtx
                || (GET_CODE (XEXP (canon_mem, 0)) == PLUS
                    && XEXP (XEXP (canon_mem, 0), 0) == frame_pointer_rtx
@@ -2152,7 +2145,7 @@ insn_dead_p (struct propagate_block_info *pbi, rtx x, int call_ok,
             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)))
+           if (unchanging_anti_dependence (r, XEXP (temp, 0)))
              {
                rtx mem = XEXP (temp, 0);
 
@@ -3730,7 +3723,7 @@ mark_used_regs (struct propagate_block_info *pbi, rtx x, rtx cond, rtx insn)
              while (temp)
                {
                  next = XEXP (temp, 1);
-                 if (anti_dependence (XEXP (temp, 0), x))
+                 if (unchanging_anti_dependence (XEXP (temp, 0), x))
                    {
                      /* Splice temp out of the list.  */
                      if (prev)
index b7db32a..fb1922a 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2253,6 +2253,7 @@ extern int canon_true_dependence (rtx, enum machine_mode, rtx, rtx,
 extern int read_dependence (rtx, rtx);
 extern int anti_dependence (rtx, rtx);
 extern int output_dependence (rtx, rtx);
+extern int unchanging_anti_dependence (rtx, rtx);
 extern void mark_constant_function (void);
 extern void init_alias_once (void);
 extern void init_alias_analysis (void);