+void dump_all_ir_graphs(dump_graph_func *dmp_grph, const char *suffix) {
+ int i, n_irgs = get_irp_n_irgs();
+ for (i = 0; i < n_irgs; ++i) {
+ dmp_grph(get_irp_irg(i), suffix);
+ }
+}
+
+
+/*--------------------------------------------------------------------------------*
+ * Dumps a stand alone loop graph with firm nodes which belong to one loop node *
+ * packed together in one subgraph/box *
+ *--------------------------------------------------------------------------------*/
+
+void dump_loops_standalone(FILE *F, ir_loop *loop) {
+ int i = 0, loop_node_started = 0, son_number = 0, first = 0;
+ loop_element le;
+ ir_loop *son = NULL;
+
+ /* Dump a new loop node. */
+ dump_loop_node(F, loop);
+
+ /* Dump the loop elements. */
+
+ for(i = 0; i < get_loop_n_elements(loop); i++) {
+ le = get_loop_element(loop, i);
+ son = le.son;
+ if (get_kind(son) == k_ir_loop) {
+
+ /* We are a loop son -> Recurse */
+
+ if(loop_node_started) { /* Close the "firm-nodes" node first if we started one. */
+ fprintf(F, "\" }\n");
+ fprintf (F, "edge: {sourcename: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "\" targetname: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "-%d-nodes\" label:\"%d...%d\"}\n", first, first, i-1);
+ loop_node_started = 0;
+ }
+ dump_loop_son_edge(F, loop, son_number++);
+ dump_loops_standalone(F, son);
+ } else if (get_kind(son) == k_ir_node) {
+ /* We are a loop node -> Collect firm nodes */
+
+ ir_node *n = le.node;
+ int bad = 0;
+
+ if (!loop_node_started) {
+ /* Start a new node which contains all firm nodes of the current loop */
+ fprintf (F, "node: { title: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "-%d-nodes\" color: lightyellow label: \"", i);
+ loop_node_started = 1;
+ first = i;
+ }
+ else
+ fprintf(F, "\n");
+
+ bad |= dump_node_opcode(F, n);
+ bad |= dump_node_mode(F, n);
+ bad |= dump_node_typeinfo(F, n);
+ fprintf (F, " ");
+ bad |= dump_node_nodeattr(F, n);
+ fprintf (F, " %ld", get_irn_node_nr(n));
+ /* Causes indeterministic output: if (is_Block(n)) fprintf (F, "\t ->%d", (int)get_irn_link(n)); */
+ if (has_backedges(n)) fprintf(F, "\t loop head!");
+ } else { /* for callgraph loop tree */
+ ir_graph *n;
+ assert(get_kind(son) == k_ir_graph);
+
+ /* We are a loop node -> Collect firm graphs */
+ n = (ir_graph *)le.node;
+ if (!loop_node_started) {
+ /* Start a new node which contains all firm nodes of the current loop */
+ fprintf (F, "node: { title: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "-%d-nodes\" color: lightyellow label: \"", i);
+ loop_node_started = 1;
+ first = i;
+ }
+ else
+ fprintf(F, "\n");
+ fprintf (F, " %s", get_irg_dump_name(n));
+ /* fprintf (F, " %s (depth %d)", get_irg_dump_name(n), n->callgraph_weighted_loop_depth); */
+ }
+ }
+
+ if (loop_node_started) {
+ fprintf(F, "\" }\n");
+ fprintf (F, "edge: {sourcename: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "\" targetname: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "-%d-nodes\" label:\"%d...%d\"}\n", first, first, i-1);
+ loop_node_started = 0;
+ }
+}
+
+void dump_loop_tree(ir_graph *irg, const char *suffix)
+{
+ FILE *f;
+ ir_graph *rem = current_ir_graph;
+ int el_rem = edge_label;
+ edge_label = 1;
+
+ /* if a filter is set, dump only the irg's that match the filter */
+ if (strncmp(get_entity_name(get_irg_entity(irg)), dump_file_filter, strlen(dump_file_filter)) != 0)
+ return;
+
+ current_ir_graph = irg;
+
+ f = vcg_open(irg, suffix, "-looptree");
+ dump_vcg_header(f, get_irg_dump_name(irg), "top_to_bottom");
+
+ if (get_irg_loop(irg)) dump_loops_standalone(f, get_irg_loop(irg));
+
+ vcg_close(f);
+
+ edge_label = el_rem;
+ current_ir_graph = rem;
+}
+
+void dump_callgraph_loop_tree(const char *suffix) {
+ FILE *F;
+ F = vcg_open_name("Callgraph_looptree", suffix);
+ dump_vcg_header(F, "callgraph looptree", "top_to_bottom");
+ dump_loops_standalone(F, irp->outermost_cg_loop);
+ vcg_close(F);
+}
+
+
+/*-----------------------------------------------------------------------------*/
+/* Dumps the firm nodes in the loop tree to a graph along with the loop nodes. */
+/*-----------------------------------------------------------------------------*/
+
+void collect_nodeloop(FILE *F, ir_loop *loop, eset *loopnodes) {
+ int i, son_number = 0, node_number = 0;
+
+ if (dump_loop_information_flag) dump_loop_node(F, loop);
+
+ for (i = 0; i < get_loop_n_elements(loop); i++) {
+ loop_element le = get_loop_element(loop, i);
+ if (*(le.kind) == k_ir_loop) {
+ if (dump_loop_information_flag) dump_loop_son_edge(F, loop, son_number++);
+ /* Recur */
+ collect_nodeloop(F, le.son, loopnodes);
+ } else {
+ if (dump_loop_information_flag) dump_loop_node_edge(F, loop, node_number++);
+ eset_insert(loopnodes, le.node);
+ }
+ }
+}
+
+void collect_nodeloop_external_nodes(ir_loop *loop, eset *loopnodes, eset *extnodes) {
+ int i, j, start;
+
+ for(i = 0; i < get_loop_n_elements(loop); i++) {
+ loop_element le = get_loop_element(loop, i);
+ if (*(le.kind) == k_ir_loop) {
+ /* Recur */
+ collect_nodeloop_external_nodes(le.son, loopnodes, extnodes);
+ } else {
+ if (is_Block(le.node)) start = 0; else start = -1;
+ for (j = start; j < get_irn_arity(le.node); j++) {
+ ir_node *pred = get_irn_n(le.node, j);
+ if (!eset_contains(loopnodes, pred)) {
+ eset_insert(extnodes, pred);
+ if (!is_Block(pred)) {
+ pred = get_nodes_block(pred);
+ if (!eset_contains(loopnodes, pred)) eset_insert(extnodes, pred);
+ }
+ }
+ }
+ }