X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Fcallgraph.c;h=8e14c5a359f24dd2d97bc01a52b5f47396a4bd5a;hb=3245e882cc975385e090d2c36d8a2aae198452e2;hp=c7a0137e0e71fb0372940439dd20d3f148f8f73f;hpb=50ebbd2010a31c7d9cfe9af0ed25909c5fcfeb72;p=libfirm diff --git a/ir/ana/callgraph.c b/ir/ana/callgraph.c index c7a0137e0..8e14c5a35 100644 --- a/ir/ana/callgraph.c +++ b/ir/ana/callgraph.c @@ -31,6 +31,7 @@ #include "array.h" #include "pmap.h" +#include "hashptr.h" #include "irgwalk.h" @@ -145,7 +146,7 @@ int get_irg_callee_loop_depth(ir_graph *irg, int pos) { -double get_irg_callee_execution_freqency(ir_graph *irg, int pos) { +double get_irg_callee_execution_frequency(ir_graph *irg, int pos) { ir_node **arr = ((ana_entry *)irg->callees[pos])->call_list; int i, n_Calls = ARR_LEN(arr); double freq = 0; @@ -156,27 +157,24 @@ double get_irg_callee_execution_freqency(ir_graph *irg, int pos) { return freq; } -double get_irg_callee_method_execution_freqency(ir_graph *irg, int pos) { - double call_freq = get_irg_callee_execution_freqency(irg, pos); +double get_irg_callee_method_execution_frequency(ir_graph *irg, int pos) { + double call_freq = get_irg_callee_execution_frequency(irg, pos); double meth_freq = get_irg_method_execution_frequency(irg); return call_freq * meth_freq; } -double get_irg_caller_method_execution_freqency(ir_graph *irg, int pos) { +double get_irg_caller_method_execution_frequency(ir_graph *irg, int pos) { ir_graph *caller = get_irg_caller(irg, pos); int pos_callee = reverse_pos(irg, pos); - return get_irg_callee_method_execution_freqency(caller, pos_callee); + return get_irg_callee_method_execution_frequency(caller, pos_callee); } /* --------------------- Compute the callgraph ------------------------ */ -/* Hash an address */ -#define HASH_ADDRESS(adr) (((unsigned)(adr)) >> 3) - /** * Walker called by compute_callgraph() */ @@ -197,8 +195,8 @@ static void ana_Call(ir_node *n, void *env) { ana_entry *found; int depth; - pset_insert((pset *)callee->callers, irg, (unsigned)irg >> 3); - found = pset_find((pset *)irg->callees, &buf, HASH_ADDRESS(callee)); + pset_insert((pset *)callee->callers, irg, HASH_PTR(irg)); + found = pset_find((pset *)irg->callees, &buf, HASH_PTR(callee)); if (found) { /* add Call node to list, compute new nesting. */ ir_node **arr = found->call_list; ARR_APP1(ir_node *, arr, n); @@ -209,7 +207,7 @@ static void ana_Call(ir_node *n, void *env) { found->call_list = NEW_ARR_F(ir_node *, 1); found->call_list[0] = n; found->max_depth = 0; - pset_insert((pset *)irg->callees, found, HASH_ADDRESS(callee)); + pset_insert((pset *)irg->callees, found, HASH_PTR(callee)); } depth = get_loop_depth(get_irn_loop(get_nodes_block(n))); found->max_depth = (depth > found->max_depth) ? depth : found->max_depth; @@ -1118,8 +1116,8 @@ static void compute_rec_depth (ir_graph *irg, void *env) { /* ----------------------------------------------------------------------------------- */ -/* Another algorithm to compute recursion nesting depth */ -/* Walk the callgraph. Ignore backedges. Use sum of execution freqencies of Call */ +/* Another algorithm to compute the execution frequency of methods ignoring recursions. */ +/* Walk the callgraph. Ignore backedges. Use sum of execution frequencies of Call */ /* nodes to evaluate a callgraph edge. */ /* ----------------------------------------------------------------------------------- */ @@ -1129,6 +1127,9 @@ double get_irg_method_execution_frequency (ir_graph *irg) { void set_irg_method_execution_frequency (ir_graph *irg, double freq) { irg->method_execution_frequency = freq; + + if (irp->max_method_execution_frequency < freq) + irp->max_method_execution_frequency = freq; } static void compute_method_execution_frequency (ir_graph *irg, void *env) { @@ -1152,12 +1153,12 @@ static void compute_method_execution_frequency (ir_graph *irg, void *env) { } mark_cg_irg_visited(irg); - /* Compute the new freqency. */ + /* Compute the new frequency. */ freq = 0; found_edge = 0; for (i = 0; i < n_callers; i++) { if (! is_irg_caller_backedge(irg, i)) { - double edge_freq = get_irg_caller_method_execution_freqency(irg, i); + double edge_freq = get_irg_caller_method_execution_frequency(irg, i); assert(edge_freq >= 0); freq += edge_freq; found_edge = 1; @@ -1286,10 +1287,6 @@ void compute_performance_estimates(void) { DEL_ARR_F(e.loop_stack); - //dump_callgraph("-with_nesting"); - //dump_callgraph_loop_tree(current_loop, "-after_cons"); - - /* -- compute the execution frequency -- */ irp->max_method_execution_frequency = 0; master_cg_visited += 2; @@ -1341,4 +1338,18 @@ void analyse_loop_nesting_depth(void) { find_callgraph_recursions(); compute_performance_estimates(); + + set_irp_loop_nesting_depth_state(loop_nesting_depth_consistent); +} + + +loop_nesting_depth_state get_irp_loop_nesting_depth_state(void) { + return irp->lnd_state; +} +void set_irp_loop_nesting_depth_state(loop_nesting_depth_state s) { + irp->lnd_state = s; +} +void set_irp_loop_nesting_depth_state_inconsistent(void) { + if (irp->lnd_state == loop_nesting_depth_consistent) + irp->lnd_state = loop_nesting_depth_inconsistent; }