14 * Compare two live entries.
16 static int cmp_irn_live(const void *a, const void *b)
18 const irn_live_t *p = a;
19 const irn_live_t *q = b;
21 return !(p->block == q->block && p->irn == q->irn);
25 * Collect reg pressure statistics per block and per class.
27 static void stat_reg_pressure_block(ir_node *block, void *env) {
29 const arch_env_t *aenv = birg->main_env->arch_env;
30 int i, n = arch_isa_get_n_reg_class(aenv->isa);
32 for (i = 0; i < n; i++) {
33 const arch_register_class_t *cls = arch_isa_get_reg_class(aenv->isa, i);
35 pset *live_nodes = new_pset(cmp_irn_live, 64);
38 live_nodes = be_liveness_end_of_block(aenv, cls, block, live_nodes);
39 max_live = pset_count(live_nodes);
41 sched_foreach_reverse(block, irn) {
44 live_nodes = be_liveness_transfer(aenv, cls, irn, live_nodes);
45 cnt = pset_count(live_nodes);
47 max_live = cnt < max_live ? max_live : cnt;
50 hook_be_block_regpressure(block, birg->irg, max_live, new_id_from_str(cls->name));
51 ir_printf("max regpressure %+F: %d\n", block, max_live);
55 void be_do_stat_reg_pressure(be_irg_t *birg) {
56 /* Collect register pressure information for each block */
57 irg_block_walk_graph(birg->irg, stat_reg_pressure_block, NULL, birg);