never set the startblock to bad (even without the self-referencing loop)
[libfirm] / ir / ir / irdump.c
index 9857f39..9d36c01 100644 (file)
@@ -578,10 +578,15 @@ static void collect_node(ir_node * node, void *env) {
  * Free the list with DEL_ARR_F().
  */
 static ir_node **construct_block_lists(ir_graph *irg) {
-       int i, rem_view = get_interprocedural_view();
-       ir_graph *rem = current_ir_graph;
+       int      i;
+       int      rem_view  = get_interprocedural_view();
+       int      walk_flag = inside_irg_walk(irg);
+       ir_graph *rem      = current_ir_graph;
+
        current_ir_graph = irg;
 
+       clear_inside_irg_walk(current_ir_graph);
+
        for (i = get_irp_n_irgs() - 1; i >= 0; --i)
                ird_set_irg_link(get_irp_irg(i), NULL);
 
@@ -597,6 +602,9 @@ static ir_node **construct_block_lists(ir_graph *irg) {
 
        set_interprocedural_view(rem_view);
 
+       if (walk_flag)
+               set_inside_irg_walk(current_ir_graph);
+
        current_ir_graph = rem;
        return ird_get_irg_link(irg);
 }
@@ -1066,7 +1074,6 @@ handle_lut:
 
 #include <math.h>
 #include "execution_frequency.h"
-#include "callgraph.h"
 
 static void dump_node_ana_vals(FILE *F, ir_node *n) {
        return;
@@ -2330,6 +2337,10 @@ dump_ir_graph(ir_graph *irg, const char *suffix )
        if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg))))
                return;
 
+       if (dump_backedge_information_flag && get_irg_loopinfo_state(irg) != loopinfo_consistent) {
+               construct_backedges(irg);
+       }
+
        rem = current_ir_graph;
        current_ir_graph = irg;
        if (get_interprocedural_view()) suffix1 = "-pure-ip";
@@ -2709,6 +2720,9 @@ static int compute_color(int my, int max) {
        return base_color + n_colors - color;
 }
 
+/**
+ * Calculate a entity color depending on it's execution propability.
+ */
 static int get_entity_color(ir_entity *ent) {
        ir_graph *irg = get_entity_irg(ent);
        assert(irg);
@@ -2734,19 +2748,20 @@ void dump_callgraph(const char *suffix) {
        FILE *F = vcg_open_name("Callgraph", suffix);
 
        if (F != NULL) {
-               int i, rem = edge_label;
+               int i, rem = edge_label, colorize;
                edge_label = 1;
                dump_vcg_header(F, "Callgraph", NULL);
 
+               colorize = get_irp_callgraph_state() == irp_callgraph_and_calltree_consistent;
+
                for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
                        ir_graph *irg = get_irp_irg(i);
                        ir_entity *ent = get_irg_entity(irg);
                        int j, n_callees = get_irg_n_callees(irg);
+                       int color;
 
-                       /* Do not dump runtime system. */
-                       //if (id_is_prefix(prefix, get_entity_ld_ident(ent))) continue;
-
-                       dump_entity_node(F, ent, get_entity_color(ent));
+                       color = colorize ? get_entity_color(ent) : ird_color_green;
+                       dump_entity_node(F, ent, color);
                        for (j = 0; j < n_callees; ++j) {
                                ir_entity *c = get_irg_entity(get_irg_callee(irg, j));
                                //if (id_is_prefix(prefix, get_entity_ld_ident(c))) continue;
@@ -2755,7 +2770,7 @@ void dump_callgraph(const char *suffix) {
                                attr = (be) ?
                                        "label:\"recursion %d\" color:%d" :
                                "label:\"calls %d\" color:%d";
-                               print_ent_ent_edge(F, ent, c, be, attr, get_irg_callee_loop_depth(irg, j), get_entity_color(ent));
+                               print_ent_ent_edge(F, ent, c, be, attr, get_irg_callee_loop_depth(irg, j), color);
                        }
                }