PR tree-opt/24300
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Oct 2005 19:18:24 +0000 (19:18 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Oct 2005 19:18:24 +0000 (19:18 +0000)
        * Makefile.in (tree-ssa-dce.o): Depend on CFGLOOP_H.
        * tree-ssa-dce.c: Include cfgloop.h.
        (tree_ssa_dce_loop, pass_dce_loop): New.
        * tree-pass.h (pass_dce_loop): Declare it.
        * passes.c (init_optimization_passes): Use it.

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

gcc/ChangeLog
gcc/Makefile.in
gcc/passes.c
gcc/testsuite/gcc.dg/vect/pr24300.c [new file with mode: 0644]
gcc/tree-pass.h
gcc/tree-ssa-dce.c

index 1b1faaa..091ceb8 100644 (file)
@@ -1,3 +1,12 @@
+2005-10-11  Richard Henderson  <rth@redhat.com>
+
+       PR tree-opt/24300
+       * Makefile.in (tree-ssa-dce.o): Depend on CFGLOOP_H.
+       * tree-ssa-dce.c: Include cfgloop.h.
+       (tree_ssa_dce_loop, pass_dce_loop): New.
+       * tree-pass.h (pass_dce_loop): Declare it.
+       * passes.c (init_optimization_passes): Use it.
+
 2005-10-11  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR middle-end/24263 
index 027fa04..e72eef9 100644 (file)
@@ -2230,7 +2230,7 @@ mode-switching.o : mode-switching.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
 tree-ssa-dce.o : tree-ssa-dce.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
     $(RTL_H) $(TM_P_H) $(TREE_FLOW_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) $(TM_H) \
     coretypes.h $(TREE_DUMP_H) tree-pass.h $(FLAGS_H) $(BASIC_BLOCK_H) \
-    $(GGC_H) hard-reg-set.h $(OBSTACK_H) $(TREE_GIMPLE_H)
+    $(GGC_H) hard-reg-set.h $(OBSTACK_H) $(TREE_GIMPLE_H) $(CFGLOOP_H)
 tree-ssa-ccp.o : tree-ssa-ccp.c $(TREE_FLOW_H) $(CONFIG_H) \
    $(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
    $(DIAGNOSTIC_H) function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
index daa752e..0053f70 100644 (file)
@@ -595,12 +595,7 @@ init_optimization_passes (void)
 
   p = &pass_vectorize.sub;
   NEXT_PASS (pass_lower_vector_ssa);
-  /* ??? The loop optimizers are not GC safe.  See PR 21805.
-     Turn off GC while registering this pass.  */
-  pass_dce.todo_flags_finish &= ~TODO_ggc_collect;
-  NEXT_PASS (pass_dce);
-  pass_dce.todo_flags_finish |= TODO_ggc_collect;
-  gcc_assert (p != &pass_dce.next);
+  NEXT_PASS (pass_dce_loop);
   *p = NULL;
 
   p = &pass_loop2.sub;
diff --git a/gcc/testsuite/gcc.dg/vect/pr24300.c b/gcc/testsuite/gcc.dg/vect/pr24300.c
new file mode 100644 (file)
index 0000000..26eae81
--- /dev/null
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+
+static int *** foo (int);
+
+void
+bar ()
+{
+  int ***p = foo (2);
+}
+
+extern int *nd;
+extern int ***tc;
+extern int *ap;
+extern int *as;
+extern float ss;
+
+static int ***
+foo (int Fc)
+{
+  int i, j, s, p, n, t;
+
+  n = 0;
+  for (s = 0; s < 4; s++)
+    n += nd[s];
+
+  for (i = 0; i < n; i++)
+    {
+      p = ap[i];
+      s = as[i];
+      for (j = 0; j < Fc; j++)
+       tc[p][s][j] = i * ss + j;
+    }
+
+  return (tc);
+}
index 6674884..1f45ffd 100644 (file)
@@ -243,6 +243,7 @@ extern struct tree_opt_pass pass_build_ssa;
 extern struct tree_opt_pass pass_del_ssa;
 extern struct tree_opt_pass pass_dominator;
 extern struct tree_opt_pass pass_dce;
+extern struct tree_opt_pass pass_dce_loop;
 extern struct tree_opt_pass pass_cd_dce;
 extern struct tree_opt_pass pass_merge_phi;
 extern struct tree_opt_pass pass_may_alias;
index 8902d2a..6ad8cf2 100644 (file)
@@ -64,6 +64,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "tree-pass.h"
 #include "timevar.h"
 #include "flags.h"
+#include "cfgloop.h"
 \f
 static struct stmt_stats
 {
@@ -942,6 +943,13 @@ tree_ssa_dce (void)
 }
 
 static void
+tree_ssa_dce_loop (void)
+{
+  perform_tree_ssa_dce (/*aggressive=*/false);
+  free_numbers_of_iterations_estimates (current_loops);
+}
+
+static void
 tree_ssa_cd_dce (void)
 {
   perform_tree_ssa_dce (/*aggressive=*/optimize >= 2);
@@ -974,6 +982,26 @@ struct tree_opt_pass pass_dce =
   0                                    /* letter */
 };
 
+struct tree_opt_pass pass_dce_loop =
+{
+  "dceloop",                           /* name */
+  gate_dce,                            /* gate */
+  tree_ssa_dce_loop,                   /* execute */
+  NULL,                                        /* sub */
+  NULL,                                        /* next */
+  0,                                   /* static_pass_number */
+  TV_TREE_DCE,                         /* tv_id */
+  PROP_cfg | PROP_ssa | PROP_alias,    /* properties_required */
+  0,                                   /* properties_provided */
+  0,                                   /* properties_destroyed */
+  0,                                   /* todo_flags_start */
+  TODO_dump_func 
+    | TODO_update_ssa_no_phi 
+    | TODO_cleanup_cfg
+    | TODO_verify_ssa,                 /* todo_flags_finish */
+  0                                    /* letter */
+};
+
 struct tree_opt_pass pass_cd_dce =
 {
   "cddce",                             /* name */