diff options
author | Richard Henderson <rth@redhat.com> | 2005-10-11 12:18:24 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2005-10-11 12:18:24 -0700 |
commit | 4989673889a86eb98ffa1045984957e8e6900091 (patch) | |
tree | 353917f75a114dab0d531ae6c3d4e0f631715ec8 /gcc | |
parent | 5e8b5b0868f23c72e9a4789196c60d076f2ef580 (diff) | |
download | gcc-4989673889a86eb98ffa1045984957e8e6900091.zip gcc-4989673889a86eb98ffa1045984957e8e6900091.tar.gz gcc-4989673889a86eb98ffa1045984957e8e6900091.tar.bz2 |
re PR tree-optimization/24300 (segfault in operand_equal_p with -ftree-vectorize)
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.
From-SVN: r105250
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/Makefile.in | 2 | ||||
-rw-r--r-- | gcc/passes.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr24300.c | 35 | ||||
-rw-r--r-- | gcc/tree-pass.h | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-dce.c | 28 |
6 files changed, 75 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b1faaa..091ceb8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 027fa04..e72eef9 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -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 \ diff --git a/gcc/passes.c b/gcc/passes.c index daa752e..0053f70 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -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 index 0000000..26eae81 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr24300.c @@ -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); +} diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index 6674884..1f45ffd 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -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; diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 8902d2a..6ad8cf2 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -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" 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 */ |