INLINE void add_loop_node(ir_loop *loop, ir_node *n);
static ir_graph *outermost_ir_graph; /* The outermost graph the scc is computed
- for */
+ for */
static ir_loop *current_loop; /* Current loop construction is working
- on. */
+ on. */
static int loop_node_cnt = 0; /* Counts the number of allocated loop nodes.
- Each loop node gets a unique number.
- What for? ev. remove. @@@ */
+ Each loop node gets a unique number.
+ What for? ev. remove. @@@ */
static int current_dfn = 1; /* Counter to generate depth first numbering
- of visited nodes. */
+ of visited nodes. */
+
+static int max_loop_depth = 0;
void link_to_reg_end (ir_node *n, void *env);
void set_projx_link(ir_node *cb_projx, ir_node *end_projx);
son->outer_loop = father;
add_loop_son(father, son);
son->depth = father->depth+1;
+ if (son->depth > max_loop_depth) max_loop_depth = son->depth;
} else { /* The root loop */
son->outer_loop = son;
son->depth = 0;
#endif
}
+int is_ir_loop(const void *thing) {
+ return (get_kind(thing) == k_ir_loop);
+}
+
/* The outermost loop is remarked in the surrounding graph. */
void set_irg_loop(ir_graph *irg, ir_loop *loop) {
assert(irg);
init_node (ir_node *n, void *env) {
set_irn_link (n, new_scc_info());
clear_backedges(n);
-#if 0
- /* Also init nodes not visible in intraproc_view. */
- /* @@@ init_node is called for too many nodes -- this wastes memory!.
- The mem is not lost as its on the obstack. */
- if (get_irn_op(n) == op_Filter) {
- for (i = 0; i < get_Filter_n_cg_preds(n); i++)
- init_node(get_Filter_cg_pred(n, i), NULL);
- }
- if (get_irn_op(n) == op_Block) {
- for (i = 0; i < get_Block_cg_n_cfgpreds(n); i++) {
- init_node(get_Block_cg_cfgpred(n, i), NULL);
- }
- }
- /* The following pattern matches only after a call from above pattern. */
- if ((get_irn_op(n) == op_Proj) /*&& (get_Proj_proj(n) == 0)*/) {
- /* @@@ init_node is called for every proj -- this wastes memory!.
- The mem is not lost as its on the obstack. */
- ir_node *cb = get_Proj_pred(n);
- if ((get_irn_op(cb) == op_CallBegin) ||
- (get_irn_op(cb) == op_EndReg) ||
- (get_irn_op(cb) == op_EndExcept)) {
- init_node(cb, NULL);
- init_node(get_nodes_block(cb), NULL);
- }
- }
-#endif
}
static INLINE void
Besides current_ir_graph is not set properly. */
if ((get_irn_op(n) == op_Block) &&
(n == get_irg_start_block(current_ir_graph))) {
- if ((!interprocedural_view) ||
+ if ((!get_interprocedural_view()) ||
(current_ir_graph == outermost_ir_graph))
return true;
}
test showed the loop tree is deeper. */
if (get_irn_op(n) == op_Phi ||
get_irn_op(n) == op_Block ||
- (get_irn_op(n) == op_Filter && interprocedural_view) ||
+ (get_irn_op(n) == op_Filter && get_interprocedural_view()) ||
(get_irg_pinned(get_irn_irg(n)) == op_pin_state_floats &&
- get_op_pinned(get_irn_op(n)) == op_pin_state_floats))
+ get_irn_pinned(n) == op_pin_state_floats))
// Here we could test for backedge at -1 which is illegal
return 0;
else
ir_op *op = get_irn_op(n);
return ((op == op_Block) ||
(op == op_Phi) ||
- ((op == op_Filter) && interprocedural_view));
+ ((op == op_Filter) && get_interprocedural_view()));
}
/* Returns true if n is a loop header, i.e., it is a Block, Phi
/* Constructs backedge information for irg. In interprocedural view constructs
backedges for all methods called by irg, too. */
-void construct_backedges(ir_graph *irg) {
+int construct_backedges(ir_graph *irg) {
ir_graph *rem = current_ir_graph;
ir_loop *head_rem;
- assert(!interprocedural_view &&
+ assert(!get_interprocedural_view() &&
"not implemented, use construct_ip_backedges");
+ max_loop_depth = 0;
current_ir_graph = irg;
outermost_ir_graph = irg;
}
*/
current_ir_graph = rem;
-}
-
-
-#if 0
-void construct_ip_backedges (void) {
- ir_graph *rem = current_ir_graph;
- int rem_ipv = interprocedural_view;
- int i, j;
-
- outermost_ir_graph = get_irp_main_irg();
-
- init_ip_scc();
-
- current_loop = NULL;
- new_loop(); /* sets current_loop */
- interprocedural_view = 1;
- inc_max_irg_visited();
- for (i = 0; i < get_irp_n_irgs(); i++)
- set_irg_visited(get_irp_irg(i), get_max_irg_visited());
-
- for (i = 0; i < get_irp_n_irgs(); i++) {
- ir_node *sb;
- current_ir_graph = get_irp_irg(i);
- /* Find real entry points */
- sb = get_irg_start_block(current_ir_graph);
- if ((get_Block_n_cfgpreds(sb) > 1) ||
- (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb)) continue;
- /* Compute scc for this graph */
- outermost_ir_graph = current_ir_graph;
- set_irg_visited(outermost_ir_graph, get_max_irg_visited());
- scc(get_irg_end(current_ir_graph));
- for (j = 0; j < get_End_n_keepalives(get_irg_end(outermost_ir_graph)); j++)
- scc(get_End_keepalive(get_irg_end(outermost_ir_graph), j));
- }
+ return max_loop_depth;
+}
- set_irg_loop(outermost_ir_graph, current_loop);
- set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
- assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
- current_ir_graph = rem;
- interprocedural_view = rem_ipv;
-}
-#else
-void construct_ip_backedges (void) {
+int construct_ip_backedges (void) {
ir_graph *rem = current_ir_graph;
- int rem_ipv = interprocedural_view;
+ int rem_ipv = get_interprocedural_view();
int i;
+ max_loop_depth = 0;
assert(get_irp_ip_view_state() == ip_view_valid);
outermost_ir_graph = get_irp_main_irg();
current_loop = NULL;
new_loop(); /* sets current_loop */
- interprocedural_view = 1;
+ set_interprocedural_view(true);
inc_max_irg_visited();
for (i = 0; i < get_irp_n_irgs(); i++)
assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
current_ir_graph = rem;
- interprocedural_view = rem_ipv;
+ set_interprocedural_view(rem_ipv);
+ return max_loop_depth;
}
-#endif
+
void my_construct_ip_backedges (void) {
ir_graph *rem = current_ir_graph;
- int rem_ipv = interprocedural_view;
+ int rem_ipv = get_interprocedural_view();
int i;
assert(get_irp_ip_view_state() == ip_view_valid);
current_loop = NULL;
new_loop(); /* sets current_loop */
- interprocedural_view = 1;
+ set_interprocedural_view(true);
inc_max_irg_visited();
for (i = 0; i < get_irp_n_irgs(); i++)
assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
current_ir_graph = rem;
- interprocedural_view = rem_ipv;
+ set_interprocedural_view(rem_ipv);
}
static void reset_backedges(ir_node *n) {
if (is_possible_loop_head(n)) {
- int rem = interprocedural_view;
- interprocedural_view = 1;
+ int rem = get_interprocedural_view();
+
+ set_interprocedural_view(true);
clear_backedges(n);
- interprocedural_view = 0;
+ set_interprocedural_view(true);
clear_backedges(n);
- interprocedural_view = rem;
+ set_interprocedural_view(rem);
}
}
void free_all_loop_information (void) {
int i;
- int rem = interprocedural_view;
- interprocedural_view = 1; /* To visit all filter nodes */
+ int rem = get_interprocedural_view();
+ set_interprocedural_view(true); /* To visit all filter nodes */
for (i = 0; i < get_irp_n_irgs(); i++) {
free_loop_information(get_irp_irg(i));
}
- interprocedural_view = rem;
+ set_interprocedural_view(rem);
}