2 * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief Some often needed tool-functions
23 * @author Michael Beck
31 #include "irbackedge_t.h"
37 void firm_clear_link(ir_node *n, void *env)
40 set_irn_link(n, NULL);
43 void firm_clear_node_and_phi_links(ir_node *n, void *env)
46 set_irn_link(n, NULL);
48 set_Block_phis(n, NULL);
50 set_Phi_next(n, NULL);
53 void firm_clear_block_phis(ir_node *node, void *env)
57 set_Block_phis(node, NULL);
58 } else if (is_Phi(node)) {
59 set_Phi_next(node, NULL);
63 void firm_collect_block_phis(ir_node *node, void *env)
67 add_Block_phi(get_nodes_block(node), node);
70 void copy_irn_to_irg(ir_node *n, ir_graph *irg)
75 /* do not copy standard nodes */
76 switch (get_irn_opcode(n)) {
78 n = get_irg_no_mem(irg);
82 old_irg = get_irn_irg(n);
83 if (n == get_irg_start_block(old_irg))
84 nn = get_irg_start_block(irg);
85 else if (n == get_irg_end_block(old_irg))
86 nn = get_irg_end_block(irg);
90 nn = get_irg_start(irg);
94 nn = get_irg_end(irg);
98 old_irg = get_irn_irg(n);
99 if (n == get_irg_initial_exec(old_irg))
100 nn = get_irg_initial_exec(irg);
101 else if (n == get_irg_frame(old_irg))
102 nn = get_irg_frame(irg);
103 else if (n == get_irg_initial_mem(old_irg))
104 nn = get_irg_initial_mem(irg);
105 else if (n == get_irg_args(old_irg))
106 nn = get_irg_args(irg);
115 nn = new_ir_node(get_irn_dbg_info(n),
117 NULL, /* no block yet, will be set later */
124 /* Copy the attributes. These might point to additional data. If this
125 was allocated on the old obstack the pointers now are dangling. This
126 frees e.g. the memory of the graph_arr allocated in new_immBlock. */
127 copy_node_attr(irg, n, nn);
130 /* fix the irg for nodes containing a reference to it */
131 if (ir_has_irg_ref(nn)) {
132 nn->attr.block.irg.irg = irg;
136 ir_node *irn_copy_into_irg(const ir_node *node, ir_graph *irg)
138 ir_node *block = NULL;
139 ir_op *op = get_irn_op(node);
140 int arity = get_irn_arity(node);
141 dbg_info *dbgi = get_irn_dbg_info(node);
142 ir_mode *mode = get_irn_mode(node);
148 block = get_nodes_block(node);
150 if (op->opar == oparity_dynamic) {
152 res = new_ir_node(dbgi, irg, block, op, mode, -1, NULL);
153 for (i = 0; i < arity; ++i) {
154 ir_node *in = get_irn_n(node, i);
158 ir_node **ins = get_irn_in(node)+1;
159 res = new_ir_node(dbgi, irg, block, op, mode, arity, ins);
162 /* copy the attributes */
163 copy_node_attr(irg, node, res);
165 /* duplicate dependency edges */
166 n_deps = get_irn_deps(node);
167 for (i = 0; i < n_deps; ++i) {
168 ir_node *dep = get_irn_dep(node, i);
169 add_irn_dep(res, dep);
175 ir_node *exact_copy(const ir_node *node)
177 return irn_copy_into_irg(node, get_irn_irg(node));
180 static ir_node *get_new_node(const ir_node *old_node)
182 return (ir_node*) get_irn_link(old_node);
185 void irn_rewire_inputs(ir_node *node)
192 new_node = get_new_node(node);
194 if (!is_Block(node)) {
195 ir_node *block = get_nodes_block(node);
196 ir_node *new_block = get_new_node(block);
197 set_nodes_block(new_node, new_block);
200 arity = get_irn_arity(new_node);
201 for (i = 0; i < arity; ++i) {
202 ir_node *in = get_irn_n(node, i);
203 ir_node *new_in = get_new_node(in);
204 set_irn_n(new_node, i, new_in);
207 n_deps = get_irn_deps(new_node);
208 for (i = 0; i < n_deps; ++i) {
209 ir_node *dep = get_irn_dep(node, i);
210 ir_node *new_dep = get_new_node(dep);
211 set_irn_dep(new_node, i, new_dep);
214 /* Now the new node is complete. We can add it to the hash table for CSE. */
215 add_identities(new_node);
218 void firm_pset_dump(pset *set)
220 foreach_pset(set, void, obj) {
221 ir_fprintf(stderr, "%+F\n", obj);