2 * Numbering implementation.
3 * @author Sebastian Hack
17 int numbering_irn_data_offset = 0;
18 int numbering_irg_data_offset = 0;
20 FIRM_IMPL1(get_irn_graph_nr, int, const ir_node *)
21 FIRM_IMPL1(get_irn_block_nr, int, const ir_node *)
22 FIRM_IMPL1(get_block_graph_nr, int, const ir_node *)
23 FIRM_IMPL1(get_block_node_count, int, const ir_node *)
24 FIRM_IMPL1(get_graph_block_count, int, const ir_graph *)
25 FIRM_IMPL2(get_irn_for_graph_nr, ir_node *, const ir_graph *, int)
27 static phase_t phase_numbering_info = {
31 const phase_t *phase_numbering = &phase_numbering_info;
34 static void numbering_walker(ir_node *irn, void *env)
36 irg_numbering_t *graph_nr = get_irg_numbering(get_irn_irg(irn));
37 numbering_t *irn_nr = get_irn_numbering(irn);
40 irn_nr->global_nr = graph_nr->local_nr++;
42 numbering_t *block_nr = get_irn_numbering(get_nodes_block(irn));
43 irn_nr->local_nr = block_nr->local_nr++;
44 irn_nr->global_nr = graph_nr->global_nr++;
48 static void reverse_walker(ir_node *irn, void *env)
52 map[get_irn_graph_nr(irn)] = irn;
56 void be_numbering(ir_graph *irg)
58 ir_node **reverse_map;
60 irg_walk_graph(irg, numbering_walker, NULL, NULL);
62 reverse_map = calloc(get_graph_node_count(irg), sizeof(*reverse_map));
63 irg_walk_graph(irg, reverse_walker, NULL, reverse_map);
65 get_irg_numbering(irg)->reverse_map = reverse_map;
68 void be_numbering_done(ir_graph *irg)
70 free(get_irg_numbering(irg)->reverse_map);
73 void be_numbering_init(void)
75 phase_register(&phase_numbering_info);
76 numbering_irn_data_offset = register_additional_node_data(sizeof(numbering_t));
77 numbering_irg_data_offset = register_additional_graph_data(sizeof(irg_numbering_t));