2 * This file is part of libFirm.
3 * Copyright (C) 2012 University of Karlsruhe.
8 * @author Matthias Braun
27 static copy_attr_func old_phi_copy_attr;
29 void be_info_new_node(ir_graph *irg, ir_node *node)
34 /* Projs need no be info, all info is fetched from their predecessor */
38 obst = be_get_be_obst(irg);
39 info = OALLOCZ(obst, backend_info_t);
41 assert(node->backend_info == NULL);
42 node->backend_info = info;
45 * Set backend info for some middleend nodes which still appear in
48 switch (get_irn_opcode(node)) {
58 info->flags |= arch_irn_flags_not_scheduled;
61 info->out_infos = NEW_ARR_DZ(reg_out_info_t, obst, 1);
62 info->out_infos[0].req = arch_no_register_req;
69 static void new_phi_copy_attr(ir_graph *irg, const ir_node *old_node,
72 backend_info_t *old_info = be_get_info(old_node);
73 backend_info_t *new_info = be_get_info(new_node);
75 *new_info = *old_info;
77 old_phi_copy_attr(irg, old_node, new_node);
80 int be_nodes_equal(const ir_node *node1, const ir_node *node2)
82 const backend_info_t *info1 = be_get_info(node1);
83 const backend_info_t *info2 = be_get_info(node2);
84 size_t len = ARR_LEN(info1->out_infos);
85 int arity = get_irn_arity(node1);
89 if (ARR_LEN(info2->out_infos) != len)
92 assert(arity == get_irn_arity(node2));
94 for (in = 0; in < arity; ++in) {
95 if (info1->in_reqs[in] != info2->in_reqs[in])
99 for (i = 0; i < len; ++i) {
100 const reg_out_info_t *out1 = &info1->out_infos[i];
101 const reg_out_info_t *out2 = &info2->out_infos[i];
102 if (out1->reg != out2->reg)
104 if (!reg_reqs_equal(out1->req, out2->req))
111 static void init_walker(ir_node *node, void *data)
113 ir_graph *irg = get_irn_irg(node);
115 be_info_new_node(irg, node);
118 static bool initialized = false;
119 static hook_entry_t hook_liveness_info;
121 static void dump_liveness_info_hook(void *context, FILE *F, const ir_node *node)
126 ir_graph *irg = get_irn_irg(node);
127 if (!irg_is_constrained(irg, IR_GRAPH_CONSTRAINT_BACKEND))
130 be_lv_t *lv = be_get_irg_liveness(irg);
136 be_dump_liveness_block(lv, F, node);
139 void be_info_init(void)
142 panic("double initialization of be_info");
144 old_phi_copy_attr = op_Phi->ops.copy_attr;
145 op_Phi->ops.copy_attr = new_phi_copy_attr;
148 /* phis have register and register requirements now which we want to dump */
149 assert(op_Phi->ops.dump_node == NULL);
150 op_Phi->ops.dump_node = be_dump_phi_reg_reqs;
152 hook_liveness_info.hook._hook_node_info = dump_liveness_info_hook;
153 register_hook(hook_node_info, &hook_liveness_info);
157 * Edge hook to dump the schedule edges.
159 static void sched_edge_hook(FILE *F, const ir_node *irn)
161 ir_graph *irg = get_irn_irg(irn);
162 if (!irg_is_constrained(irg, IR_GRAPH_CONSTRAINT_BACKEND))
165 if (is_Proj(irn) || is_Block(irn) || !sched_is_scheduled(irn))
168 ir_node *const prev = sched_prev(irn);
169 if (!sched_is_begin(prev)) {
170 fprintf(F, "edge:{sourcename: ");
171 print_nodeid(F, irn);
172 fprintf(F, " targetname: ");
173 print_nodeid(F, prev);
174 fprintf(F, " color:magenta}\n");
178 void be_info_init_irg(ir_graph *irg)
180 add_irg_constraints(irg, IR_GRAPH_CONSTRAINT_BACKEND);
181 irg_walk_anchors(irg, init_walker, NULL, NULL);
183 set_dump_node_edge_hook(sched_edge_hook);
186 void be_info_free(void)
189 panic("called without prior init");
191 assert(op_Phi->ops.copy_attr == new_phi_copy_attr);
192 op_Phi->ops.copy_attr = old_phi_copy_attr;
195 assert(op_Phi->ops.dump_node == be_dump_phi_reg_reqs);
196 op_Phi->ops.dump_node = NULL;
198 unregister_hook(hook_node_info, &hook_liveness_info);