Commit 0fc822d0 by Richard Biener Committed by Richard Biener

function.h (loops_for_fn): New inline function.

2013-04-30  Richard Biener  <rguenther@suse.de>

	* function.h (loops_for_fn): New inline function.
	(set_loops_for_fn): Likewise.
	* cfgloop.h (place_new_loop): Add struct function parameter.
	(get_loop): Likewise.
	(get_loops): Likewise.
	(number_of_loops): Likewise.
	(fel_next): Adjust.
	(fel_init): Likewise.
	* cfg.c (get_loop_copy): Adjust.
	* cfgloop.c (flow_loops_dump): Likewise.
	(record_loop_exits): Likewise.
	(verify_loop_structure): Likewise.
	* cfgloopanal.c (mark_irreducible_loops): Likewise.
	(estimate_reg_pressure_cost): Likewise.
	(mark_loop_exit_edges): Likewise.
	* cfgloopmanip.c (place_new_loop): Likewise.
	(add_loop): Likewise.
	(duplicate_loop): Likewise.
	* graph.c (draw_cfg_nodes): Likewise.
	* graphite-clast-to-gimple.c (translate_clast_user): Likewise.
	* graphite-sese-to-poly.c (build_scop_scattering): Likewise.
	(extract_affine_chrec): Likewise.
	(build_scop_iteration_domain): Likewise.
	* graphite.c (graphite_initialize): Likewise.
	* ira-build.c (create_loop_tree_nodes): Likewise.
	(more_one_region_p): Likewise.
	(rebuild_regno_allocno_maps): Likewise.
	(mark_loops_for_removal): Likewise.
	(mark_all_loops_for_removal): Likewise.
	(remove_unnecessary_regions): Likewise.
	(ira_build): Likewise.
	* ira-emit.c (setup_entered_from_non_parent_p): Likewise.
	* loop-init.c (fix_loop_structure): Likewise.
	(gate_rtl_move_loop_invariants): Likewise.
	(gate_rtl_unswitch): Likewise.
	(gate_rtl_unroll_and_peel_loops): Likewise.
	(rtl_doloop): Likewise.
	* lto-streamer-in.c (input_cfg): Likewise.
	* lto-streamer-out.c (output_cfg): Likewise.
	* modulo-sched.c (sms_schedule): Likewise.
	* predict.c (tree_estimate_probability): Likewise.
	(tree_estimate_probability_driver): Likewise.
	(estimate_loops): Likewise.
	* tree-cfg.c (fixup_loop_arrays_after_move): Likewise.
	(move_sese_region_to_fn): Likewise.
	(debug_loop_num): Likewise.
	* tree-chrec.c (chrec_evaluate): Likewise.
	(hide_evolution_in_other_loops_than_loop): Likewise.
	(chrec_component_in_loop_num): Likewise.
	(reset_evolution_in_loop): Likewise.
	(evolution_function_is_invariant_rec_p): Likewise.
	* tree-if-conv.c (main_tree_if_conversion): Likewise.
	* tree-inline.c (copy_loops): Likewise.
	(copy_cfg_body): Likewise.
	(tree_function_versioning): Likewise.
	* tree-loop-distribution.c (rdg_flag_loop_exits): Likewise.
	* tree-scalar-evolution.c (chrec_contains_symbols_defined_in_loop):
	Likewise.
	(add_to_evolution_1): Likewise.
	(scev_const_prop): Likewise.
	* tree-scalar-evolution.h (get_chrec_loop): Likewise.
	* tree-ssa-loop-ch.c (copy_loop_headers): Likewise.
	* tree-ssa-loop-im.c (analyze_memory_references): Likewise.
	(tree_ssa_lim_initialize): Likewise.
	* tree-ssa-loop-manip.c (rewrite_into_loop_closed_ssa): Likewise.
	(verify_loop_closed_ssa): Likewise.
	* tree-ssa-loop.c  (tree_ssa_loop_init): Likewise.
	(tree_ssa_loop_im): Likewise.
	(tree_ssa_loop_unswitch): Likewise.
	(tree_vectorize): Likewise.
	(check_data_deps): Likewise.
	(tree_ssa_loop_ivcanon): Likewise.
	(tree_ssa_loop_bounds): Likewise.
	(tree_complete_unroll): Likewise.
	(tree_complete_unroll_inner): Likewise.
	(tree_parallelize_loops): Likewise.
	(tree_ssa_loop_prefetch): Likewise.
	(tree_ssa_loop_ivopts): Likewise.
	* tree-ssa.c (execute_update_addresses_taken): Liekwise.
	* tree-vectorizer.c (vectorize_loops): Likewise.

From-SVN: r198441
parent 37953bd3
2013-04-30 Richard Biener <rguenther@suse.de>
* function.h (loops_for_fn): New inline function.
(set_loops_for_fn): Likewise.
* cfgloop.h (place_new_loop): Add struct function parameter.
(get_loop): Likewise.
(get_loops): Likewise.
(number_of_loops): Likewise.
(fel_next): Adjust.
(fel_init): Likewise.
* cfg.c (get_loop_copy): Adjust.
* cfgloop.c (flow_loops_dump): Likewise.
(record_loop_exits): Likewise.
(verify_loop_structure): Likewise.
* cfgloopanal.c (mark_irreducible_loops): Likewise.
(estimate_reg_pressure_cost): Likewise.
(mark_loop_exit_edges): Likewise.
* cfgloopmanip.c (place_new_loop): Likewise.
(add_loop): Likewise.
(duplicate_loop): Likewise.
* graph.c (draw_cfg_nodes): Likewise.
* graphite-clast-to-gimple.c (translate_clast_user): Likewise.
* graphite-sese-to-poly.c (build_scop_scattering): Likewise.
(extract_affine_chrec): Likewise.
(build_scop_iteration_domain): Likewise.
* graphite.c (graphite_initialize): Likewise.
* ira-build.c (create_loop_tree_nodes): Likewise.
(more_one_region_p): Likewise.
(rebuild_regno_allocno_maps): Likewise.
(mark_loops_for_removal): Likewise.
(mark_all_loops_for_removal): Likewise.
(remove_unnecessary_regions): Likewise.
(ira_build): Likewise.
* ira-emit.c (setup_entered_from_non_parent_p): Likewise.
* loop-init.c (fix_loop_structure): Likewise.
(gate_rtl_move_loop_invariants): Likewise.
(gate_rtl_unswitch): Likewise.
(gate_rtl_unroll_and_peel_loops): Likewise.
(rtl_doloop): Likewise.
* lto-streamer-in.c (input_cfg): Likewise.
* lto-streamer-out.c (output_cfg): Likewise.
* modulo-sched.c (sms_schedule): Likewise.
* predict.c (tree_estimate_probability): Likewise.
(tree_estimate_probability_driver): Likewise.
(estimate_loops): Likewise.
* tree-cfg.c (fixup_loop_arrays_after_move): Likewise.
(move_sese_region_to_fn): Likewise.
(debug_loop_num): Likewise.
* tree-chrec.c (chrec_evaluate): Likewise.
(hide_evolution_in_other_loops_than_loop): Likewise.
(chrec_component_in_loop_num): Likewise.
(reset_evolution_in_loop): Likewise.
(evolution_function_is_invariant_rec_p): Likewise.
* tree-if-conv.c (main_tree_if_conversion): Likewise.
* tree-inline.c (copy_loops): Likewise.
(copy_cfg_body): Likewise.
(tree_function_versioning): Likewise.
* tree-loop-distribution.c (rdg_flag_loop_exits): Likewise.
* tree-scalar-evolution.c (chrec_contains_symbols_defined_in_loop):
Likewise.
(add_to_evolution_1): Likewise.
(scev_const_prop): Likewise.
* tree-scalar-evolution.h (get_chrec_loop): Likewise.
* tree-ssa-loop-ch.c (copy_loop_headers): Likewise.
* tree-ssa-loop-im.c (analyze_memory_references): Likewise.
(tree_ssa_lim_initialize): Likewise.
* tree-ssa-loop-manip.c (rewrite_into_loop_closed_ssa): Likewise.
(verify_loop_closed_ssa): Likewise.
* tree-ssa-loop.c (tree_ssa_loop_init): Likewise.
(tree_ssa_loop_im): Likewise.
(tree_ssa_loop_unswitch): Likewise.
(tree_vectorize): Likewise.
(check_data_deps): Likewise.
(tree_ssa_loop_ivcanon): Likewise.
(tree_ssa_loop_bounds): Likewise.
(tree_complete_unroll): Likewise.
(tree_complete_unroll_inner): Likewise.
(tree_parallelize_loops): Likewise.
(tree_ssa_loop_prefetch): Likewise.
(tree_ssa_loop_ivopts): Likewise.
* tree-ssa.c (execute_update_addresses_taken): Liekwise.
* tree-vectorizer.c (vectorize_loops): Likewise.
2013-04-29 Mike Frysinger <vapier@gentoo.org> 2013-04-29 Mike Frysinger <vapier@gentoo.org>
* config/arm/bpabi.h (EABI_LINK_SPEC): Define. * config/arm/bpabi.h (EABI_LINK_SPEC): Define.
......
...@@ -1180,7 +1180,7 @@ get_loop_copy (struct loop *loop) ...@@ -1180,7 +1180,7 @@ get_loop_copy (struct loop *loop)
key.index1 = loop->num; key.index1 = loop->num;
entry = loop_copy.find (&key); entry = loop_copy.find (&key);
if (entry) if (entry)
return get_loop (entry->index2); return get_loop (cfun, entry->index2);
else else
return NULL; return NULL;
} }
...@@ -160,7 +160,7 @@ flow_loops_dump (FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, ...@@ -160,7 +160,7 @@ flow_loops_dump (FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *,
if (!current_loops || ! file) if (!current_loops || ! file)
return; return;
fprintf (file, ";; %d loops found\n", number_of_loops ()); fprintf (file, ";; %d loops found\n", number_of_loops (cfun));
FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT) FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
{ {
...@@ -1077,7 +1077,7 @@ record_loop_exits (void) ...@@ -1077,7 +1077,7 @@ record_loop_exits (void)
loops_state_set (LOOPS_HAVE_RECORDED_EXITS); loops_state_set (LOOPS_HAVE_RECORDED_EXITS);
gcc_assert (current_loops->exits == NULL); gcc_assert (current_loops->exits == NULL);
current_loops->exits = htab_create_ggc (2 * number_of_loops (), current_loops->exits = htab_create_ggc (2 * number_of_loops (cfun),
loop_exit_hash, loop_exit_eq, loop_exit_hash, loop_exit_eq,
loop_exit_free); loop_exit_free);
...@@ -1324,7 +1324,7 @@ verify_loop_structure (void) ...@@ -1324,7 +1324,7 @@ verify_loop_structure (void)
struct loop *loop; struct loop *loop;
int err = 0; int err = 0;
edge e; edge e;
unsigned num = number_of_loops (); unsigned num = number_of_loops (cfun);
loop_iterator li; loop_iterator li;
struct loop_exit *exit, *mexit; struct loop_exit *exit, *mexit;
bool dom_available = dom_info_available_p (CDI_DOMINATORS); bool dom_available = dom_info_available_p (CDI_DOMINATORS);
......
...@@ -234,7 +234,7 @@ void rescan_loop_exit (edge, bool, bool); ...@@ -234,7 +234,7 @@ void rescan_loop_exit (edge, bool, bool);
/* Loop data structure manipulation/querying. */ /* Loop data structure manipulation/querying. */
extern void flow_loop_tree_node_add (struct loop *, struct loop *); extern void flow_loop_tree_node_add (struct loop *, struct loop *);
extern void flow_loop_tree_node_remove (struct loop *); extern void flow_loop_tree_node_remove (struct loop *);
extern void place_new_loop (struct loop *); extern void place_new_loop (struct function *, struct loop *);
extern void add_loop (struct loop *, struct loop *); extern void add_loop (struct loop *, struct loop *);
extern bool flow_loop_nested_p (const struct loop *, const struct loop *); extern bool flow_loop_nested_p (const struct loop *, const struct loop *);
extern bool flow_bb_inside_loop_p (const struct loop *, const_basic_block); extern bool flow_bb_inside_loop_p (const struct loop *, const_basic_block);
...@@ -436,12 +436,12 @@ simple_loop_desc (struct loop *loop) ...@@ -436,12 +436,12 @@ simple_loop_desc (struct loop *loop)
/* Accessors for the loop structures. */ /* Accessors for the loop structures. */
/* Returns the loop with index NUM from current_loops. */ /* Returns the loop with index NUM from FNs loop tree. */
static inline struct loop * static inline struct loop *
get_loop (unsigned num) get_loop (struct function *fn, unsigned num)
{ {
return (*current_loops->larray)[num]; return (*loops_for_fn (fn)->larray)[num];
} }
/* Returns the number of superloops of LOOP. */ /* Returns the number of superloops of LOOP. */
...@@ -482,27 +482,29 @@ loop_has_exit_edges (const struct loop *loop) ...@@ -482,27 +482,29 @@ loop_has_exit_edges (const struct loop *loop)
return loop->exits->next->e != NULL; return loop->exits->next->e != NULL;
} }
/* Returns the list of loops in current_loops. */ /* Returns the list of loops in FN. */
static inline vec<loop_p, va_gc> * inline vec<loop_p, va_gc> *
get_loops (void) get_loops (struct function *fn)
{ {
if (!current_loops) struct loops *loops = loops_for_fn (fn);
if (!loops)
return NULL; return NULL;
return current_loops->larray; return loops->larray;
} }
/* Returns the number of loops in current_loops (including the removed /* Returns the number of loops in FN (including the removed
ones and the fake loop that forms the root of the loop tree). */ ones and the fake loop that forms the root of the loop tree). */
static inline unsigned static inline unsigned
number_of_loops (void) number_of_loops (struct function *fn)
{ {
if (!current_loops) struct loops *loops = loops_for_fn (fn);
if (!fn)
return 0; return 0;
return vec_safe_length (current_loops->larray); return vec_safe_length (loops->larray);
} }
/* Returns true if state of the loops satisfies all properties /* Returns true if state of the loops satisfies all properties
...@@ -563,7 +565,7 @@ fel_next (loop_iterator *li, loop_p *loop) ...@@ -563,7 +565,7 @@ fel_next (loop_iterator *li, loop_p *loop)
while (li->to_visit.iterate (li->idx, &anum)) while (li->to_visit.iterate (li->idx, &anum))
{ {
li->idx++; li->idx++;
*loop = get_loop (anum); *loop = get_loop (cfun, anum);
if (*loop) if (*loop)
return; return;
} }
...@@ -587,7 +589,7 @@ fel_init (loop_iterator *li, loop_p *loop, unsigned flags) ...@@ -587,7 +589,7 @@ fel_init (loop_iterator *li, loop_p *loop, unsigned flags)
return; return;
} }
li->to_visit.create (number_of_loops ()); li->to_visit.create (number_of_loops (cfun));
mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1; mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
if (flags & LI_ONLY_INNERMOST) if (flags & LI_ONLY_INNERMOST)
......
...@@ -77,7 +77,7 @@ mark_irreducible_loops (void) ...@@ -77,7 +77,7 @@ mark_irreducible_loops (void)
int src, dest; int src, dest;
unsigned depth; unsigned depth;
struct graph *g; struct graph *g;
int num = number_of_loops (); int num = number_of_loops (cfun);
struct loop *cloop; struct loop *cloop;
bool irred_loop_found = false; bool irred_loop_found = false;
int i; int i;
...@@ -409,7 +409,7 @@ estimate_reg_pressure_cost (unsigned n_new, unsigned n_old, bool speed, ...@@ -409,7 +409,7 @@ estimate_reg_pressure_cost (unsigned n_new, unsigned n_old, bool speed,
if (optimize && (flag_ira_region == IRA_REGION_ALL if (optimize && (flag_ira_region == IRA_REGION_ALL
|| flag_ira_region == IRA_REGION_MIXED) || flag_ira_region == IRA_REGION_MIXED)
&& number_of_loops () <= (unsigned) IRA_MAX_LOOPS_NUM) && number_of_loops (cfun) <= (unsigned) IRA_MAX_LOOPS_NUM)
/* IRA regional allocation deals with high register pressure /* IRA regional allocation deals with high register pressure
better. So decrease the cost (to do more accurate the cost better. So decrease the cost (to do more accurate the cost
calculation for IRA, we need to know how many registers lives calculation for IRA, we need to know how many registers lives
...@@ -427,7 +427,7 @@ mark_loop_exit_edges (void) ...@@ -427,7 +427,7 @@ mark_loop_exit_edges (void)
basic_block bb; basic_block bb;
edge e; edge e;
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return; return;
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
......
...@@ -408,13 +408,13 @@ remove_path (edge e) ...@@ -408,13 +408,13 @@ remove_path (edge e)
return true; return true;
} }
/* Creates place for a new LOOP in loops structure. */ /* Creates place for a new LOOP in loops structure of FN. */
void void
place_new_loop (struct loop *loop) place_new_loop (struct function *fn, struct loop *loop)
{ {
loop->num = number_of_loops (); loop->num = number_of_loops (fn);
vec_safe_push (current_loops->larray, loop); vec_safe_push (loops_for_fn (fn)->larray, loop);
} }
/* Given LOOP structure with filled header and latch, find the body of the /* Given LOOP structure with filled header and latch, find the body of the
...@@ -431,7 +431,7 @@ add_loop (struct loop *loop, struct loop *outer) ...@@ -431,7 +431,7 @@ add_loop (struct loop *loop, struct loop *outer)
edge_iterator ei; edge_iterator ei;
/* Add it to loop structure. */ /* Add it to loop structure. */
place_new_loop (loop); place_new_loop (cfun, loop);
flow_loop_tree_node_add (outer, loop); flow_loop_tree_node_add (outer, loop);
/* Find its nodes. */ /* Find its nodes. */
...@@ -1010,7 +1010,7 @@ duplicate_loop (struct loop *loop, struct loop *target) ...@@ -1010,7 +1010,7 @@ duplicate_loop (struct loop *loop, struct loop *target)
{ {
struct loop *cloop; struct loop *cloop;
cloop = alloc_loop (); cloop = alloc_loop ();
place_new_loop (cloop); place_new_loop (cfun, cloop);
copy_loop_info (loop, cloop); copy_loop_info (loop, cloop);
......
...@@ -700,6 +700,23 @@ extern void push_cfun (struct function *new_cfun); ...@@ -700,6 +700,23 @@ extern void push_cfun (struct function *new_cfun);
extern void pop_cfun (void); extern void pop_cfun (void);
extern void instantiate_decl_rtl (rtx x); extern void instantiate_decl_rtl (rtx x);
/* Return the loop tree of FN. */
inline struct loops *
loops_for_fn (struct function *fn)
{
return fn->x_current_loops;
}
/* Set the loop tree of FN to LOOPS. */
inline void
set_loops_for_fn (struct function *fn, struct loops *loops)
{
gcc_checking_assert (fn->x_current_loops == NULL || loops == NULL);
fn->x_current_loops = loops;
}
/* For backward compatibility... eventually these should all go away. */ /* For backward compatibility... eventually these should all go away. */
#define current_function_funcdef_no (cfun->funcdef_no) #define current_function_funcdef_no (cfun->funcdef_no)
......
...@@ -258,10 +258,8 @@ draw_cfg_nodes_for_loop (pretty_printer *pp, int funcdef_no, ...@@ -258,10 +258,8 @@ draw_cfg_nodes_for_loop (pretty_printer *pp, int funcdef_no,
static void static void
draw_cfg_nodes (pretty_printer *pp, struct function *fun) draw_cfg_nodes (pretty_printer *pp, struct function *fun)
{ {
/* ??? This x_current_loops should be enapsulated. */ if (loops_for_fn (fun))
if (fun->x_current_loops) draw_cfg_nodes_for_loop (pp, fun->funcdef_no, get_loop (fun, 0));
draw_cfg_nodes_for_loop (pp, fun->funcdef_no,
fun->x_current_loops->tree_root);
else else
draw_cfg_nodes_no_loops (pp, fun); draw_cfg_nodes_no_loops (pp, fun);
} }
......
...@@ -1094,7 +1094,7 @@ translate_clast_user (struct clast_user_stmt *stmt, edge next_e, ...@@ -1094,7 +1094,7 @@ translate_clast_user (struct clast_user_stmt *stmt, edge next_e,
if (GBB_BB (gbb) == ENTRY_BLOCK_PTR) if (GBB_BB (gbb) == ENTRY_BLOCK_PTR)
return next_e; return next_e;
nb_loops = number_of_loops (); nb_loops = number_of_loops (cfun);
iv_map.create (nb_loops); iv_map.create (nb_loops);
for (i = 0; i < nb_loops; i++) for (i = 0; i < nb_loops; i++)
iv_map.quick_push (NULL_TREE); iv_map.quick_push (NULL_TREE);
......
...@@ -550,7 +550,7 @@ build_scop_scattering (scop_p scop) ...@@ -550,7 +550,7 @@ build_scop_scattering (scop_p scop)
isl_space *dc = isl_set_get_space (scop->context); isl_space *dc = isl_set_get_space (scop->context);
isl_aff *static_sched; isl_aff *static_sched;
dc = isl_space_add_dims (dc, isl_dim_set, number_of_loops()); dc = isl_space_add_dims (dc, isl_dim_set, number_of_loops (cfun));
static_sched = isl_aff_zero_on_domain (isl_local_space_from_space (dc)); static_sched = isl_aff_zero_on_domain (isl_local_space_from_space (dc));
/* We have to start schedules at 0 on the first component and /* We have to start schedules at 0 on the first component and
...@@ -590,8 +590,7 @@ extract_affine_chrec (scop_p s, tree e, __isl_take isl_space *space) ...@@ -590,8 +590,7 @@ extract_affine_chrec (scop_p s, tree e, __isl_take isl_space *space)
isl_pw_aff *lhs = extract_affine (s, CHREC_LEFT (e), isl_space_copy (space)); isl_pw_aff *lhs = extract_affine (s, CHREC_LEFT (e), isl_space_copy (space));
isl_pw_aff *rhs = extract_affine (s, CHREC_RIGHT (e), isl_space_copy (space)); isl_pw_aff *rhs = extract_affine (s, CHREC_RIGHT (e), isl_space_copy (space));
isl_local_space *ls = isl_local_space_from_space (space); isl_local_space *ls = isl_local_space_from_space (space);
unsigned pos = sese_loop_depth ((sese) s->region, unsigned pos = sese_loop_depth ((sese) s->region, get_chrec_loop (e)) - 1;
get_loop (CHREC_VARIABLE (e))) - 1;
isl_aff *loop = isl_aff_set_coefficient_si isl_aff *loop = isl_aff_set_coefficient_si
(isl_aff_zero_on_domain (ls), isl_dim_in, pos, 1); (isl_aff_zero_on_domain (ls), isl_dim_in, pos, 1);
isl_pw_aff *l = isl_pw_aff_from_aff (loop); isl_pw_aff *l = isl_pw_aff_from_aff (loop);
...@@ -1404,7 +1403,7 @@ build_scop_iteration_domain (scop_p scop) ...@@ -1404,7 +1403,7 @@ build_scop_iteration_domain (scop_p scop)
sese region = SCOP_REGION (scop); sese region = SCOP_REGION (scop);
int i; int i;
poly_bb_p pbb; poly_bb_p pbb;
int nb_loops = number_of_loops (); int nb_loops = number_of_loops (cfun);
isl_set **doms = XCNEWVEC (isl_set *, nb_loops); isl_set **doms = XCNEWVEC (isl_set *, nb_loops);
FOR_EACH_VEC_ELT (SESE_LOOP_NEST (region), i, loop) FOR_EACH_VEC_ELT (SESE_LOOP_NEST (region), i, loop)
......
...@@ -198,7 +198,7 @@ print_graphite_statistics (FILE* file, vec<scop_p> scops) ...@@ -198,7 +198,7 @@ print_graphite_statistics (FILE* file, vec<scop_p> scops)
static bool static bool
graphite_initialize (isl_ctx *ctx) graphite_initialize (isl_ctx *ctx)
{ {
if (number_of_loops () <= 1 if (number_of_loops (cfun) <= 1
/* FIXME: This limit on the number of basic blocks of a function /* FIXME: This limit on the number of basic blocks of a function
should be removed when the SCOP detection is faster. */ should be removed when the SCOP detection is faster. */
|| n_basic_blocks > PARAM_VALUE (PARAM_GRAPHITE_MAX_BBS_PER_FUNCTION)) || n_basic_blocks > PARAM_VALUE (PARAM_GRAPHITE_MAX_BBS_PER_FUNCTION))
......
...@@ -151,11 +151,11 @@ create_loop_tree_nodes (void) ...@@ -151,11 +151,11 @@ create_loop_tree_nodes (void)
init_loop_tree_node (ira_loop_nodes, 0); init_loop_tree_node (ira_loop_nodes, 0);
return; return;
} }
ira_loop_nodes_count = number_of_loops (); ira_loop_nodes_count = number_of_loops (cfun);
ira_loop_nodes = ((struct ira_loop_tree_node *) ira_loop_nodes = ((struct ira_loop_tree_node *)
ira_allocate (sizeof (struct ira_loop_tree_node) ira_allocate (sizeof (struct ira_loop_tree_node)
* ira_loop_nodes_count)); * ira_loop_nodes_count));
FOR_EACH_VEC_SAFE_ELT (get_loops (), i, loop) FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop)
{ {
if (loop_outer (loop) != NULL) if (loop_outer (loop) != NULL)
{ {
...@@ -194,7 +194,7 @@ more_one_region_p (void) ...@@ -194,7 +194,7 @@ more_one_region_p (void)
loop_p loop; loop_p loop;
if (current_loops != NULL) if (current_loops != NULL)
FOR_EACH_VEC_SAFE_ELT (get_loops (), i, loop) FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop)
if (ira_loop_nodes[i].regno_allocno_map != NULL if (ira_loop_nodes[i].regno_allocno_map != NULL
&& ira_loop_tree_root != &ira_loop_nodes[i]) && ira_loop_tree_root != &ira_loop_nodes[i])
return true; return true;
...@@ -379,7 +379,7 @@ rebuild_regno_allocno_maps (void) ...@@ -379,7 +379,7 @@ rebuild_regno_allocno_maps (void)
ira_assert (current_loops != NULL); ira_assert (current_loops != NULL);
max_regno = max_reg_num (); max_regno = max_reg_num ();
FOR_EACH_VEC_SAFE_ELT (get_loops (), l, loop) FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), l, loop)
if (ira_loop_nodes[l].regno_allocno_map != NULL) if (ira_loop_nodes[l].regno_allocno_map != NULL)
{ {
ira_free (ira_loop_nodes[l].regno_allocno_map); ira_free (ira_loop_nodes[l].regno_allocno_map);
...@@ -2053,8 +2053,8 @@ mark_loops_for_removal (void) ...@@ -2053,8 +2053,8 @@ mark_loops_for_removal (void)
ira_assert (current_loops != NULL); ira_assert (current_loops != NULL);
sorted_loops sorted_loops
= (ira_loop_tree_node_t *) ira_allocate (sizeof (ira_loop_tree_node_t) = (ira_loop_tree_node_t *) ira_allocate (sizeof (ira_loop_tree_node_t)
* number_of_loops ()); * number_of_loops (cfun));
for (n = i = 0; vec_safe_iterate (get_loops (), i, &loop); i++) for (n = i = 0; vec_safe_iterate (get_loops (cfun), i, &loop); i++)
if (ira_loop_nodes[i].regno_allocno_map != NULL) if (ira_loop_nodes[i].regno_allocno_map != NULL)
{ {
if (ira_loop_nodes[i].parent == NULL) if (ira_loop_nodes[i].parent == NULL)
...@@ -2098,7 +2098,7 @@ mark_all_loops_for_removal (void) ...@@ -2098,7 +2098,7 @@ mark_all_loops_for_removal (void)
loop_p loop; loop_p loop;
ira_assert (current_loops != NULL); ira_assert (current_loops != NULL);
FOR_EACH_VEC_SAFE_ELT (get_loops (), i, loop) FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop)
if (ira_loop_nodes[i].regno_allocno_map != NULL) if (ira_loop_nodes[i].regno_allocno_map != NULL)
{ {
if (ira_loop_nodes[i].parent == NULL) if (ira_loop_nodes[i].parent == NULL)
...@@ -2408,8 +2408,8 @@ remove_unnecessary_regions (bool all_p) ...@@ -2408,8 +2408,8 @@ remove_unnecessary_regions (bool all_p)
mark_all_loops_for_removal (); mark_all_loops_for_removal ();
else else
mark_loops_for_removal (); mark_loops_for_removal ();
children_vec.create(last_basic_block + number_of_loops ()); children_vec.create(last_basic_block + number_of_loops (cfun));
removed_loop_vec.create(last_basic_block + number_of_loops ()); removed_loop_vec.create(last_basic_block + number_of_loops (cfun));
remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root); remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root);
children_vec.release (); children_vec.release ();
if (all_p) if (all_p)
...@@ -3290,7 +3290,7 @@ ira_build (void) ...@@ -3290,7 +3290,7 @@ ira_build (void)
} }
} }
fprintf (ira_dump_file, " regions=%d, blocks=%d, points=%d\n", fprintf (ira_dump_file, " regions=%d, blocks=%d, points=%d\n",
current_loops == NULL ? 1 : number_of_loops (), current_loops == NULL ? 1 : number_of_loops (cfun),
n_basic_blocks, ira_max_point); n_basic_blocks, ira_max_point);
fprintf (ira_dump_file, fprintf (ira_dump_file,
" allocnos=%d (big %d), copies=%d, conflicts=%d, ranges=%d\n", " allocnos=%d (big %d), copies=%d, conflicts=%d, ranges=%d\n",
......
...@@ -434,7 +434,7 @@ setup_entered_from_non_parent_p (void) ...@@ -434,7 +434,7 @@ setup_entered_from_non_parent_p (void)
loop_p loop; loop_p loop;
ira_assert (current_loops != NULL); ira_assert (current_loops != NULL);
FOR_EACH_VEC_SAFE_ELT (get_loops (), i, loop) FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop)
if (ira_loop_nodes[i].regno_allocno_map != NULL) if (ira_loop_nodes[i].regno_allocno_map != NULL)
ira_loop_nodes[i].entered_from_non_parent_p ira_loop_nodes[i].entered_from_non_parent_p
= entered_from_non_parent_p (&ira_loop_nodes[i]); = entered_from_non_parent_p (&ira_loop_nodes[i]);
......
...@@ -251,7 +251,7 @@ fix_loop_structure (bitmap changed_bbs) ...@@ -251,7 +251,7 @@ fix_loop_structure (bitmap changed_bbs)
/* Remember the number of loops so we can return how many new loops /* Remember the number of loops so we can return how many new loops
flow_loops_find discovered. */ flow_loops_find discovered. */
old_nloops = number_of_loops (); old_nloops = number_of_loops (cfun);
/* Re-compute loop structure in-place. */ /* Re-compute loop structure in-place. */
flow_loops_find (current_loops); flow_loops_find (current_loops);
...@@ -269,10 +269,10 @@ fix_loop_structure (bitmap changed_bbs) ...@@ -269,10 +269,10 @@ fix_loop_structure (bitmap changed_bbs)
} }
/* Finally free deleted loops. */ /* Finally free deleted loops. */
FOR_EACH_VEC_ELT (*get_loops (), i, loop) FOR_EACH_VEC_ELT (*get_loops (cfun), i, loop)
if (loop && loop->header == NULL) if (loop && loop->header == NULL)
{ {
(*get_loops ())[i] = NULL; (*get_loops (cfun))[i] = NULL;
flow_loop_free (loop); flow_loop_free (loop);
} }
...@@ -287,7 +287,7 @@ fix_loop_structure (bitmap changed_bbs) ...@@ -287,7 +287,7 @@ fix_loop_structure (bitmap changed_bbs)
timevar_pop (TV_LOOP_INIT); timevar_pop (TV_LOOP_INIT);
return number_of_loops () - old_nloops; return number_of_loops (cfun) - old_nloops;
} }
/* Gate for the RTL loop superpass. The actual passes are subpasses. /* Gate for the RTL loop superpass. The actual passes are subpasses.
...@@ -426,7 +426,7 @@ gate_rtl_move_loop_invariants (void) ...@@ -426,7 +426,7 @@ gate_rtl_move_loop_invariants (void)
static unsigned int static unsigned int
rtl_move_loop_invariants (void) rtl_move_loop_invariants (void)
{ {
if (number_of_loops () > 1) if (number_of_loops (cfun) > 1)
move_loop_invariants (); move_loop_invariants ();
return 0; return 0;
} }
...@@ -463,7 +463,7 @@ gate_rtl_unswitch (void) ...@@ -463,7 +463,7 @@ gate_rtl_unswitch (void)
static unsigned int static unsigned int
rtl_unswitch (void) rtl_unswitch (void)
{ {
if (number_of_loops () > 1) if (number_of_loops (cfun) > 1)
unswitch_loops (); unswitch_loops ();
return 0; return 0;
} }
...@@ -499,7 +499,7 @@ gate_rtl_unroll_and_peel_loops (void) ...@@ -499,7 +499,7 @@ gate_rtl_unroll_and_peel_loops (void)
static unsigned int static unsigned int
rtl_unroll_and_peel_loops (void) rtl_unroll_and_peel_loops (void)
{ {
if (number_of_loops () > 1) if (number_of_loops (cfun) > 1)
{ {
int flags = 0; int flags = 0;
if (dump_file) if (dump_file)
...@@ -553,7 +553,7 @@ static unsigned int ...@@ -553,7 +553,7 @@ static unsigned int
rtl_doloop (void) rtl_doloop (void)
{ {
#ifdef HAVE_doloop_end #ifdef HAVE_doloop_end
if (number_of_loops () > 1) if (number_of_loops (cfun) > 1)
doloop_optimize_loops (); doloop_optimize_loops ();
#endif #endif
return 0; return 0;
......
...@@ -673,6 +673,7 @@ input_cfg (struct lto_input_block *ib, struct function *fn, ...@@ -673,6 +673,7 @@ input_cfg (struct lto_input_block *ib, struct function *fn,
struct loops *loops = ggc_alloc_cleared_loops (); struct loops *loops = ggc_alloc_cleared_loops ();
init_loops_structure (fn, loops, n_loops); init_loops_structure (fn, loops, n_loops);
set_loops_for_fn (fn, loops);
/* Input each loop and associate it with its loop header so /* Input each loop and associate it with its loop header so
flow_loops_find can rebuild the loop tree. */ flow_loops_find can rebuild the loop tree. */
...@@ -686,7 +687,6 @@ input_cfg (struct lto_input_block *ib, struct function *fn, ...@@ -686,7 +687,6 @@ input_cfg (struct lto_input_block *ib, struct function *fn,
} }
struct loop *loop = alloc_loop (); struct loop *loop = alloc_loop ();
loop->num = loops->larray->length ();
loop->header = BASIC_BLOCK_FOR_FUNCTION (fn, header_index); loop->header = BASIC_BLOCK_FOR_FUNCTION (fn, header_index);
loop->header->loop_father = loop; loop->header->loop_father = loop;
...@@ -705,7 +705,7 @@ input_cfg (struct lto_input_block *ib, struct function *fn, ...@@ -705,7 +705,7 @@ input_cfg (struct lto_input_block *ib, struct function *fn,
loop->nb_iterations_estimate.high = streamer_read_hwi (ib); loop->nb_iterations_estimate.high = streamer_read_hwi (ib);
} }
loops->larray->quick_push (loop); place_new_loop (fn, loop);
/* flow_loops_find doesn't like loops not in the tree, hook them /* flow_loops_find doesn't like loops not in the tree, hook them
all as siblings of the tree root temporarily. */ all as siblings of the tree root temporarily. */
...@@ -713,7 +713,7 @@ input_cfg (struct lto_input_block *ib, struct function *fn, ...@@ -713,7 +713,7 @@ input_cfg (struct lto_input_block *ib, struct function *fn,
} }
/* Rebuild the loop tree. */ /* Rebuild the loop tree. */
fn->x_current_loops = flow_loops_find (loops); flow_loops_find (loops);
} }
......
...@@ -664,12 +664,12 @@ output_cfg (struct output_block *ob, struct function *fn) ...@@ -664,12 +664,12 @@ output_cfg (struct output_block *ob, struct function *fn)
gcc_assert (cfun == fn); gcc_assert (cfun == fn);
/* Output the number of loops. */ /* Output the number of loops. */
streamer_write_uhwi (ob, number_of_loops ()); streamer_write_uhwi (ob, number_of_loops (fn));
/* Output each loop, skipping the tree root which has number zero. */ /* Output each loop, skipping the tree root which has number zero. */
for (unsigned i = 1; i < number_of_loops (); ++i) for (unsigned i = 1; i < number_of_loops (fn); ++i)
{ {
struct loop *loop = get_loop (i); struct loop *loop = get_loop (fn, i);
/* Write the index of the loop header. That's enough to rebuild /* Write the index of the loop header. That's enough to rebuild
the loop tree on the reader side. Stream -1 for an unused the loop tree on the reader side. Stream -1 for an unused
......
...@@ -1360,7 +1360,7 @@ sms_schedule (void) ...@@ -1360,7 +1360,7 @@ sms_schedule (void)
loop_optimizer_init (LOOPS_HAVE_PREHEADERS loop_optimizer_init (LOOPS_HAVE_PREHEADERS
| LOOPS_HAVE_RECORDED_EXITS); | LOOPS_HAVE_RECORDED_EXITS);
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
{ {
loop_optimizer_finalize (); loop_optimizer_finalize ();
return; /* There are no loops to schedule. */ return; /* There are no loops to schedule. */
...@@ -1384,7 +1384,7 @@ sms_schedule (void) ...@@ -1384,7 +1384,7 @@ sms_schedule (void)
/* Allocate memory to hold the DDG array one entry for each loop. /* Allocate memory to hold the DDG array one entry for each loop.
We use loop->num as index into this array. */ We use loop->num as index into this array. */
g_arr = XCNEWVEC (ddg_ptr, number_of_loops ()); g_arr = XCNEWVEC (ddg_ptr, number_of_loops (cfun));
if (dump_file) if (dump_file)
{ {
......
...@@ -2338,7 +2338,7 @@ tree_estimate_probability (void) ...@@ -2338,7 +2338,7 @@ tree_estimate_probability (void)
tree_bb_level_predictions (); tree_bb_level_predictions ();
record_loop_exits (); record_loop_exits ();
if (number_of_loops () > 1) if (number_of_loops (cfun) > 1)
predict_loops (); predict_loops ();
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
...@@ -2372,7 +2372,7 @@ tree_estimate_probability_driver (void) ...@@ -2372,7 +2372,7 @@ tree_estimate_probability_driver (void)
mark_irreducible_loops (); mark_irreducible_loops ();
nb_loops = number_of_loops (); nb_loops = number_of_loops (cfun);
if (nb_loops > 1) if (nb_loops > 1)
scev_initialize (); scev_initialize ();
...@@ -2694,7 +2694,7 @@ estimate_loops (void) ...@@ -2694,7 +2694,7 @@ estimate_loops (void)
basic_block bb; basic_block bb;
/* Start by estimating the frequencies in the loops. */ /* Start by estimating the frequencies in the loops. */
if (number_of_loops () > 1) if (number_of_loops (cfun) > 1)
estimate_loops_at_level (current_loops->tree_root->inner); estimate_loops_at_level (current_loops->tree_root->inner);
/* Now propagate the frequencies through all the blocks. */ /* Now propagate the frequencies through all the blocks. */
......
...@@ -6586,11 +6586,11 @@ fixup_loop_arrays_after_move (struct function *fn1, struct function *fn2, ...@@ -6586,11 +6586,11 @@ fixup_loop_arrays_after_move (struct function *fn1, struct function *fn2,
struct loop *loop) struct loop *loop)
{ {
/* Discard it from the old loop array. */ /* Discard it from the old loop array. */
(*fn1->x_current_loops->larray)[loop->num] = NULL; (*get_loops (fn1))[loop->num] = NULL;
/* Place it in the new loop array, assigning it a new number. */ /* Place it in the new loop array, assigning it a new number. */
loop->num = vec_safe_length (fn2->x_current_loops->larray); loop->num = number_of_loops (fn2);
vec_safe_push (fn2->x_current_loops->larray, loop); vec_safe_push (loops_for_fn (fn2)->larray, loop);
/* Recurse to children. */ /* Recurse to children. */
for (loop = loop->inner; loop; loop = loop->next) for (loop = loop->inner; loop; loop = loop->next)
...@@ -6717,9 +6717,10 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, ...@@ -6717,9 +6717,10 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
} }
/* Initialize an empty loop tree. */ /* Initialize an empty loop tree. */
dest_cfun->x_current_loops = ggc_alloc_cleared_loops (); struct loops *loops = ggc_alloc_cleared_loops ();
init_loops_structure (dest_cfun, dest_cfun->x_current_loops, 1); init_loops_structure (dest_cfun, loops, 1);
dest_cfun->x_current_loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES; loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES;
set_loops_for_fn (dest_cfun, loops);
/* Move the outlined loop tree part. */ /* Move the outlined loop tree part. */
FOR_EACH_VEC_ELT (bbs, i, bb) FOR_EACH_VEC_ELT (bbs, i, bb)
...@@ -6729,25 +6730,25 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, ...@@ -6729,25 +6730,25 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
{ {
struct loop *loop = bb->loop_father; struct loop *loop = bb->loop_father;
flow_loop_tree_node_remove (bb->loop_father); flow_loop_tree_node_remove (bb->loop_father);
flow_loop_tree_node_add (dest_cfun->x_current_loops->tree_root, loop); flow_loop_tree_node_add (get_loop (dest_cfun, 0), loop);
fixup_loop_arrays_after_move (saved_cfun, cfun, loop); fixup_loop_arrays_after_move (saved_cfun, cfun, loop);
} }
/* Remove loop exits from the outlined region. */ /* Remove loop exits from the outlined region. */
if (saved_cfun->x_current_loops->exits) if (loops_for_fn (saved_cfun)->exits)
FOR_EACH_EDGE (e, ei, bb->succs) FOR_EACH_EDGE (e, ei, bb->succs)
{ {
void **slot = htab_find_slot_with_hash void **slot = htab_find_slot_with_hash
(saved_cfun->x_current_loops->exits, e, (loops_for_fn (saved_cfun)->exits, e,
htab_hash_pointer (e), NO_INSERT); htab_hash_pointer (e), NO_INSERT);
if (slot) if (slot)
htab_clear_slot (saved_cfun->x_current_loops->exits, slot); htab_clear_slot (loops_for_fn (saved_cfun)->exits, slot);
} }
} }
/* Adjust the number of blocks in the tree root of the outlined part. */ /* Adjust the number of blocks in the tree root of the outlined part. */
dest_cfun->x_current_loops->tree_root->num_nodes = bbs.length () + 2; get_loop (dest_cfun, 0)->num_nodes = bbs.length () + 2;
/* Setup a mapping to be used by move_block_to_fn. */ /* Setup a mapping to be used by move_block_to_fn. */
loop->aux = current_loops->tree_root; loop->aux = current_loops->tree_root;
...@@ -7226,7 +7227,7 @@ debug_loop (struct loop *loop, int verbosity) ...@@ -7226,7 +7227,7 @@ debug_loop (struct loop *loop, int verbosity)
DEBUG_FUNCTION void DEBUG_FUNCTION void
debug_loop_num (unsigned num, int verbosity) debug_loop_num (unsigned num, int verbosity)
{ {
debug_loop (get_loop (num), verbosity); debug_loop (get_loop (cfun, num), verbosity);
} }
/* Return true if BB ends with a call, possibly followed by some /* Return true if BB ends with a call, possibly followed by some
......
...@@ -517,7 +517,7 @@ chrec_evaluate (unsigned var, tree chrec, tree n, unsigned int k) ...@@ -517,7 +517,7 @@ chrec_evaluate (unsigned var, tree chrec, tree n, unsigned int k)
{ {
tree arg0, arg1, binomial_n_k; tree arg0, arg1, binomial_n_k;
tree type = TREE_TYPE (chrec); tree type = TREE_TYPE (chrec);
struct loop *var_loop = get_loop (var); struct loop *var_loop = get_loop (cfun, var);
while (TREE_CODE (chrec) == POLYNOMIAL_CHREC while (TREE_CODE (chrec) == POLYNOMIAL_CHREC
&& flow_loop_nested_p (var_loop, get_chrec_loop (chrec))) && flow_loop_nested_p (var_loop, get_chrec_loop (chrec)))
...@@ -690,7 +690,7 @@ tree ...@@ -690,7 +690,7 @@ tree
hide_evolution_in_other_loops_than_loop (tree chrec, hide_evolution_in_other_loops_than_loop (tree chrec,
unsigned loop_num) unsigned loop_num)
{ {
struct loop *loop = get_loop (loop_num), *chloop; struct loop *loop = get_loop (cfun, loop_num), *chloop;
if (automatically_generated_chrec_p (chrec)) if (automatically_generated_chrec_p (chrec))
return chrec; return chrec;
...@@ -731,7 +731,7 @@ chrec_component_in_loop_num (tree chrec, ...@@ -731,7 +731,7 @@ chrec_component_in_loop_num (tree chrec,
bool right) bool right)
{ {
tree component; tree component;
struct loop *loop = get_loop (loop_num), *chloop; struct loop *loop = get_loop (cfun, loop_num), *chloop;
if (automatically_generated_chrec_p (chrec)) if (automatically_generated_chrec_p (chrec))
return chrec; return chrec;
...@@ -813,7 +813,7 @@ reset_evolution_in_loop (unsigned loop_num, ...@@ -813,7 +813,7 @@ reset_evolution_in_loop (unsigned loop_num,
tree chrec, tree chrec,
tree new_evol) tree new_evol)
{ {
struct loop *loop = get_loop (loop_num); struct loop *loop = get_loop (cfun, loop_num);
if (POINTER_TYPE_P (chrec_type (chrec))) if (POINTER_TYPE_P (chrec_type (chrec)))
gcc_assert (ptrofftype_p (chrec_type (new_evol))); gcc_assert (ptrofftype_p (chrec_type (new_evol)));
...@@ -986,14 +986,14 @@ evolution_function_is_invariant_rec_p (tree chrec, int loopnum) ...@@ -986,14 +986,14 @@ evolution_function_is_invariant_rec_p (tree chrec, int loopnum)
if (TREE_CODE (chrec) == SSA_NAME if (TREE_CODE (chrec) == SSA_NAME
&& (loopnum == 0 && (loopnum == 0
|| expr_invariant_in_loop_p (get_loop (loopnum), chrec))) || expr_invariant_in_loop_p (get_loop (cfun, loopnum), chrec)))
return true; return true;
if (TREE_CODE (chrec) == POLYNOMIAL_CHREC) if (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
{ {
if (CHREC_VARIABLE (chrec) == (unsigned) loopnum if (CHREC_VARIABLE (chrec) == (unsigned) loopnum
|| flow_loop_nested_p (get_loop (loopnum), || flow_loop_nested_p (get_loop (cfun, loopnum),
get_loop (CHREC_VARIABLE (chrec))) get_chrec_loop (chrec))
|| !evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec), || !evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec),
loopnum) loopnum)
|| !evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec), || !evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec),
......
...@@ -1818,7 +1818,7 @@ main_tree_if_conversion (void) ...@@ -1818,7 +1818,7 @@ main_tree_if_conversion (void)
bool changed = false; bool changed = false;
unsigned todo = 0; unsigned todo = 0;
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
FOR_EACH_LOOP (li, loop, 0) FOR_EACH_LOOP (li, loop, 0)
......
...@@ -2223,7 +2223,7 @@ copy_loops (bitmap blocks_to_copy, ...@@ -2223,7 +2223,7 @@ copy_loops (bitmap blocks_to_copy,
copy_loop_info (src_loop, dest_loop); copy_loop_info (src_loop, dest_loop);
/* Finally place it into the loop array and the loop tree. */ /* Finally place it into the loop array and the loop tree. */
place_new_loop (dest_loop); place_new_loop (cfun, dest_loop);
flow_loop_tree_node_add (dest_parent, dest_loop); flow_loop_tree_node_add (dest_parent, dest_loop);
/* Recurse. */ /* Recurse. */
...@@ -2332,11 +2332,11 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale, ...@@ -2332,11 +2332,11 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale,
} }
/* Duplicate the loop tree, if available and wanted. */ /* Duplicate the loop tree, if available and wanted. */
if (id->src_cfun->x_current_loops != NULL if (loops_for_fn (src_cfun) != NULL
&& current_loops != NULL) && current_loops != NULL)
{ {
copy_loops (blocks_to_copy, entry_block_map->loop_father, copy_loops (blocks_to_copy, entry_block_map->loop_father,
id->src_cfun->x_current_loops->tree_root); get_loop (src_cfun, 0));
/* Defer to cfgcleanup to update loop-father fields of basic-blocks. */ /* Defer to cfgcleanup to update loop-father fields of basic-blocks. */
loops_state_set (LOOPS_NEED_FIXUP); loops_state_set (LOOPS_NEED_FIXUP);
} }
...@@ -5199,7 +5199,7 @@ tree_function_versioning (tree old_decl, tree new_decl, ...@@ -5199,7 +5199,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
} }
/* Set up the destination functions loop tree. */ /* Set up the destination functions loop tree. */
if (DECL_STRUCT_FUNCTION (old_decl)->x_current_loops) if (loops_for_fn (DECL_STRUCT_FUNCTION (old_decl)) != NULL)
{ {
cfun->curr_properties &= ~PROP_loops; cfun->curr_properties &= ~PROP_loops;
loop_optimizer_init (AVOID_CFG_MODIFICATIONS); loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
......
...@@ -774,7 +774,7 @@ rdg_flag_loop_exits (struct graph *rdg, bitmap loops, partition_t partition, ...@@ -774,7 +774,7 @@ rdg_flag_loop_exits (struct graph *rdg, bitmap loops, partition_t partition,
conds.create (3); conds.create (3);
EXECUTE_IF_SET_IN_BITMAP (loops, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (loops, 0, i, bi)
collect_condition_stmts (get_loop (i), &conds); collect_condition_stmts (get_loop (cfun, i), &conds);
while (!conds.is_empty ()) while (!conds.is_empty ())
{ {
...@@ -787,7 +787,7 @@ rdg_flag_loop_exits (struct graph *rdg, bitmap loops, partition_t partition, ...@@ -787,7 +787,7 @@ rdg_flag_loop_exits (struct graph *rdg, bitmap loops, partition_t partition,
EXECUTE_IF_SET_IN_BITMAP (new_loops, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (new_loops, 0, i, bi)
if (bitmap_set_bit (loops, i)) if (bitmap_set_bit (loops, i))
collect_condition_stmts (get_loop (i), &conds); collect_condition_stmts (get_loop (cfun, i), &conds);
BITMAP_FREE (new_loops); BITMAP_FREE (new_loops);
} }
......
...@@ -422,7 +422,7 @@ chrec_contains_symbols_defined_in_loop (const_tree chrec, unsigned loop_nb) ...@@ -422,7 +422,7 @@ chrec_contains_symbols_defined_in_loop (const_tree chrec, unsigned loop_nb)
def = SSA_NAME_DEF_STMT (chrec); def = SSA_NAME_DEF_STMT (chrec);
def_loop = loop_containing_stmt (def); def_loop = loop_containing_stmt (def);
loop = get_loop (loop_nb); loop = get_loop (cfun, loop_nb);
if (def_loop == NULL) if (def_loop == NULL)
return false; return false;
...@@ -629,7 +629,7 @@ add_to_evolution_1 (unsigned loop_nb, tree chrec_before, tree to_add, ...@@ -629,7 +629,7 @@ add_to_evolution_1 (unsigned loop_nb, tree chrec_before, tree to_add,
gimple at_stmt) gimple at_stmt)
{ {
tree type, left, right; tree type, left, right;
struct loop *loop = get_loop (loop_nb), *chloop; struct loop *loop = get_loop (cfun, loop_nb), *chloop;
switch (TREE_CODE (chrec_before)) switch (TREE_CODE (chrec_before))
{ {
...@@ -3258,7 +3258,7 @@ scev_const_prop (void) ...@@ -3258,7 +3258,7 @@ scev_const_prop (void)
loop_iterator li; loop_iterator li;
gimple_stmt_iterator psi; gimple_stmt_iterator psi;
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
......
...@@ -64,7 +64,7 @@ instantiate_parameters (struct loop *loop, tree chrec) ...@@ -64,7 +64,7 @@ instantiate_parameters (struct loop *loop, tree chrec)
static inline struct loop * static inline struct loop *
get_chrec_loop (const_tree chrec) get_chrec_loop (const_tree chrec)
{ {
return get_loop (CHREC_VARIABLE (chrec)); return get_loop (cfun, CHREC_VARIABLE (chrec));
} }
#endif /* GCC_TREE_SCALAR_EVOLUTION_H */ #endif /* GCC_TREE_SCALAR_EVOLUTION_H */
...@@ -136,7 +136,7 @@ copy_loop_headers (void) ...@@ -136,7 +136,7 @@ copy_loop_headers (void)
loop_optimizer_init (LOOPS_HAVE_PREHEADERS loop_optimizer_init (LOOPS_HAVE_PREHEADERS
| LOOPS_HAVE_SIMPLE_LATCHES); | LOOPS_HAVE_SIMPLE_LATCHES);
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
{ {
loop_optimizer_finalize (); loop_optimizer_finalize ();
return 0; return 0;
......
...@@ -1593,7 +1593,7 @@ analyze_memory_references (void) ...@@ -1593,7 +1593,7 @@ analyze_memory_references (void)
/* Initialize bb_loop_postorder with a mapping from loop->num to /* Initialize bb_loop_postorder with a mapping from loop->num to
its postorder index. */ its postorder index. */
i = 0; i = 0;
bb_loop_postorder = XNEWVEC (unsigned, number_of_loops ()); bb_loop_postorder = XNEWVEC (unsigned, number_of_loops (cfun));
FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST) FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
bb_loop_postorder[loop->num] = i++; bb_loop_postorder[loop->num] = i++;
/* Collect all basic-blocks in loops and sort them after their /* Collect all basic-blocks in loops and sort them after their
...@@ -2563,14 +2563,14 @@ tree_ssa_lim_initialize (void) ...@@ -2563,14 +2563,14 @@ tree_ssa_lim_initialize (void)
memory_accesses.refs_list.quick_push memory_accesses.refs_list.quick_push
(mem_ref_alloc (error_mark_node, 0, UNANALYZABLE_MEM_ID)); (mem_ref_alloc (error_mark_node, 0, UNANALYZABLE_MEM_ID));
memory_accesses.refs_in_loop.create (number_of_loops ()); memory_accesses.refs_in_loop.create (number_of_loops (cfun));
memory_accesses.refs_in_loop.quick_grow (number_of_loops ()); memory_accesses.refs_in_loop.quick_grow (number_of_loops (cfun));
memory_accesses.refs_stored_in_loop.create (number_of_loops ()); memory_accesses.refs_stored_in_loop.create (number_of_loops (cfun));
memory_accesses.refs_stored_in_loop.quick_grow (number_of_loops ()); memory_accesses.refs_stored_in_loop.quick_grow (number_of_loops (cfun));
memory_accesses.all_refs_stored_in_loop.create (number_of_loops ()); memory_accesses.all_refs_stored_in_loop.create (number_of_loops (cfun));
memory_accesses.all_refs_stored_in_loop.quick_grow (number_of_loops ()); memory_accesses.all_refs_stored_in_loop.quick_grow (number_of_loops (cfun));
for (i = 0; i < number_of_loops (); i++) for (i = 0; i < number_of_loops (cfun); i++)
{ {
bitmap_initialize (&memory_accesses.refs_in_loop[i], bitmap_initialize (&memory_accesses.refs_in_loop[i],
&lim_bitmap_obstack); &lim_bitmap_obstack);
......
...@@ -493,7 +493,7 @@ rewrite_into_loop_closed_ssa (bitmap changed_bbs, unsigned update_flag) ...@@ -493,7 +493,7 @@ rewrite_into_loop_closed_ssa (bitmap changed_bbs, unsigned update_flag)
bitmap names_to_rename; bitmap names_to_rename;
loops_state_set (LOOP_CLOSED_SSA); loops_state_set (LOOP_CLOSED_SSA);
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return; return;
/* If the pass has caused the SSA form to be out-of-date, update it /* If the pass has caused the SSA form to be out-of-date, update it
...@@ -516,7 +516,7 @@ rewrite_into_loop_closed_ssa (bitmap changed_bbs, unsigned update_flag) ...@@ -516,7 +516,7 @@ rewrite_into_loop_closed_ssa (bitmap changed_bbs, unsigned update_flag)
{ {
/* An array of bitmaps where LOOP_EXITS[I] is the set of basic blocks /* An array of bitmaps where LOOP_EXITS[I] is the set of basic blocks
that are the destination of an edge exiting loop number I. */ that are the destination of an edge exiting loop number I. */
bitmap *loop_exits = XNEWVEC (bitmap, number_of_loops ()); bitmap *loop_exits = XNEWVEC (bitmap, number_of_loops (cfun));
get_loops_exits (loop_exits); get_loops_exits (loop_exits);
/* Add the PHI nodes on exits of the loops for the names we need to /* Add the PHI nodes on exits of the loops for the names we need to
...@@ -578,7 +578,7 @@ verify_loop_closed_ssa (bool verify_ssa_p) ...@@ -578,7 +578,7 @@ verify_loop_closed_ssa (bool verify_ssa_p)
edge e; edge e;
edge_iterator ei; edge_iterator ei;
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return; return;
if (verify_ssa_p) if (verify_ssa_p)
......
...@@ -74,7 +74,7 @@ tree_ssa_loop_init (void) ...@@ -74,7 +74,7 @@ tree_ssa_loop_init (void)
regions into reducible. */ regions into reducible. */
scev_initialize (); scev_initialize ();
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
return 0; return 0;
...@@ -105,7 +105,7 @@ struct gimple_opt_pass pass_tree_loop_init = ...@@ -105,7 +105,7 @@ struct gimple_opt_pass pass_tree_loop_init =
static unsigned int static unsigned int
tree_ssa_loop_im (void) tree_ssa_loop_im (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
return tree_ssa_lim (); return tree_ssa_lim ();
...@@ -142,7 +142,7 @@ struct gimple_opt_pass pass_lim = ...@@ -142,7 +142,7 @@ struct gimple_opt_pass pass_lim =
static unsigned int static unsigned int
tree_ssa_loop_unswitch (void) tree_ssa_loop_unswitch (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
return tree_ssa_unswitch_loops (); return tree_ssa_unswitch_loops ();
...@@ -216,7 +216,7 @@ struct gimple_opt_pass pass_predcom = ...@@ -216,7 +216,7 @@ struct gimple_opt_pass pass_predcom =
static unsigned int static unsigned int
tree_vectorize (void) tree_vectorize (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
return vectorize_loops (); return vectorize_loops ();
...@@ -323,7 +323,7 @@ struct gimple_opt_pass pass_graphite_transforms = ...@@ -323,7 +323,7 @@ struct gimple_opt_pass pass_graphite_transforms =
static unsigned int static unsigned int
check_data_deps (void) check_data_deps (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
tree_check_data_deps (); tree_check_data_deps ();
...@@ -361,7 +361,7 @@ struct gimple_opt_pass pass_check_data_deps = ...@@ -361,7 +361,7 @@ struct gimple_opt_pass pass_check_data_deps =
static unsigned int static unsigned int
tree_ssa_loop_ivcanon (void) tree_ssa_loop_ivcanon (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
return canonicalize_induction_variables (); return canonicalize_induction_variables ();
...@@ -428,7 +428,7 @@ struct gimple_opt_pass pass_scev_cprop = ...@@ -428,7 +428,7 @@ struct gimple_opt_pass pass_scev_cprop =
static unsigned int static unsigned int
tree_ssa_loop_bounds (void) tree_ssa_loop_bounds (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
estimate_numbers_of_iterations (); estimate_numbers_of_iterations ();
...@@ -461,7 +461,7 @@ struct gimple_opt_pass pass_record_bounds = ...@@ -461,7 +461,7 @@ struct gimple_opt_pass pass_record_bounds =
static unsigned int static unsigned int
tree_complete_unroll (void) tree_complete_unroll (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
return tree_unroll_loops_completely (flag_unroll_loops return tree_unroll_loops_completely (flag_unroll_loops
...@@ -504,7 +504,7 @@ tree_complete_unroll_inner (void) ...@@ -504,7 +504,7 @@ tree_complete_unroll_inner (void)
loop_optimizer_init (LOOPS_NORMAL loop_optimizer_init (LOOPS_NORMAL
| LOOPS_HAVE_RECORDED_EXITS); | LOOPS_HAVE_RECORDED_EXITS);
if (number_of_loops () > 1) if (number_of_loops (cfun) > 1)
{ {
scev_initialize (); scev_initialize ();
ret = tree_unroll_loops_completely (optimize >= 3, false); ret = tree_unroll_loops_completely (optimize >= 3, false);
...@@ -553,7 +553,7 @@ gate_tree_parallelize_loops (void) ...@@ -553,7 +553,7 @@ gate_tree_parallelize_loops (void)
static unsigned static unsigned
tree_parallelize_loops (void) tree_parallelize_loops (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
if (parallelize_loops ()) if (parallelize_loops ())
...@@ -586,7 +586,7 @@ struct gimple_opt_pass pass_parallelize_loops = ...@@ -586,7 +586,7 @@ struct gimple_opt_pass pass_parallelize_loops =
static unsigned int static unsigned int
tree_ssa_loop_prefetch (void) tree_ssa_loop_prefetch (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
return tree_ssa_prefetch_arrays (); return tree_ssa_prefetch_arrays ();
...@@ -623,7 +623,7 @@ struct gimple_opt_pass pass_loop_prefetch = ...@@ -623,7 +623,7 @@ struct gimple_opt_pass pass_loop_prefetch =
static unsigned int static unsigned int
tree_ssa_loop_ivopts (void) tree_ssa_loop_ivopts (void)
{ {
if (number_of_loops () <= 1) if (number_of_loops (cfun) <= 1)
return 0; return 0;
tree_ssa_iv_optimize (); tree_ssa_iv_optimize ();
......
...@@ -2117,7 +2117,8 @@ execute_update_addresses_taken (void) ...@@ -2117,7 +2117,8 @@ execute_update_addresses_taken (void)
} }
/* Update SSA form here, we are called as non-pass as well. */ /* Update SSA form here, we are called as non-pass as well. */
if (number_of_loops () > 1 && loops_state_satisfies_p (LOOP_CLOSED_SSA)) if (number_of_loops (cfun) > 1
&& loops_state_satisfies_p (LOOP_CLOSED_SSA))
rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa); rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
else else
update_ssa (TODO_update_ssa); update_ssa (TODO_update_ssa);
......
...@@ -87,7 +87,7 @@ vectorize_loops (void) ...@@ -87,7 +87,7 @@ vectorize_loops (void)
loop_iterator li; loop_iterator li;
struct loop *loop; struct loop *loop;
vect_loops_num = number_of_loops (); vect_loops_num = number_of_loops (cfun);
/* Bail out if there are no loops. */ /* Bail out if there are no loops. */
if (vect_loops_num <= 1) if (vect_loops_num <= 1)
...@@ -139,7 +139,7 @@ vectorize_loops (void) ...@@ -139,7 +139,7 @@ vectorize_loops (void)
{ {
loop_vec_info loop_vinfo; loop_vec_info loop_vinfo;
loop = get_loop (i); loop = get_loop (cfun, i);
if (!loop) if (!loop)
continue; continue;
loop_vinfo = (loop_vec_info) loop->aux; loop_vinfo = (loop_vec_info) loop->aux;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment