2 * Numbering implementation.
3 * @author Sebastian Hack
18 int numbering_irn_data_offset = 0;
19 int numbering_irg_data_offset = 0;
21 FIRM_IMPL1(get_irn_graph_nr, int, const ir_node *)
22 FIRM_IMPL1(get_irn_block_nr, int, const ir_node *)
23 FIRM_IMPL1(get_block_graph_nr, int, const ir_node *)
24 FIRM_IMPL1(get_block_node_count, int, const ir_node *)
25 FIRM_IMPL1(get_graph_block_count, int, const ir_graph *)
26 FIRM_IMPL2(get_irn_for_graph_nr, ir_node *, const ir_graph *, int)
28 static phase_t phase_numbering_info = {
32 const phase_t *phase_numbering = &phase_numbering_info;
35 static void numbering_walker(ir_node *irn, void *env)
37 irg_numbering_t *graph_nr = get_irg_numbering(get_irn_irg(irn));
38 numbering_t *irn_nr = get_irn_numbering(irn);
41 irn_nr->global_nr = graph_nr->local_nr++;
43 numbering_t *block_nr = get_irn_numbering(get_nodes_block(irn));
44 irn_nr->local_nr = block_nr->local_nr++;
45 irn_nr->global_nr = graph_nr->global_nr++;
49 static void reverse_walker(ir_node *irn, void *env)
53 map[get_irn_graph_nr(irn)] = irn;
57 void be_numbering(ir_graph *irg)
59 ir_node **reverse_map;
61 irg_walk_graph(irg, numbering_walker, NULL, NULL);
63 reverse_map = xcalloc(get_graph_node_count(irg), sizeof(reverse_map[0]));
64 irg_walk_graph(irg, reverse_walker, NULL, reverse_map);
66 get_irg_numbering(irg)->reverse_map = reverse_map;
69 void be_numbering_done(ir_graph *irg)
71 free(get_irg_numbering(irg)->reverse_map);
74 void be_numbering_init(void)
76 phase_register(&phase_numbering_info);
77 numbering_irn_data_offset = register_additional_node_data(sizeof(numbering_t));
78 numbering_irg_data_offset = register_additional_graph_data(sizeof(irg_numbering_t));