From ef23e6a2d730a0f57afa958768dba05d0ee36d10 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 17 Apr 2013 12:01:46 +0000 Subject: [PATCH] re PR rtl-optimization/56921 (ICE in rtx_cost called by doloop_optimize_loops for PPC) 2013-04-17 Richard Biener PR rtl-optimization/56921 * cfgloop.h (struct loop): Add simple_loop_desc member. (struct niter_desc): Mark with GTY(()). (simple_loop_desc): Do not use aux field but simple_loop_desc. * loop-iv.c (get_simple_loop_desc): Likewise. (free_simple_loop_desc): Likewise. Revert 2013-04-16 Richard Biener PR rtl-optimization/56921 * loop-init.c (pass_rtl_move_loop_invariants): Add TODO_do_not_ggc_collect to todo_flags_finish. (pass_rtl_unswitch): Same. (pass_rtl_unroll_and_peel_loops): Same. (pass_rtl_doloop): Same. From-SVN: r198025 --- gcc/ChangeLog | 19 +++++++++++++++++++ gcc/cfgloop.h | 7 +++++-- gcc/loop-init.c | 12 ++++-------- gcc/loop-iv.c | 8 ++++---- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 440d3a1a0972..ef6f7fc15151 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +2013-04-17 Richard Biener + + PR rtl-optimization/56921 + * cfgloop.h (struct loop): Add simple_loop_desc member. + (struct niter_desc): Mark with GTY(()). + (simple_loop_desc): Do not use aux field but simple_loop_desc. + * loop-iv.c (get_simple_loop_desc): Likewise. + (free_simple_loop_desc): Likewise. + + Revert + 2013-04-16 Richard Biener + + PR rtl-optimization/56921 + * loop-init.c (pass_rtl_move_loop_invariants): Add + TODO_do_not_ggc_collect to todo_flags_finish. + (pass_rtl_unswitch): Same. + (pass_rtl_unroll_and_peel_loops): Same. + (pass_rtl_doloop): Same. + 2013-04-17 Eric Botcazou * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p): New. diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index 01cef519a0ca..29ac6c44937f 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -172,6 +172,9 @@ struct GTY ((chain_next ("%h.next"))) loop { /* Head of the cyclic list of the exits of the loop. */ struct loop_exit *exits; + + /* Number of iteration analysis data for RTL. */ + struct niter_desc *simple_loop_desc; }; /* Flags for state of loop structure. */ @@ -372,7 +375,7 @@ struct rtx_iv /* The description of an exit from the loop and of the number of iterations till we take the exit. */ -struct niter_desc +struct GTY(()) niter_desc { /* The edge out of the loop. */ edge out_edge; @@ -425,7 +428,7 @@ extern void free_simple_loop_desc (struct loop *loop); static inline struct niter_desc * simple_loop_desc (struct loop *loop) { - return (struct niter_desc *) loop->aux; + return loop->simple_loop_desc; } /* Accessors for the loop structures. */ diff --git a/gcc/loop-init.c b/gcc/loop-init.c index d5116acdcdbd..92d621e273c7 100644 --- a/gcc/loop-init.c +++ b/gcc/loop-init.c @@ -434,8 +434,7 @@ struct rtl_opt_pass pass_rtl_move_loop_invariants = 0, /* properties_destroyed */ 0, /* todo_flags_start */ TODO_df_verify | - TODO_df_finish | TODO_verify_rtl_sharing - | TODO_do_not_ggc_collect /* todo_flags_finish */ + TODO_df_finish | TODO_verify_rtl_sharing /* todo_flags_finish */ } }; @@ -471,8 +470,7 @@ struct rtl_opt_pass pass_rtl_unswitch = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_verify_rtl_sharing - | TODO_do_not_ggc_collect /* todo_flags_finish */ + TODO_verify_rtl_sharing, /* todo_flags_finish */ } }; @@ -521,8 +519,7 @@ struct rtl_opt_pass pass_rtl_unroll_and_peel_loops = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_verify_rtl_sharing - | TODO_do_not_ggc_collect /* todo_flags_finish */ + TODO_verify_rtl_sharing, /* todo_flags_finish */ } }; @@ -564,7 +561,6 @@ struct rtl_opt_pass pass_rtl_doloop = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_verify_rtl_sharing - | TODO_do_not_ggc_collect /* todo_flags_finish */ + TODO_verify_rtl_sharing /* todo_flags_finish */ } }; diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c index 0847307e1a87..5695e2982565 100644 --- a/gcc/loop-iv.c +++ b/gcc/loop-iv.c @@ -3016,10 +3016,10 @@ get_simple_loop_desc (struct loop *loop) /* At least desc->infinite is not always initialized by find_simple_loop_exit. */ - desc = XCNEW (struct niter_desc); + desc = ggc_alloc_cleared_niter_desc (); iv_analysis_loop_init (loop); find_simple_exit (loop, desc); - loop->aux = desc; + loop->simple_loop_desc = desc; if (desc->simple_p && (desc->assumptions || desc->infinite)) { @@ -3069,6 +3069,6 @@ free_simple_loop_desc (struct loop *loop) if (!desc) return; - free (desc); - loop->aux = NULL; + ggc_free (desc); + loop->simple_loop_desc = NULL; } -- 2.47.2