Added register allocator.
[libfirm] / ir / be / benumb.c
1 /**
2  * Numbering implementation.
3  * @author Sebastian Hack
4  * @date 8.12.2004
5  */
6
7 #include <stdlib.h>
8
9 #include "impl.h"
10
11 #include "irnode_t.h"
12 #include "irgwalk.h"
13
14 #include "be_t.h"
15 #include "benumb_t.h"
16
17 int numbering_irn_data_offset = 0;
18 int numbering_irg_data_offset = 0;
19
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)
26
27 static phase_t phase_numbering_info = {
28         "Numbering", 0
29 };
30
31 const phase_t *phase_numbering = &phase_numbering_info;
32
33
34 static void numbering_walker(ir_node *irn, void *env)
35 {
36         irg_numbering_t *graph_nr = get_irg_numbering(get_irn_irg(irn));
37         numbering_t *irn_nr = get_irn_numbering(irn);
38
39         if(is_Block(irn))
40                 irn_nr->global_nr = graph_nr->local_nr++;
41         else {
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++;
45         }
46 }
47
48 static void reverse_walker(ir_node *irn, void *env)
49 {
50         if(!is_Block(irn)) {
51                 ir_node **map = env;
52                 map[get_irn_graph_nr(irn)] = irn;
53         }
54 }
55
56 void be_numbering(ir_graph *irg)
57 {
58         ir_node **reverse_map;
59
60         irg_walk_graph(irg, numbering_walker, NULL, NULL);
61
62         reverse_map = calloc(get_graph_node_count(irg), sizeof(*reverse_map));
63         irg_walk_graph(irg, reverse_walker, NULL, reverse_map);
64
65         get_irg_numbering(irg)->reverse_map = reverse_map;
66 }
67
68 void be_numbering_done(ir_graph *irg)
69 {
70         free(get_irg_numbering(irg)->reverse_map);
71 }
72
73 void be_numbering_init(void)
74 {
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));
78 }