2 * This file is part of libFirm.
3 * Copyright (C) 2012 University of Karlsruhe.
8 * @brief Some often needed tool-functions
17 #include "irbackedge_t.h"
23 void firm_clear_link(ir_node *n, void *env)
26 set_irn_link(n, NULL);
29 void firm_clear_node_and_phi_links(ir_node *n, void *env)
32 set_irn_link(n, NULL);
34 set_Block_phis(n, NULL);
36 set_Phi_next(n, NULL);
39 void firm_clear_block_phis(ir_node *node, void *env)
43 set_Block_phis(node, NULL);
44 } else if (is_Phi(node)) {
45 set_Phi_next(node, NULL);
49 void firm_collect_block_phis(ir_node *node, void *env)
53 add_Block_phi(get_nodes_block(node), node);
56 void copy_irn_to_irg(ir_node *n, ir_graph *irg)
61 /* do not copy standard nodes */
62 switch (get_irn_opcode(n)) {
64 n = get_irg_no_mem(irg);
68 old_irg = get_irn_irg(n);
69 if (n == get_irg_start_block(old_irg))
70 nn = get_irg_start_block(irg);
71 else if (n == get_irg_end_block(old_irg))
72 nn = get_irg_end_block(irg);
76 nn = get_irg_start(irg);
80 nn = get_irg_end(irg);
84 old_irg = get_irn_irg(n);
85 if (n == get_irg_initial_exec(old_irg))
86 nn = get_irg_initial_exec(irg);
87 else if (n == get_irg_frame(old_irg))
88 nn = get_irg_frame(irg);
89 else if (n == get_irg_initial_mem(old_irg))
90 nn = get_irg_initial_mem(irg);
91 else if (n == get_irg_args(old_irg))
92 nn = get_irg_args(irg);
101 nn = new_ir_node(get_irn_dbg_info(n),
103 NULL, /* no block yet, will be set later */
110 /* Copy the attributes. These might point to additional data. If this
111 was allocated on the old obstack the pointers now are dangling. This
112 frees e.g. the memory of the graph_arr allocated in new_immBlock. */
113 copy_node_attr(irg, n, nn);
116 /* fix the irg for nodes containing a reference to it */
117 if (ir_has_irg_ref(nn)) {
118 nn->attr.block.irg.irg = irg;
122 ir_node *irn_copy_into_irg(const ir_node *node, ir_graph *irg)
124 ir_node *block = NULL;
125 ir_op *op = get_irn_op(node);
126 int arity = get_irn_arity(node);
127 dbg_info *dbgi = get_irn_dbg_info(node);
128 ir_mode *mode = get_irn_mode(node);
134 block = get_nodes_block(node);
136 if (op->opar == oparity_dynamic) {
138 res = new_ir_node(dbgi, irg, block, op, mode, -1, NULL);
139 for (i = 0; i < arity; ++i) {
140 ir_node *in = get_irn_n(node, i);
144 ir_node **ins = get_irn_in(node)+1;
145 res = new_ir_node(dbgi, irg, block, op, mode, arity, ins);
148 /* copy the attributes */
149 copy_node_attr(irg, node, res);
151 /* duplicate dependency edges */
152 n_deps = get_irn_deps(node);
153 for (i = 0; i < n_deps; ++i) {
154 ir_node *dep = get_irn_dep(node, i);
155 add_irn_dep(res, dep);
161 ir_node *exact_copy(const ir_node *node)
163 return irn_copy_into_irg(node, get_irn_irg(node));
166 static ir_node *get_new_node(const ir_node *old_node)
168 return (ir_node*) get_irn_link(old_node);
171 void irn_rewire_inputs(ir_node *node)
178 new_node = get_new_node(node);
180 if (!is_Block(node)) {
181 ir_node *block = get_nodes_block(node);
182 ir_node *new_block = get_new_node(block);
183 set_nodes_block(new_node, new_block);
186 arity = get_irn_arity(new_node);
187 for (i = 0; i < arity; ++i) {
188 ir_node *in = get_irn_n(node, i);
189 ir_node *new_in = get_new_node(in);
190 set_irn_n(new_node, i, new_in);
193 n_deps = get_irn_deps(new_node);
194 for (i = 0; i < n_deps; ++i) {
195 ir_node *dep = get_irn_dep(node, i);
196 ir_node *new_dep = get_new_node(dep);
197 set_irn_dep(new_node, i, new_dep);
200 /* Now the new node is complete. We can add it to the hash table for CSE. */
201 add_identities(new_node);
204 void firm_pset_dump(pset *set)
206 foreach_pset(set, void, obj) {
207 ir_fprintf(stderr, "%+F\n", obj);