* @param post - walker function, executed after the predecessor of a node are visited
* @param env - environment, passed to pre and post
*/
-void callgraph_walk(ir_entity **roots, unsigned n_roots,
- callgraph_walk_func *pre, callgraph_walk_func *post, void *env);
+void callgraph_walk(callgraph_walk_func *pre, callgraph_walk_func *post,
+ void *env);
/**
* Compute the backedges that represent recursions and a looptree.
post(irg, env);
}
-void callgraph_walk(ir_entity **roots, unsigned n_roots,
- callgraph_walk_func *pre, callgraph_walk_func *post, void *env) {
+void callgraph_walk(callgraph_walk_func *pre, callgraph_walk_func *post, void *env) {
int i, n_irgs = get_irp_n_irgs();
- unsigned r;
++master_cg_visited;
- for (r = 0; r < n_roots; ++r) {
- ir_graph *irg = get_entity_irg(roots[r]);
- if (irg == NULL)
- continue;
+ /* roots are methods which have no callers in the current program */
+ for (i = 0; i < n_irgs; ++i) {
+ ir_graph *irg = get_irp_irg(i);
- do_walk(irg, pre, post, env);
+ if (get_irg_n_callers(irg) == 0)
+ do_walk(irg, pre, post, env);
}
- /* cgana "optimizes" the graph instead of just analysing it so the
- * roots list isn't even correct anymore when passed to this method...
- * so we hack around this and search for more unreferenced/free
- * methods... */
+ /* in case of unreachable call loops we haven't visited some irgs yet */
for (i = 0; i < n_irgs; i++) {
ir_graph *irg = get_irp_irg(i);
- if (!cg_irg_visited(irg))
- do_walk(irg, pre, post, env);
+ do_walk(irg, pre, post, env);
}
}
}
callee_env = get_irg_link(callee);
- if (get_entity_visibility(ent) == visibility_local &&
- callee_env->n_callers_orig == 1 &&
- callee != current_ir_graph) {
+ if (callee_env->n_callers == 1 && callee != current_ir_graph) {
/* we are the only caller, give big bonus */
- weight += 5000;
+ if (get_entity_visibility(ent) == visibility_local) {
+ weight += 5000;
+ } else {
+ weight += 200;
+ }
}
/* do not inline big functions */
static ir_graph **create_irg_list(void)
{
- ir_entity **roots;
+ ir_entity **free_methods;
int arr_len;
int n_irgs = get_irp_n_irgs();
- cgana(&arr_len, &roots);
+ cgana(&arr_len, &free_methods);
+ xfree(free_methods);
+
compute_callgraph();
last_irg = 0;
irgs = xmalloc(n_irgs * sizeof(*irgs));
memset(irgs, 0, sizeof(n_irgs * sizeof(*irgs)));
- callgraph_walk(roots, arr_len, NULL, callgraph_walker, NULL);
- xfree(roots);
+ callgraph_walk(NULL, callgraph_walker, NULL);
assert(n_irgs == last_irg);
return irgs;