2 * Copyright (C) 1995-2008 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
32 #include "irbackedge_t.h"
38 void firm_clear_link(ir_node *n, void *env)
41 set_irn_link(n, NULL);
44 void firm_clear_node_and_phi_links(ir_node *n, void *env)
47 set_irn_link(n, NULL);
49 set_Block_phis(n, NULL);
51 set_Phi_next(n, NULL);
54 void copy_irn_to_irg(ir_node *n, ir_graph *irg)
56 ir_op *op = get_irn_op(n);
60 /* do not copy standard nodes */
62 nn = get_irg_bad(irg);
63 else if (op == op_NoMem)
64 n = get_irg_no_mem(irg);
65 else if (op == op_Block) {
66 old_irg = get_irn_irg(n);
68 if (n == get_irg_start_block(old_irg))
69 nn = get_irg_start_block(irg);
70 else if (n == get_irg_end_block(old_irg))
71 nn = get_irg_end_block(irg);
73 else if (op == op_Start)
74 nn = get_irg_start(irg);
75 else if (op == op_End)
76 nn = get_irg_end(irg);
77 else if (op == op_Proj) {
78 old_irg = get_irn_irg(n);
80 if (n == get_irg_initial_exec(old_irg))
81 nn = get_irg_initial_exec(irg);
82 else if (n == get_irg_frame(old_irg))
83 nn = get_irg_frame(irg);
84 else if (n == get_irg_initial_mem(old_irg))
85 nn = get_irg_initial_mem(irg);
86 else if (n == get_irg_args(old_irg))
87 nn = get_irg_args(irg);
95 nn = new_ir_node(get_irn_dbg_info(n),
97 NULL, /* no block yet, will be set later */
104 /* Copy the attributes. These might point to additional data. If this
105 was allocated on the old obstack the pointers now are dangling. This
106 frees e.g. the memory of the graph_arr allocated in new_immBlock. */
107 copy_node_attr(irg, n, nn);
110 /* fix the irg for nodes containing a reference to it */
111 if (ir_has_irg_ref(nn)) {
112 nn->attr.block.irg.irg = irg;
116 ir_node *irn_copy_into_irg(const ir_node *node, ir_graph *irg)
118 ir_node *block = NULL;
119 ir_op *op = get_irn_op(node);
120 int arity = get_irn_arity(node);
121 dbg_info *dbgi = get_irn_dbg_info(node);
122 ir_mode *mode = get_irn_mode(node);
128 block = get_nodes_block(node);
130 if (op->opar == oparity_dynamic) {
132 res = new_ir_node(dbgi, irg, block, op, mode, -1, NULL);
133 for (i = 0; i < arity; ++i) {
134 ir_node *in = get_irn_n(node, i);
138 ir_node **ins = get_irn_in(node)+1;
139 res = new_ir_node(dbgi, irg, block, op, mode, arity, ins);
142 /* copy the attributes */
143 copy_node_attr(irg, node, res);
145 /* duplicate dependency edges */
146 n_deps = get_irn_deps(node);
147 for (i = 0; i < n_deps; ++i) {
148 ir_node *dep = get_irn_dep(node, i);
149 add_irn_dep(res, dep);
155 ir_node *exact_copy(const ir_node *node)
157 return irn_copy_into_irg(node, get_irn_irg(node));
160 static ir_node *get_new_node(const ir_node *old_node)
162 return (ir_node*) get_irn_link(old_node);
165 void irn_rewire_inputs(ir_node *node)
171 new_node = get_new_node(node);
173 if (!is_Block(node)) {
174 ir_node *block = get_nodes_block(node);
175 ir_node *new_block = get_new_node(block);
176 set_nodes_block(new_node, new_block);
179 arity = get_irn_arity(new_node);
180 for (i = 0; i < arity; ++i) {
181 ir_node *in = get_irn_n(node, i);
182 ir_node *new_in = get_new_node(in);
183 set_irn_n(new_node, i, new_in);
186 /* Now the new node is complete. We can add it to the hash table for CSE. */
187 add_identities(new_node);
190 void firm_pset_dump(pset *set)
194 foreach_pset(set, void*, obj) {
195 ir_fprintf(stderr, "%+F\n", obj);