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 Loop datastructure and access functions -- private stuff.
23 * @author Goetz Lindenmaier
35 void add_loop_son(ir_loop *loop, ir_loop *son)
38 assert(loop && loop->kind == k_ir_loop);
39 assert(get_kind(son) == k_ir_loop);
41 ARR_APP1(loop_element, loop->children, lson);
42 loop->flags |= loop_outer_loop;
45 void add_loop_node(ir_loop *loop, ir_node *n)
49 assert(loop && loop->kind == k_ir_loop);
50 ARR_APP1(loop_element, loop->children, ln);
53 void add_loop_irg(ir_loop *loop, ir_graph *irg)
57 assert(loop && loop->kind == k_ir_loop);
58 ARR_APP1(loop_element, loop->children, ln);
61 void mature_loops(ir_loop *loop, struct obstack *obst)
65 loop_element *new_children = DUP_ARR_D(loop_element, obst, loop->children);
66 DEL_ARR_F(loop->children);
67 loop->children = new_children;
69 /* mature child loops */
70 for (i = ARR_LEN(new_children); i > 0;) {
71 loop_element child = new_children[--i];
73 if (*child.kind == k_ir_loop) {
74 mature_loops(child.son, obst);
79 ir_loop *(get_loop_outer_loop)(const ir_loop *loop)
81 return _get_loop_outer_loop(loop);
84 unsigned (get_loop_depth)(const ir_loop *loop)
86 return _get_loop_depth(loop);
89 size_t get_loop_n_elements(const ir_loop *loop)
91 assert(loop && loop->kind == k_ir_loop);
92 return(ARR_LEN(loop->children));
95 loop_element get_loop_element(const ir_loop *loop, size_t pos)
97 assert(loop && loop->kind == k_ir_loop && pos < ARR_LEN(loop->children));
98 return(loop -> children[pos]);
101 void set_irn_loop(ir_node *n, ir_loop *loop)
106 ir_loop *(get_irn_loop)(const ir_node *n)
108 return _get_irn_loop(n);
111 long get_loop_loop_nr(const ir_loop *loop)
113 assert(loop && loop->kind == k_ir_loop);
115 return loop->loop_nr;
121 void set_loop_link(ir_loop *loop, void *link)
123 assert(loop && loop->kind == k_ir_loop);
127 void *get_loop_link(const ir_loop *loop)
129 assert(loop && loop->kind == k_ir_loop);
133 int (is_ir_loop)(const void *thing)
135 return _is_ir_loop(thing);
138 void (set_irg_loop)(ir_graph *irg, ir_loop *loop)
140 _set_irg_loop(irg, loop);
143 ir_loop *(get_irg_loop)(const ir_graph *irg)
145 return _get_irg_loop(irg);
148 ir_loop *alloc_loop(ir_loop *father, struct obstack *obst)
152 son = OALLOCZ(obst, ir_loop);
153 son->kind = k_ir_loop;
154 son->children = NEW_ARR_F(loop_element, 0);
157 son->outer_loop = father;
158 add_loop_son(father, son);
159 son->depth = father->depth + 1;
160 } else { /* The root loop */
161 son->outer_loop = son;
166 son->loop_nr = get_irp_new_node_nr();