Added construction of phi congruence classes.
[libfirm] / ir / be / bephicongr.c
1 /**
2  * @author Daniel Grund
3  * @date 09.12.2004
4  */
5
6 #include <stdio.h>
7 #include <string.h>
8
9 #include "irgraph.h"
10 #include "irnode.h"
11 #include "irgwalk.h"
12 #include "irop.h"
13 #include "irprog.h"
14 #include "bephicongr_t.h"
15
16
17 size_t phi_irn_data_offset = 0;
18
19 void be_phi_congr_class_init(void) {
20         phi_irn_data_offset = register_additional_node_data(sizeof(phi_info_t));
21 }
22
23
24 #define set_phi_class(n,new_tgt) get_irn_phi_info(n)->phi_congr_class=new_tgt
25 #define set_phi_class_size(n,v)  get_irn_phi_info(n)->phi_class_size=v
26 #define inc_phi_class_size(n)    get_irn_phi_info(n)->phi_class_size++
27
28 static void correct_phi_class(ir_node *n, ir_node *new_tgt){
29         int i, max, check;
30         check = get_phi_class_size(n) + get_phi_class_size(new_tgt);
31
32         for (i = 0, max = get_irn_arity(n); i < max; i++) {
33                 ir_node *arg = get_irn_n(n, i);
34                 set_phi_class(arg, new_tgt);
35                 inc_phi_class_size(new_tgt);
36         }
37
38         get_irn_phi_info(n)->phi_class_size=0;
39         //set_phi_class_size(n, 0);
40
41         assert((check == get_phi_class_size(n) + get_phi_class_size(new_tgt)) && "Re-setting pointers went wrong.");
42 }
43
44
45 void det_phi_congr_class(ir_node *curr_phi) {
46     int i, n;
47     assert(is_Phi(curr_phi) && "This must be a phi node.");
48
49         set_phi_class(curr_phi, curr_phi);
50
51         for (i = 0, n = get_irn_arity(curr_phi); i < n; i++) {
52                 ir_node *arg, *pc;
53
54                 arg = get_irn_n(curr_phi, i);
55                 pc = get_phi_class(arg);
56                 if (!pc)
57                         set_phi_class(arg, curr_phi);
58                 else
59                         correct_phi_class(pc, curr_phi);
60         }
61 }
62
63
64 void be_det_phi_congr_classes(void) {
65         //forall phis: det_phi_congr_classes(n);
66         assert(0 && "NYI");
67 }