04dc9c71be5c732a731c4742473309cc6f8db119
[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 #include "xmalloc.h"
14
15 #include "be_t.h"
16 #include "benumb_t.h"
17
18 int numbering_irn_data_offset = 0;
19 int numbering_irg_data_offset = 0;
20
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)
27
28 static phase_t phase_numbering_info = {
29         "Numbering", 0
30 };
31
32 const phase_t *phase_numbering = &phase_numbering_info;
33
34
35 static void numbering_walker(ir_node *irn, void *env)
36 {
37         irg_numbering_t *graph_nr = get_irg_numbering(get_irn_irg(irn));
38         numbering_t *irn_nr = get_irn_numbering(irn);
39
40         if(is_Block(irn))
41                 irn_nr->global_nr = graph_nr->local_nr++;
42         else {
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++;
46         }
47 }
48
49 static void reverse_walker(ir_node *irn, void *env)
50 {
51         if(!is_Block(irn)) {
52                 ir_node **map = env;
53                 map[get_irn_graph_nr(irn)] = irn;
54         }
55 }
56
57 void be_numbering(ir_graph *irg)
58 {
59         ir_node **reverse_map;
60
61         irg_walk_graph(irg, numbering_walker, NULL, NULL);
62
63         reverse_map = xcalloc(get_graph_node_count(irg), sizeof(reverse_map[0]));
64         irg_walk_graph(irg, reverse_walker, NULL, reverse_map);
65
66         get_irg_numbering(irg)->reverse_map = reverse_map;
67 }
68
69 void be_numbering_done(ir_graph *irg)
70 {
71         free(get_irg_numbering(irg)->reverse_map);
72 }
73
74 void be_numbering_init(void)
75 {
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));
79 }