add missing non-inline versions
[libfirm] / ir / ir / irnode.c
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
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.
10  *
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.
14  *
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
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   Representation of an intermediate operation.
23  * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
24  * @version $Id$
25  */
26 #ifdef HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #ifdef HAVE_STRING_H
31 # include <string.h>
32 #endif
33
34 #include "ident.h"
35 #include "irnode_t.h"
36 #include "irgraph_t.h"
37 #include "irmode_t.h"
38 #include "irbackedge_t.h"
39 #include "irdump.h"
40 #include "irop_t.h"
41 #include "irprog_t.h"
42 #include "iredgekinds.h"
43 #include "iredges_t.h"
44 #include "ircons.h"
45
46 #include "irhooks.h"
47 #include "irtools.h"
48
49 /* some constants fixing the positions of nodes predecessors
50    in the in array */
51 #define CALL_PARAM_OFFSET     2
52 #define FUNCCALL_PARAM_OFFSET 1
53 #define SEL_INDEX_OFFSET      2
54 #define RETURN_RESULT_OFFSET  1  /* mem is not a result */
55 #define END_KEEPALIVE_OFFSET  0
56
57 static const char *pnc_name_arr [] = {
58         "pn_Cmp_False", "pn_Cmp_Eq", "pn_Cmp_Lt", "pn_Cmp_Le",
59         "pn_Cmp_Gt", "pn_Cmp_Ge", "pn_Cmp_Lg", "pn_Cmp_Leg",
60         "pn_Cmp_Uo", "pn_Cmp_Ue", "pn_Cmp_Ul", "pn_Cmp_Ule",
61         "pn_Cmp_Ug", "pn_Cmp_Uge", "pn_Cmp_Ne", "pn_Cmp_True"
62 };
63
64 /**
65  * returns the pnc name from an pnc constant
66  */
67 const char *get_pnc_string(int pnc) {
68         assert(pnc >= 0 && pnc <
69                         (int) (sizeof(pnc_name_arr)/sizeof(pnc_name_arr[0])));
70         return pnc_name_arr[pnc];
71 }
72
73 /*
74  * Calculates the negated (Complement(R)) pnc condition.
75  */
76 pn_Cmp get_negated_pnc(long pnc, ir_mode *mode) {
77         pnc ^= pn_Cmp_True;
78
79         /* do NOT add the Uo bit for non-floating point values */
80         if (! mode_is_float(mode))
81                 pnc &= ~pn_Cmp_Uo;
82
83         return (pn_Cmp) pnc;
84 }
85
86 /* Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */
87 pn_Cmp get_inversed_pnc(long pnc) {
88         long code    = pnc & ~(pn_Cmp_Lt|pn_Cmp_Gt);
89         long lesser  = pnc & pn_Cmp_Lt;
90         long greater = pnc & pn_Cmp_Gt;
91
92         code |= (lesser ? pn_Cmp_Gt : 0) | (greater ? pn_Cmp_Lt : 0);
93
94         return (pn_Cmp) code;
95 }
96
97 /**
98  * Indicates, whether additional data can be registered to ir nodes.
99  * If set to 1, this is not possible anymore.
100  */
101 static int forbid_new_data = 0;
102
103 /**
104  * The amount of additional space for custom data to be allocated upon
105  * creating a new node.
106  */
107 unsigned firm_add_node_size = 0;
108
109
110 /* register new space for every node */
111 unsigned firm_register_additional_node_data(unsigned size) {
112         assert(!forbid_new_data && "Too late to register additional node data");
113
114         if (forbid_new_data)
115                 return 0;
116
117         return firm_add_node_size += size;
118 }
119
120
121 void init_irnode(void) {
122         /* Forbid the addition of new data to an ir node. */
123         forbid_new_data = 1;
124 }
125
126 /*
127  * irnode constructor.
128  * Create a new irnode in irg, with an op, mode, arity and
129  * some incoming irnodes.
130  * If arity is negative, a node with a dynamic array is created.
131  */
132 ir_node *
133 new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode,
134             int arity, ir_node **in)
135 {
136         ir_node *res;
137         size_t node_size = offsetof(ir_node, attr) + op->attr_size + firm_add_node_size;
138         char *p;
139         int i;
140
141         assert(irg && op && mode);
142         p = obstack_alloc(irg->obst, node_size);
143         memset(p, 0, node_size);
144         res = (ir_node *)(p + firm_add_node_size);
145
146         res->kind     = k_ir_node;
147         res->op       = op;
148         res->mode     = mode;
149         res->visited  = 0;
150         res->node_idx = irg_register_node_idx(irg, res);
151         res->link     = NULL;
152         res->deps     = NULL;
153
154         if (arity < 0) {
155                 res->in = NEW_ARR_F(ir_node *, 1);  /* 1: space for block */
156         } else {
157                 /* not nice but necessary: End and Sync must always have a flexible array */
158                 if (op == op_End || op == op_Sync)
159                         res->in = NEW_ARR_F(ir_node *, (arity+1));
160                 else
161                         res->in = NEW_ARR_D(ir_node *, irg->obst, (arity+1));
162                 memcpy(&res->in[1], in, sizeof(ir_node *) * arity);
163         }
164
165         res->in[0] = block;
166         set_irn_dbg_info(res, db);
167         res->out = NULL;
168
169 #ifdef DEBUG_libfirm
170         res->node_nr = get_irp_new_node_nr();
171 #endif
172
173         for (i = 0; i < EDGE_KIND_LAST; ++i)
174                 INIT_LIST_HEAD(&res->edge_info[i].outs_head);
175
176         /* don't put this into the for loop, arity is -1 for some nodes! */
177         edges_notify_edge(res, -1, res->in[0], NULL, irg);
178         for (i = 1; i <= arity; ++i)
179                 edges_notify_edge(res, i - 1, res->in[i], NULL, irg);
180
181         hook_new_node(irg, res);
182
183         return res;
184 }
185
186 /*-- getting some parameters from ir_nodes --*/
187
188 int (is_ir_node)(const void *thing) {
189         return _is_ir_node(thing);
190 }
191
192 int (get_irn_intra_arity)(const ir_node *node) {
193         return _get_irn_intra_arity(node);
194 }
195
196 int (get_irn_inter_arity)(const ir_node *node) {
197         return _get_irn_inter_arity(node);
198 }
199
200 int (*_get_irn_arity)(const ir_node *node) = _get_irn_intra_arity;
201
202 int (get_irn_arity)(const ir_node *node) {
203         return _get_irn_arity(node);
204 }
205
206 /* Returns the array with ins. This array is shifted with respect to the
207    array accessed by get_irn_n: The block operand is at position 0 not -1.
208    (@@@ This should be changed.)
209    The order of the predecessors in this array is not guaranteed, except that
210    lists of operands as predecessors of Block or arguments of a Call are
211    consecutive. */
212 ir_node **get_irn_in(const ir_node *node) {
213         assert(node);
214         if (get_interprocedural_view()) { /* handle Filter and Block specially */
215                 if (get_irn_opcode(node) == iro_Filter) {
216                         assert(node->attr.filter.in_cg);
217                         return node->attr.filter.in_cg;
218                 } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) {
219                         return node->attr.block.in_cg;
220                 }
221                 /* else fall through */
222         }
223         return node->in;
224 }
225
226 void set_irn_in(ir_node *node, int arity, ir_node **in) {
227         int i;
228         ir_node *** pOld_in;
229         ir_graph *irg = current_ir_graph;
230         assert(node);
231         if (get_interprocedural_view()) { /* handle Filter and Block specially */
232                 ir_opcode code = get_irn_opcode(node);
233                 if (code  == iro_Filter) {
234                         assert(node->attr.filter.in_cg);
235                         pOld_in = &node->attr.filter.in_cg;
236                 } else if (code == iro_Block && node->attr.block.in_cg) {
237                         pOld_in = &node->attr.block.in_cg;
238                 } else {
239                         pOld_in = &node->in;
240                 }
241         } else {
242                 pOld_in = &node->in;
243         }
244
245         for (i = 0; i < arity; i++) {
246                 if (i < ARR_LEN(*pOld_in)-1)
247                         edges_notify_edge(node, i, in[i], (*pOld_in)[i+1], irg);
248                 else
249                         edges_notify_edge(node, i, in[i], NULL,            irg);
250         }
251         for (;i < ARR_LEN(*pOld_in)-1; i++) {
252                 edges_notify_edge(node, i, NULL, (*pOld_in)[i+1], irg);
253         }
254
255         if (arity != ARR_LEN(*pOld_in) - 1) {
256                 ir_node * block = (*pOld_in)[0];
257                 *pOld_in = NEW_ARR_D(ir_node *, irg->obst, arity + 1);
258                 (*pOld_in)[0] = block;
259         }
260         fix_backedges(irg->obst, node);
261
262         memcpy((*pOld_in) + 1, in, sizeof(ir_node *) * arity);
263 }
264
265 ir_node *(get_irn_intra_n)(const ir_node *node, int n) {
266         return _get_irn_intra_n (node, n);
267 }
268
269 ir_node *(get_irn_inter_n)(const ir_node *node, int n) {
270         return _get_irn_inter_n (node, n);
271 }
272
273 ir_node *(*_get_irn_n)(const ir_node *node, int n) = _get_irn_intra_n;
274
275 ir_node *(get_irn_n)(const ir_node *node, int n) {
276         return _get_irn_n(node, n);
277 }
278
279 void set_irn_n(ir_node *node, int n, ir_node *in) {
280         assert(node && node->kind == k_ir_node);
281         assert(-1 <= n);
282         assert(n < get_irn_arity(node));
283         assert(in && in->kind == k_ir_node);
284
285         if ((n == -1) && (get_irn_opcode(node) == iro_Filter)) {
286                 /* Change block pred in both views! */
287                 node->in[n + 1] = in;
288                 assert(node->attr.filter.in_cg);
289                 node->attr.filter.in_cg[n + 1] = in;
290                 return;
291         }
292         if (get_interprocedural_view()) { /* handle Filter and Block specially */
293                 if (get_irn_opcode(node) == iro_Filter) {
294                         assert(node->attr.filter.in_cg);
295                         node->attr.filter.in_cg[n + 1] = in;
296                         return;
297                 } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) {
298                         node->attr.block.in_cg[n + 1] = in;
299                         return;
300                 }
301                 /* else fall through */
302         }
303
304         /* Call the hook */
305         hook_set_irn_n(node, n, in, node->in[n + 1]);
306
307         /* Here, we rely on src and tgt being in the current ir graph */
308         edges_notify_edge(node, n, in, node->in[n + 1], current_ir_graph);
309
310         node->in[n + 1] = in;
311 }
312
313 int add_irn_n(ir_node *node, ir_node *in) {
314         int pos;
315         ir_graph *irg = get_irn_irg(node);
316
317         assert(node->op->opar == oparity_dynamic);
318         pos = ARR_LEN(node->in) - 1;
319         ARR_APP1(ir_node *, node->in, in);
320         edges_notify_edge(node, pos, node->in[pos + 1], NULL, irg);
321
322         /* Call the hook */
323         hook_set_irn_n(node, pos, node->in[pos + 1], NULL);
324
325         return pos;
326 }
327
328 void del_Sync_n(ir_node *n, int i)
329 {
330         int      arity     = get_Sync_n_preds(n);
331         ir_node *last_pred = get_Sync_pred(n, arity - 1);
332         set_Sync_pred(n, i, last_pred);
333         edges_notify_edge(n, arity - 1, NULL, last_pred, get_irn_irg(n));
334         ARR_SHRINKLEN(get_irn_in(n), arity);
335 }
336
337 int (get_irn_deps)(const ir_node *node) {
338         return _get_irn_deps(node);
339 }
340
341 ir_node *(get_irn_dep)(const ir_node *node, int pos) {
342         return _get_irn_dep(node, pos);
343 }
344
345 void (set_irn_dep)(ir_node *node, int pos, ir_node *dep) {
346         _set_irn_dep(node, pos, dep);
347 }
348
349 int add_irn_dep(ir_node *node, ir_node *dep) {
350         int res = 0;
351
352         if (node->deps == NULL) {
353                 node->deps = NEW_ARR_F(ir_node *, 1);
354                 node->deps[0] = dep;
355         } else {
356                 int i, n;
357                 int first_zero = -1;
358
359                 for(i = 0, n = ARR_LEN(node->deps); i < n; ++i) {
360                         if(node->deps[i] == NULL)
361                                 first_zero = i;
362
363                         if(node->deps[i] == dep)
364                                 return i;
365                 }
366
367                 if (first_zero >= 0) {
368                         node->deps[first_zero] = dep;
369                         res = first_zero;
370                 } else {
371                         ARR_APP1(ir_node *, node->deps, dep);
372                         res = n;
373                 }
374         }
375
376         edges_notify_edge_kind(node, res, dep, NULL, EDGE_KIND_DEP, get_irn_irg(node));
377
378         return res;
379 }
380
381 void add_irn_deps(ir_node *tgt, ir_node *src) {
382         int i, n;
383
384         for (i = 0, n = get_irn_deps(src); i < n; ++i)
385                 add_irn_dep(tgt, get_irn_dep(src, i));
386 }
387
388
389 ir_mode *(get_irn_mode)(const ir_node *node) {
390         return _get_irn_mode(node);
391 }
392
393 void (set_irn_mode)(ir_node *node, ir_mode *mode) {
394         _set_irn_mode(node, mode);
395 }
396
397 modecode get_irn_modecode(const ir_node *node) {
398         assert(node);
399         return node->mode->code;
400 }
401
402 /** Gets the string representation of the mode .*/
403 const char *get_irn_modename(const ir_node *node) {
404         assert(node);
405         return get_mode_name(node->mode);
406 }
407
408 ident *get_irn_modeident(const ir_node *node) {
409         assert(node);
410         return get_mode_ident(node->mode);
411 }
412
413 ir_op *(get_irn_op)(const ir_node *node) {
414         return _get_irn_op(node);
415 }
416
417 /* should be private to the library: */
418 void (set_irn_op)(ir_node *node, ir_op *op) {
419         _set_irn_op(node, op);
420 }
421
422 unsigned (get_irn_opcode)(const ir_node *node) {
423         return _get_irn_opcode(node);
424 }
425
426 const char *get_irn_opname(const ir_node *node) {
427         assert(node);
428         if (is_Phi0(node)) return "Phi0";
429         return get_id_str(node->op->name);
430 }
431
432 ident *get_irn_opident(const ir_node *node) {
433         assert(node);
434         return node->op->name;
435 }
436
437 unsigned long (get_irn_visited)(const ir_node *node) {
438         return _get_irn_visited(node);
439 }
440
441 void (set_irn_visited)(ir_node *node, unsigned long visited) {
442         _set_irn_visited(node, visited);
443 }
444
445 void (mark_irn_visited)(ir_node *node) {
446         _mark_irn_visited(node);
447 }
448
449 int (irn_not_visited)(const ir_node *node) {
450         return _irn_not_visited(node);
451 }
452
453 int (irn_visited)(const ir_node *node) {
454         return _irn_visited(node);
455 }
456
457 void (set_irn_link)(ir_node *node, void *link) {
458         _set_irn_link(node, link);
459 }
460
461 void *(get_irn_link)(const ir_node *node) {
462         return _get_irn_link(node);
463 }
464
465 op_pin_state (get_irn_pinned)(const ir_node *node) {
466         return _get_irn_pinned(node);
467 }
468
469 op_pin_state (is_irn_pinned_in_irg) (const ir_node *node) {
470         return _is_irn_pinned_in_irg(node);
471 }
472
473 void set_irn_pinned(ir_node *node, op_pin_state state) {
474         /* due to optimization an opt may be turned into a Tuple */
475         if (get_irn_op(node) == op_Tuple)
476                 return;
477
478         assert(node && get_op_pinned(get_irn_op(node)) >= op_pin_state_exc_pinned);
479         assert(state == op_pin_state_pinned || state == op_pin_state_floats);
480
481         node->attr.except.pin_state = state;
482 }
483
484 #ifdef DO_HEAPANALYSIS
485 /* Access the abstract interpretation information of a node.
486    Returns NULL if no such information is available. */
487 struct abstval *get_irn_abst_value(ir_node *n) {
488         return n->av;
489 }
490 /* Set the abstract interpretation information of a node. */
491 void set_irn_abst_value(ir_node *n, struct abstval *os) {
492         n->av = os;
493 }
494 struct section *firm_get_irn_section(ir_node *n) {
495         return n->sec;
496 }
497 void firm_set_irn_section(ir_node *n, struct section *s) {
498         n->sec = s;
499 }
500 #else
501 /* Dummies needed for firmjni. */
502 struct abstval *get_irn_abst_value(ir_node *n) {
503         (void) n;
504         return NULL;
505 }
506 void set_irn_abst_value(ir_node *n, struct abstval *os) {
507         (void) n;
508         (void) os;
509 }
510 struct section *firm_get_irn_section(ir_node *n) {
511         (void) n;
512         return NULL;
513 }
514 void firm_set_irn_section(ir_node *n, struct section *s) {
515         (void) n;
516         (void) s;
517 }
518 #endif /* DO_HEAPANALYSIS */
519
520
521 /* Outputs a unique number for this node */
522 long get_irn_node_nr(const ir_node *node) {
523         assert(node);
524 #ifdef DEBUG_libfirm
525         return node->node_nr;
526 #else
527         return (long)PTR_TO_INT(node);
528 #endif
529 }
530
531 const_attr *get_irn_const_attr(ir_node *node) {
532         assert(node->op == op_Const);
533         return &node->attr.con;
534 }
535
536 long get_irn_proj_attr(ir_node *node) {
537         assert(node->op == op_Proj);
538         return node->attr.proj;
539 }
540
541 alloc_attr *get_irn_alloc_attr(ir_node *node) {
542         assert(node->op == op_Alloc);
543         return &node->attr.alloc;
544 }
545
546 free_attr *get_irn_free_attr(ir_node *node) {
547         assert(node->op == op_Free);
548         return &node->attr.free;
549 }
550
551 symconst_attr *get_irn_symconst_attr(ir_node *node) {
552         assert(node->op == op_SymConst);
553         return &node->attr.symc;
554 }
555
556 ir_type *get_irn_call_attr(ir_node *node) {
557         assert(node->op == op_Call);
558         return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
559 }
560
561 sel_attr *get_irn_sel_attr(ir_node *node) {
562         assert(node->op == op_Sel);
563         return &node->attr.sel;
564 }
565
566 phi_attr *get_irn_phi_attr(ir_node *node) {
567         return &node->attr.phi;
568 }
569
570 block_attr *get_irn_block_attr(ir_node *node) {
571         assert(node->op == op_Block);
572         return &node->attr.block;
573 }
574
575 load_attr *get_irn_load_attr(ir_node *node) {
576         assert(node->op == op_Load);
577         return &node->attr.load;
578 }
579
580 store_attr *get_irn_store_attr(ir_node *node) {
581         assert(node->op == op_Store);
582         return &node->attr.store;
583 }
584
585 except_attr *get_irn_except_attr(ir_node *node) {
586         assert(node->op == op_Div || node->op == op_Quot ||
587                node->op == op_DivMod || node->op == op_Mod || node->op == op_Call || node->op == op_Alloc || node->op == op_Bound);
588         return &node->attr.except;
589 }
590
591 divmod_attr *get_irn_divmod_attr(ir_node *node) {
592         assert(node->op == op_Div || node->op == op_Quot ||
593                node->op == op_DivMod || node->op == op_Mod);
594         return &node->attr.divmod;
595 }
596
597 void *(get_irn_generic_attr)(ir_node *node) {
598         assert(is_ir_node(node));
599         return _get_irn_generic_attr(node);
600 }
601
602 const void *(get_irn_generic_attr_const)(const ir_node *node) {
603         assert(is_ir_node(node));
604         return _get_irn_generic_attr_const(node);
605 }
606
607 unsigned (get_irn_idx)(const ir_node *node) {
608         assert(is_ir_node(node));
609         return _get_irn_idx(node);
610 }
611
612 int get_irn_pred_pos(ir_node *node, ir_node *arg) {
613         int i;
614         for (i = get_irn_arity(node) - 1; i >= 0; i--) {
615                 if (get_irn_n(node, i) == arg)
616                         return i;
617         }
618         return -1;
619 }
620
621 /** manipulate fields of individual nodes **/
622
623 /* this works for all except Block */
624 ir_node *get_nodes_block(const ir_node *node) {
625         assert(node->op != op_Block);
626         return get_irn_n(node, -1);
627 }
628
629 void set_nodes_block(ir_node *node, ir_node *block) {
630         assert(node->op != op_Block);
631         set_irn_n(node, -1, block);
632 }
633
634 /* this works for all except Block */
635 ir_node *get_nodes_MacroBlock(const ir_node *node) {
636         assert(node->op != op_Block);
637         return get_Block_MacroBlock(get_irn_n(node, -1));
638 }
639
640 /* Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
641  * from Start.  If so returns frame type, else Null. */
642 ir_type *is_frame_pointer(const ir_node *n) {
643         if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_frame_base)) {
644                 ir_node *start = get_Proj_pred(n);
645                 if (is_Start(start)) {
646                         return get_irg_frame_type(get_irn_irg(start));
647                 }
648         }
649         return NULL;
650 }
651
652 /* Test whether arbitrary node is tls pointer, i.e. Proj(pn_Start_P_tls)
653  * from Start.  If so returns tls type, else Null. */
654 ir_type *is_tls_pointer(const ir_node *n) {
655         if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_tls)) {
656                 ir_node *start = get_Proj_pred(n);
657                 if (is_Start(start)) {
658                         return get_tls_type();
659                 }
660         }
661         return NULL;
662 }
663
664 /* Test whether arbitrary node is value arg base, i.e. Proj(pn_Start_P_value_arg_base)
665  * from Start.  If so returns 1, else 0. */
666 int is_value_arg_pointer(const ir_node *n) {
667         if (is_Proj(n) &&
668                 (get_Proj_proj(n) == pn_Start_P_value_arg_base) &&
669                 is_Start(get_Proj_pred(n)))
670                 return 1;
671         return 0;
672 }
673
674 /* Returns an array with the predecessors of the Block. Depending on
675    the implementation of the graph data structure this can be a copy of
676    the internal representation of predecessors as well as the internal
677    array itself. Therefore writing to this array might obstruct the ir. */
678 ir_node **get_Block_cfgpred_arr(ir_node *node) {
679         assert((node->op == op_Block));
680         return (ir_node **)&(get_irn_in(node)[1]);
681 }
682
683 int (get_Block_n_cfgpreds)(const ir_node *node) {
684         return _get_Block_n_cfgpreds(node);
685 }
686
687 ir_node *(get_Block_cfgpred)(const ir_node *node, int pos) {
688         return _get_Block_cfgpred(node, pos);
689 }
690
691 void set_Block_cfgpred(ir_node *node, int pos, ir_node *pred) {
692         assert(node->op == op_Block);
693         set_irn_n(node, pos, pred);
694 }
695
696 ir_node *(get_Block_cfgpred_block)(const ir_node *node, int pos) {
697         return _get_Block_cfgpred_block(node, pos);
698 }
699
700 int get_Block_matured(const ir_node *node) {
701         assert(node->op == op_Block);
702         return (int)node->attr.block.is_matured;
703 }
704
705 void set_Block_matured(ir_node *node, int matured) {
706         assert(node->op == op_Block);
707         node->attr.block.is_matured = matured;
708 }
709
710 unsigned long (get_Block_block_visited)(const ir_node *node) {
711         return _get_Block_block_visited(node);
712 }
713
714 void (set_Block_block_visited)(ir_node *node, unsigned long visit) {
715         _set_Block_block_visited(node, visit);
716 }
717
718 /* For this current_ir_graph must be set. */
719 void (mark_Block_block_visited)(ir_node *node) {
720         _mark_Block_block_visited(node);
721 }
722
723 int (Block_not_block_visited)(const ir_node *node) {
724         return _Block_not_block_visited(node);
725 }
726
727 int (Block_block_visited)(const ir_node *node) {
728         return _Block_block_visited(node);
729 }
730
731 ir_node *get_Block_graph_arr(ir_node *node, int pos) {
732         assert(node->op == op_Block);
733         return node->attr.block.graph_arr[pos+1];
734 }
735
736 void set_Block_graph_arr(ir_node *node, int pos, ir_node *value) {
737         assert(node->op == op_Block);
738         node->attr.block.graph_arr[pos+1] = value;
739 }
740
741 #ifdef INTERPROCEDURAL_VIEW
742 void set_Block_cg_cfgpred_arr(ir_node *node, int arity, ir_node *in[]) {
743         assert(node->op == op_Block);
744         if (node->attr.block.in_cg == NULL || arity != ARR_LEN(node->attr.block.in_cg) - 1) {
745                 node->attr.block.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
746                 node->attr.block.in_cg[0] = NULL;
747                 node->attr.block.cg_backedge = new_backedge_arr(current_ir_graph->obst, arity);
748                 {
749                         /* Fix backedge array.  fix_backedges() operates depending on
750                            interprocedural_view. */
751                         int ipv = get_interprocedural_view();
752                         set_interprocedural_view(1);
753                         fix_backedges(current_ir_graph->obst, node);
754                         set_interprocedural_view(ipv);
755                 }
756         }
757         memcpy(node->attr.block.in_cg + 1, in, sizeof(ir_node *) * arity);
758 }
759
760 void set_Block_cg_cfgpred(ir_node *node, int pos, ir_node *pred) {
761         assert(node->op == op_Block &&
762                node->attr.block.in_cg &&
763                0 <= pos && pos < ARR_LEN(node->attr.block.in_cg) - 1);
764         node->attr.block.in_cg[pos + 1] = pred;
765 }
766
767 ir_node **get_Block_cg_cfgpred_arr(ir_node *node) {
768         assert(node->op == op_Block);
769         return node->attr.block.in_cg == NULL ? NULL : node->attr.block.in_cg  + 1;
770 }
771
772 int get_Block_cg_n_cfgpreds(const ir_node *node) {
773         assert(node->op == op_Block);
774         return node->attr.block.in_cg == NULL ? 0 : ARR_LEN(node->attr.block.in_cg) - 1;
775 }
776
777 ir_node *get_Block_cg_cfgpred(const ir_node *node, int pos) {
778         assert(node->op == op_Block && node->attr.block.in_cg);
779         return node->attr.block.in_cg[pos + 1];
780 }
781
782 void remove_Block_cg_cfgpred_arr(ir_node *node) {
783         assert(node->op == op_Block);
784         node->attr.block.in_cg = NULL;
785 }
786 #endif
787
788 ir_node *(set_Block_dead)(ir_node *block) {
789         return _set_Block_dead(block);
790 }
791
792 int (is_Block_dead)(const ir_node *block) {
793         return _is_Block_dead(block);
794 }
795
796 ir_extblk *get_Block_extbb(const ir_node *block) {
797         ir_extblk *res;
798         assert(is_Block(block));
799         res = block->attr.block.extblk;
800         assert(res == NULL || is_ir_extbb(res));
801         return res;
802 }
803
804 void set_Block_extbb(ir_node *block, ir_extblk *extblk) {
805         assert(is_Block(block));
806         assert(extblk == NULL || is_ir_extbb(extblk));
807         block->attr.block.extblk = extblk;
808 }
809
810 /* Returns the macro block header of a block.*/
811 ir_node *get_Block_MacroBlock(const ir_node *block) {
812         ir_node *mbh;
813         assert(is_Block(block));
814         mbh = get_irn_n(block, -1);
815         /* once macro block header is respected by all optimizations,
816            this assert can be removed */
817         assert(mbh != NULL);
818         return mbh;
819 }
820
821 /* Sets the macro block header of a block. */
822 void set_Block_MacroBlock(ir_node *block, ir_node *mbh) {
823         assert(is_Block(block));
824         assert(is_Block(mbh));
825         set_irn_n(block, -1, mbh);
826 }
827
828 /* returns the macro block header of a node. */
829 ir_node *get_irn_MacroBlock(const ir_node *n) {
830         if (! is_Block(n)) {
831                 n = get_nodes_block(n);
832                 /* if the Block is Bad, do NOT try to get it's MB, it will fail. */
833                 if (is_Bad(n))
834                         return (ir_node *)n;
835         }
836         return get_Block_MacroBlock(n);
837 }
838
839 /* returns the graph of a Block. */
840 ir_graph *get_Block_irg(const ir_node *block) {
841         assert(is_Block(block));
842         return block->attr.block.irg;
843 }
844
845 int has_Block_label(const ir_node *block) {
846         assert(is_Block(block));
847         return block->attr.block.has_label;
848 }
849
850 ir_label_t get_Block_label(const ir_node *block) {
851         assert(is_Block(block));
852         return block->attr.block.label;
853 }
854
855 void set_Block_label(ir_node *block, ir_label_t label) {
856         assert(is_Block(block));
857         block->attr.block.has_label = 1;
858         block->attr.block.label = label;
859 }
860
861 ir_node *(get_Block_phis)(const ir_node *block) {
862         return _get_Block_phis(block);
863 }
864
865 void (set_Block_phis)(ir_node *block, ir_node *phi) {
866         _set_Block_phis(block, phi);
867 }
868
869 void (add_Block_phi)(ir_node *block, ir_node *phi) {
870         _add_Block_phi(block, phi);
871 }
872
873 /* Get the Block mark (single bit). */
874 unsigned (get_Block_mark)(const ir_node *block) {
875         return _get_Block_mark(block);
876 }
877
878 /* Set the Block mark (single bit). */
879 void (set_Block_mark)(ir_node *block, unsigned mark) {
880         _set_Block_mark(block, mark);
881 }
882
883 int get_End_n_keepalives(const ir_node *end) {
884         assert(end->op == op_End);
885         return (get_irn_arity(end) - END_KEEPALIVE_OFFSET);
886 }
887
888 ir_node *get_End_keepalive(const ir_node *end, int pos) {
889         assert(end->op == op_End);
890         return get_irn_n(end, pos + END_KEEPALIVE_OFFSET);
891 }
892
893 void add_End_keepalive(ir_node *end, ir_node *ka) {
894         assert(end->op == op_End);
895         assert((is_Phi(ka) || is_Proj(ka) || is_Block(ka) || is_irn_keep(ka)) && "Only Phi, Block or Keep nodes can be kept alive!");
896         add_irn_n(end, ka);
897 }
898
899 void set_End_keepalive(ir_node *end, int pos, ir_node *ka) {
900         assert(end->op == op_End);
901         set_irn_n(end, pos + END_KEEPALIVE_OFFSET, ka);
902 }
903
904 /* Set new keep-alives */
905 void set_End_keepalives(ir_node *end, int n, ir_node *in[]) {
906         int i;
907         ir_graph *irg = get_irn_irg(end);
908
909         /* notify that edges are deleted */
910         for (i = END_KEEPALIVE_OFFSET; i < ARR_LEN(end->in) - 1; ++i) {
911                 edges_notify_edge(end, i, NULL, end->in[i + 1], irg);
912         }
913         ARR_RESIZE(ir_node *, end->in, n + 1 + END_KEEPALIVE_OFFSET);
914
915         for (i = 0; i < n; ++i) {
916                 end->in[1 + END_KEEPALIVE_OFFSET + i] = in[i];
917                 edges_notify_edge(end, END_KEEPALIVE_OFFSET + i, end->in[1 + END_KEEPALIVE_OFFSET + i], NULL, irg);
918         }
919 }
920
921 /* Set new keep-alives from old keep-alives, skipping irn */
922 void remove_End_keepalive(ir_node *end, ir_node *irn) {
923         int     n = get_End_n_keepalives(end);
924         ir_node **in;
925         int     i, idx;
926
927         NEW_ARR_A(ir_node *, in, n);
928
929         for (idx = i = 0; i < n; ++i) {
930                 ir_node *old_ka = get_End_keepalive(end, i);
931
932                 /* skip irn */
933                 if (old_ka != irn)
934                         in[idx++] = old_ka;
935         }
936
937         /* set new keep-alives */
938         set_End_keepalives(end, idx, in);
939 }
940
941 void
942 free_End(ir_node *end) {
943         assert(end->op == op_End);
944         end->kind = k_BAD;
945         DEL_ARR_F(end->in);
946         end->in = NULL;   /* @@@ make sure we get an error if we use the
947                              in array afterwards ... */
948 }
949
950 /* Return the target address of an IJmp */
951 ir_node *get_IJmp_target(const ir_node *ijmp) {
952         assert(ijmp->op == op_IJmp);
953         return get_irn_n(ijmp, 0);
954 }
955
956 /** Sets the target address of an IJmp */
957 void set_IJmp_target(ir_node *ijmp, ir_node *tgt) {
958         assert(ijmp->op == op_IJmp);
959         set_irn_n(ijmp, 0, tgt);
960 }
961
962 /*
963 > Implementing the case construct (which is where the constant Proj node is
964 > important) involves far more than simply determining the constant values.
965 > We could argue that this is more properly a function of the translator from
966 > Firm to the target machine.  That could be done if there was some way of
967 > projecting "default" out of the Cond node.
968 I know it's complicated.
969 Basically there are two problems:
970  - determining the gaps between the Projs
971  - determining the biggest case constant to know the proj number for
972    the default node.
973 I see several solutions:
974 1. Introduce a ProjDefault node.  Solves both problems.
975    This means to extend all optimizations executed during construction.
976 2. Give the Cond node for switch two flavors:
977    a) there are no gaps in the Projs  (existing flavor)
978    b) gaps may exist, default proj is still the Proj with the largest
979       projection number.  This covers also the gaps.
980 3. Fix the semantic of the Cond to that of 2b)
981
982 Solution 2 seems to be the best:
983 Computing the gaps in the Firm representation is not too hard, i.e.,
984 libFIRM can implement a routine that transforms between the two
985 flavours.  This is also possible for 1) but 2) does not require to
986 change any existing optimization.
987 Further it should be far simpler to determine the biggest constant than
988 to compute all gaps.
989 I don't want to choose 3) as 2a) seems to have advantages for
990 dataflow analysis and 3) does not allow to convert the representation to
991 2a).
992 */
993 ir_node *
994 get_Cond_selector(const ir_node *node) {
995         assert(node->op == op_Cond);
996         return get_irn_n(node, 0);
997 }
998
999 void
1000 set_Cond_selector(ir_node *node, ir_node *selector) {
1001         assert(node->op == op_Cond);
1002         set_irn_n(node, 0, selector);
1003 }
1004
1005 cond_kind
1006 get_Cond_kind(const ir_node *node) {
1007         assert(node->op == op_Cond);
1008         return node->attr.cond.kind;
1009 }
1010
1011 void
1012 set_Cond_kind(ir_node *node, cond_kind kind) {
1013         assert(node->op == op_Cond);
1014         node->attr.cond.kind = kind;
1015 }
1016
1017 long
1018 get_Cond_defaultProj(const ir_node *node) {
1019         assert(node->op == op_Cond);
1020         return node->attr.cond.default_proj;
1021 }
1022
1023 ir_node *
1024 get_Return_mem(const ir_node *node) {
1025         assert(node->op == op_Return);
1026         return get_irn_n(node, 0);
1027 }
1028
1029 void
1030 set_Return_mem(ir_node *node, ir_node *mem) {
1031         assert(node->op == op_Return);
1032         set_irn_n(node, 0, mem);
1033 }
1034
1035 int
1036 get_Return_n_ress(const ir_node *node) {
1037         assert(node->op == op_Return);
1038         return (get_irn_arity(node) - RETURN_RESULT_OFFSET);
1039 }
1040
1041 ir_node **
1042 get_Return_res_arr(ir_node *node) {
1043         assert((node->op == op_Return));
1044         if (get_Return_n_ress(node) > 0)
1045                 return (ir_node **)&(get_irn_in(node)[1 + RETURN_RESULT_OFFSET]);
1046         else
1047                 return NULL;
1048 }
1049
1050 /*
1051 void
1052 set_Return_n_res(ir_node *node, int results) {
1053         assert(node->op == op_Return);
1054 }
1055 */
1056
1057 ir_node *
1058 get_Return_res(const ir_node *node, int pos) {
1059         assert(node->op == op_Return);
1060         assert(get_Return_n_ress(node) > pos);
1061         return get_irn_n(node, pos + RETURN_RESULT_OFFSET);
1062 }
1063
1064 void
1065 set_Return_res(ir_node *node, int pos, ir_node *res){
1066         assert(node->op == op_Return);
1067         set_irn_n(node, pos + RETURN_RESULT_OFFSET, res);
1068 }
1069
1070 tarval *(get_Const_tarval)(const ir_node *node) {
1071         return _get_Const_tarval(node);
1072 }
1073
1074 void
1075 set_Const_tarval(ir_node *node, tarval *con) {
1076         assert(node->op == op_Const);
1077         node->attr.con.tv = con;
1078 }
1079
1080 int (is_Const_null)(const ir_node *node) {
1081         return _is_Const_null(node);
1082 }
1083
1084 int (is_Const_one)(const ir_node *node) {
1085         return _is_Const_one(node);
1086 }
1087
1088 int (is_Const_all_one)(const ir_node *node) {
1089         return _is_Const_all_one(node);
1090 }
1091
1092
1093 /* The source language type.  Must be an atomic type.  Mode of type must
1094    be mode of node. For tarvals from entities type must be pointer to
1095    entity type. */
1096 ir_type *
1097 get_Const_type(ir_node *node) {
1098         assert(node->op == op_Const);
1099         node->attr.con.tp = skip_tid(node->attr.con.tp);
1100         return node->attr.con.tp;
1101 }
1102
1103 void
1104 set_Const_type(ir_node *node, ir_type *tp) {
1105         assert(node->op == op_Const);
1106         if (tp != firm_unknown_type) {
1107                 assert(is_atomic_type(tp));
1108                 assert(get_type_mode(tp) == get_irn_mode(node));
1109         }
1110         node->attr.con.tp = tp;
1111 }
1112
1113
1114 symconst_kind
1115 get_SymConst_kind(const ir_node *node) {
1116         assert(node->op == op_SymConst);
1117         return node->attr.symc.kind;
1118 }
1119
1120 void
1121 set_SymConst_kind(ir_node *node, symconst_kind kind) {
1122         assert(node->op == op_SymConst);
1123         node->attr.symc.kind = kind;
1124 }
1125
1126 ir_type *
1127 get_SymConst_type(ir_node *node) {
1128         assert((node->op == op_SymConst) &&
1129                (SYMCONST_HAS_TYPE(get_SymConst_kind(node))));
1130         return node->attr.symc.sym.type_p = skip_tid(node->attr.symc.sym.type_p);
1131 }
1132
1133 void
1134 set_SymConst_type(ir_node *node, ir_type *tp) {
1135         assert((node->op == op_SymConst) &&
1136                (SYMCONST_HAS_TYPE(get_SymConst_kind(node))));
1137         node->attr.symc.sym.type_p = tp;
1138 }
1139
1140 ident *
1141 get_SymConst_name(const ir_node *node) {
1142         assert(node->op == op_SymConst && SYMCONST_HAS_ID(get_SymConst_kind(node)));
1143         return node->attr.symc.sym.ident_p;
1144 }
1145
1146 void
1147 set_SymConst_name(ir_node *node, ident *name) {
1148         assert(node->op == op_SymConst && SYMCONST_HAS_ID(get_SymConst_kind(node)));
1149         node->attr.symc.sym.ident_p = name;
1150 }
1151
1152
1153 /* Only to access SymConst of kind symconst_addr_ent.  Else assertion: */
1154 ir_entity *get_SymConst_entity(const ir_node *node) {
1155         assert(node->op == op_SymConst && SYMCONST_HAS_ENT(get_SymConst_kind(node)));
1156         return node->attr.symc.sym.entity_p;
1157 }
1158
1159 void set_SymConst_entity(ir_node *node, ir_entity *ent) {
1160         assert(node->op == op_SymConst && SYMCONST_HAS_ENT(get_SymConst_kind(node)));
1161         node->attr.symc.sym.entity_p  = ent;
1162 }
1163
1164 ir_enum_const *get_SymConst_enum(const ir_node *node) {
1165         assert(node->op == op_SymConst && SYMCONST_HAS_ENUM(get_SymConst_kind(node)));
1166         return node->attr.symc.sym.enum_p;
1167 }
1168
1169 void set_SymConst_enum(ir_node *node, ir_enum_const *ec) {
1170         assert(node->op == op_SymConst && SYMCONST_HAS_ENUM(get_SymConst_kind(node)));
1171         node->attr.symc.sym.enum_p  = ec;
1172 }
1173
1174 union symconst_symbol
1175 get_SymConst_symbol(const ir_node *node) {
1176         assert(node->op == op_SymConst);
1177         return node->attr.symc.sym;
1178 }
1179
1180 void
1181 set_SymConst_symbol(ir_node *node, union symconst_symbol sym) {
1182         assert(node->op == op_SymConst);
1183         node->attr.symc.sym = sym;
1184 }
1185
1186 ir_label_t get_SymConst_label(const ir_node *node) {
1187         assert(node->op == op_SymConst && SYMCONST_HAS_LABEL(get_SymConst_kind(node)));
1188         return node->attr.symc.sym.label;
1189 }
1190
1191 void set_SymConst_label(ir_node *node, ir_label_t label) {
1192         assert(node->op == op_SymConst && SYMCONST_HAS_LABEL(get_SymConst_kind(node)));
1193         node->attr.symc.sym.label = label;
1194 }
1195
1196 ir_type *
1197 get_SymConst_value_type(ir_node *node) {
1198         assert(node->op == op_SymConst);
1199         if (node->attr.symc.tp) node->attr.symc.tp = skip_tid(node->attr.symc.tp);
1200         return node->attr.symc.tp;
1201 }
1202
1203 void
1204 set_SymConst_value_type(ir_node *node, ir_type *tp) {
1205         assert(node->op == op_SymConst);
1206         node->attr.symc.tp = tp;
1207 }
1208
1209 ir_node *
1210 get_Sel_mem(const ir_node *node) {
1211         assert(node->op == op_Sel);
1212         return get_irn_n(node, 0);
1213 }
1214
1215 void
1216 set_Sel_mem(ir_node *node, ir_node *mem) {
1217         assert(node->op == op_Sel);
1218         set_irn_n(node, 0, mem);
1219 }
1220
1221 ir_node *
1222 get_Sel_ptr(const ir_node *node) {
1223         assert(node->op == op_Sel);
1224         return get_irn_n(node, 1);
1225 }
1226
1227 void
1228 set_Sel_ptr(ir_node *node, ir_node *ptr) {
1229         assert(node->op == op_Sel);
1230         set_irn_n(node, 1, ptr);
1231 }
1232
1233 int
1234 get_Sel_n_indexs(const ir_node *node) {
1235         assert(node->op == op_Sel);
1236         return (get_irn_arity(node) - SEL_INDEX_OFFSET);
1237 }
1238
1239 ir_node **
1240 get_Sel_index_arr(ir_node *node) {
1241         assert((node->op == op_Sel));
1242         if (get_Sel_n_indexs(node) > 0)
1243                 return (ir_node **)& get_irn_in(node)[SEL_INDEX_OFFSET + 1];
1244         else
1245                 return NULL;
1246 }
1247
1248 ir_node *
1249 get_Sel_index(const ir_node *node, int pos) {
1250         assert(node->op == op_Sel);
1251         return get_irn_n(node, pos + SEL_INDEX_OFFSET);
1252 }
1253
1254 void
1255 set_Sel_index(ir_node *node, int pos, ir_node *index) {
1256         assert(node->op == op_Sel);
1257         set_irn_n(node, pos + SEL_INDEX_OFFSET, index);
1258 }
1259
1260 ir_entity *
1261 get_Sel_entity(const ir_node *node) {
1262         assert(node->op == op_Sel);
1263         return node->attr.sel.ent;
1264 }
1265
1266 ir_entity *_get_Sel_entity(ir_node *node) {
1267         return get_Sel_entity(node);
1268 }
1269
1270 void
1271 set_Sel_entity(ir_node *node, ir_entity *ent) {
1272         assert(node->op == op_Sel);
1273         node->attr.sel.ent = ent;
1274 }
1275
1276
1277 /* For unary and binary arithmetic operations the access to the
1278    operands can be factored out.  Left is the first, right the
1279    second arithmetic value  as listed in tech report 0999-33.
1280    unops are: Minus, Abs, Not, Conv, Cast
1281    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
1282    Shr, Shrs, Rotate, Cmp */
1283
1284
1285 ir_node *
1286 get_Call_mem(const ir_node *node) {
1287         assert(node->op == op_Call);
1288         return get_irn_n(node, 0);
1289 }
1290
1291 void
1292 set_Call_mem(ir_node *node, ir_node *mem) {
1293         assert(node->op == op_Call);
1294         set_irn_n(node, 0, mem);
1295 }
1296
1297 ir_node *
1298 get_Call_ptr(const ir_node *node) {
1299         assert(node->op == op_Call);
1300         return get_irn_n(node, 1);
1301 }
1302
1303 void
1304 set_Call_ptr(ir_node *node, ir_node *ptr) {
1305         assert(node->op == op_Call);
1306         set_irn_n(node, 1, ptr);
1307 }
1308
1309 ir_node **
1310 get_Call_param_arr(ir_node *node) {
1311         assert(node->op == op_Call);
1312         return (ir_node **)&get_irn_in(node)[CALL_PARAM_OFFSET + 1];
1313 }
1314
1315 int
1316 get_Call_n_params(const ir_node *node)  {
1317         assert(node->op == op_Call);
1318         return (get_irn_arity(node) - CALL_PARAM_OFFSET);
1319 }
1320
1321 int
1322 get_Call_arity(const ir_node *node) {
1323         assert(node->op == op_Call);
1324         return get_Call_n_params(node);
1325 }
1326
1327 /* void
1328 set_Call_arity(ir_node *node, ir_node *arity) {
1329         assert(node->op == op_Call);
1330 }
1331 */
1332
1333 ir_node *
1334 get_Call_param(const ir_node *node, int pos) {
1335         assert(node->op == op_Call);
1336         return get_irn_n(node, pos + CALL_PARAM_OFFSET);
1337 }
1338
1339 void
1340 set_Call_param(ir_node *node, int pos, ir_node *param) {
1341         assert(node->op == op_Call);
1342         set_irn_n(node, pos + CALL_PARAM_OFFSET, param);
1343 }
1344
1345 ir_type *
1346 get_Call_type(ir_node *node) {
1347         assert(node->op == op_Call);
1348         return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
1349 }
1350
1351 void
1352 set_Call_type(ir_node *node, ir_type *tp) {
1353         assert(node->op == op_Call);
1354         assert((get_unknown_type() == tp) || is_Method_type(tp));
1355         node->attr.call.cld_tp = tp;
1356 }
1357
1358 int Call_has_callees(const ir_node *node) {
1359         assert(node && node->op == op_Call);
1360         return ((get_irg_callee_info_state(get_irn_irg(node)) != irg_callee_info_none) &&
1361                 (node->attr.call.callee_arr != NULL));
1362 }
1363
1364 int get_Call_n_callees(const ir_node *node) {
1365   assert(node && node->op == op_Call && node->attr.call.callee_arr);
1366   return ARR_LEN(node->attr.call.callee_arr);
1367 }
1368
1369 ir_entity *get_Call_callee(const ir_node *node, int pos) {
1370         assert(pos >= 0 && pos < get_Call_n_callees(node));
1371         return node->attr.call.callee_arr[pos];
1372 }
1373
1374 void set_Call_callee_arr(ir_node *node, const int n, ir_entity ** arr) {
1375         assert(node->op == op_Call);
1376         if (node->attr.call.callee_arr == NULL || get_Call_n_callees(node) != n) {
1377                 node->attr.call.callee_arr = NEW_ARR_D(ir_entity *, current_ir_graph->obst, n);
1378         }
1379         memcpy(node->attr.call.callee_arr, arr, n * sizeof(ir_entity *));
1380 }
1381
1382 void remove_Call_callee_arr(ir_node *node) {
1383         assert(node->op == op_Call);
1384         node->attr.call.callee_arr = NULL;
1385 }
1386
1387 ir_node *get_CallBegin_ptr(const ir_node *node) {
1388         assert(node->op == op_CallBegin);
1389         return get_irn_n(node, 0);
1390 }
1391
1392 void set_CallBegin_ptr(ir_node *node, ir_node *ptr) {
1393         assert(node->op == op_CallBegin);
1394         set_irn_n(node, 0, ptr);
1395 }
1396
1397 ir_node *get_CallBegin_call(const ir_node *node) {
1398         assert(node->op == op_CallBegin);
1399         return node->attr.callbegin.call;
1400 }
1401
1402 void set_CallBegin_call(ir_node *node, ir_node *call) {
1403         assert(node->op == op_CallBegin);
1404         node->attr.callbegin.call = call;
1405 }
1406
1407
1408 #define BINOP(OP)                                      \
1409 ir_node * get_##OP##_left(const ir_node *node) {       \
1410   assert(node->op == op_##OP);                         \
1411   return get_irn_n(node, node->op->op_index);          \
1412 }                                                      \
1413 void set_##OP##_left(ir_node *node, ir_node *left) {   \
1414   assert(node->op == op_##OP);                         \
1415   set_irn_n(node, node->op->op_index, left);           \
1416 }                                                      \
1417 ir_node *get_##OP##_right(const ir_node *node) {       \
1418   assert(node->op == op_##OP);                         \
1419   return get_irn_n(node, node->op->op_index + 1);      \
1420 }                                                      \
1421 void set_##OP##_right(ir_node *node, ir_node *right) { \
1422   assert(node->op == op_##OP);                         \
1423   set_irn_n(node, node->op->op_index + 1, right);      \
1424 }
1425
1426 #define UNOP(OP)                                  \
1427 ir_node *get_##OP##_op(const ir_node *node) {     \
1428   assert(node->op == op_##OP);                    \
1429   return get_irn_n(node, node->op->op_index);     \
1430 }                                                 \
1431 void set_##OP##_op(ir_node *node, ir_node *op) {  \
1432   assert(node->op == op_##OP);                    \
1433   set_irn_n(node, node->op->op_index, op);        \
1434 }
1435
1436 #define BINOP_MEM(OP)                         \
1437 BINOP(OP)                                     \
1438                                               \
1439 ir_node *                                     \
1440 get_##OP##_mem(const ir_node *node) {         \
1441   assert(node->op == op_##OP);                \
1442   return get_irn_n(node, 0);                  \
1443 }                                             \
1444                                               \
1445 void                                          \
1446 set_##OP##_mem(ir_node *node, ir_node *mem) { \
1447   assert(node->op == op_##OP);                \
1448   set_irn_n(node, 0, mem);                    \
1449 }
1450
1451 #define DIVOP(OP)                                       \
1452 BINOP_MEM(OP)                                           \
1453                                                         \
1454 ir_mode *get_##OP##_resmode(const ir_node *node) {      \
1455   assert(node->op == op_##OP);                          \
1456   return node->attr.divmod.res_mode;                    \
1457 }                                                       \
1458                                                         \
1459 void set_##OP##_resmode(ir_node *node, ir_mode *mode) { \
1460   assert(node->op == op_##OP);                          \
1461   node->attr.divmod.res_mode = mode;                    \
1462 }
1463
1464
1465 BINOP(Add)
1466 BINOP(Sub)
1467 UNOP(Minus)
1468 BINOP(Mul)
1469 BINOP(Mulh)
1470 DIVOP(Quot)
1471 DIVOP(DivMod)
1472 DIVOP(Div)
1473 DIVOP(Mod)
1474 UNOP(Abs)
1475 BINOP(And)
1476 BINOP(Or)
1477 BINOP(Eor)
1478 UNOP(Not)
1479 BINOP(Shl)
1480 BINOP(Shr)
1481 BINOP(Shrs)
1482 BINOP(Rot)
1483 BINOP(Cmp)
1484 UNOP(Conv)
1485 UNOP(Cast)
1486
1487 int is_Div_remainderless(const ir_node *node) {
1488         assert(node->op == op_Div);
1489         return node->attr.divmod.no_remainder;
1490 }
1491
1492 int get_Conv_strict(const ir_node *node) {
1493         assert(node->op == op_Conv);
1494         return node->attr.conv.strict;
1495 }
1496
1497 void set_Conv_strict(ir_node *node, int strict_flag) {
1498         assert(node->op == op_Conv);
1499         node->attr.conv.strict = (char)strict_flag;
1500 }
1501
1502 ir_type *
1503 get_Cast_type(ir_node *node) {
1504         assert(node->op == op_Cast);
1505         node->attr.cast.totype = skip_tid(node->attr.cast.totype);
1506         return node->attr.cast.totype;
1507 }
1508
1509 void
1510 set_Cast_type(ir_node *node, ir_type *to_tp) {
1511         assert(node->op == op_Cast);
1512         node->attr.cast.totype = to_tp;
1513 }
1514
1515
1516 /* Checks for upcast.
1517  *
1518  * Returns true if the Cast node casts a class type to a super type.
1519  */
1520 int is_Cast_upcast(ir_node *node) {
1521         ir_type *totype   = get_Cast_type(node);
1522         ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1523
1524         assert(get_irg_typeinfo_state(get_irn_irg(node)) == ir_typeinfo_consistent);
1525         assert(fromtype);
1526
1527         while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1528                 totype   = get_pointer_points_to_type(totype);
1529                 fromtype = get_pointer_points_to_type(fromtype);
1530         }
1531
1532         assert(fromtype);
1533
1534         if (!is_Class_type(totype)) return 0;
1535         return is_SubClass_of(fromtype, totype);
1536 }
1537
1538 /* Checks for downcast.
1539  *
1540  * Returns true if the Cast node casts a class type to a sub type.
1541  */
1542 int is_Cast_downcast(ir_node *node) {
1543         ir_type *totype   = get_Cast_type(node);
1544         ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1545
1546         assert(get_irg_typeinfo_state(get_irn_irg(node)) == ir_typeinfo_consistent);
1547         assert(fromtype);
1548
1549         while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1550                 totype   = get_pointer_points_to_type(totype);
1551                 fromtype = get_pointer_points_to_type(fromtype);
1552         }
1553
1554         assert(fromtype);
1555
1556         if (!is_Class_type(totype)) return 0;
1557         return is_SubClass_of(totype, fromtype);
1558 }
1559
1560 int
1561 (is_unop)(const ir_node *node) {
1562         return _is_unop(node);
1563 }
1564
1565 ir_node *
1566 get_unop_op(const ir_node *node) {
1567         if (node->op->opar == oparity_unary)
1568                 return get_irn_n(node, node->op->op_index);
1569
1570         assert(node->op->opar == oparity_unary);
1571         return NULL;
1572 }
1573
1574 void
1575 set_unop_op(ir_node *node, ir_node *op) {
1576         if (node->op->opar == oparity_unary)
1577                 set_irn_n(node, node->op->op_index, op);
1578
1579         assert(node->op->opar == oparity_unary);
1580 }
1581
1582 int
1583 (is_binop)(const ir_node *node) {
1584         return _is_binop(node);
1585 }
1586
1587 ir_node *
1588 get_binop_left(const ir_node *node) {
1589         assert(node->op->opar == oparity_binary);
1590         return get_irn_n(node, node->op->op_index);
1591 }
1592
1593 void
1594 set_binop_left(ir_node *node, ir_node *left) {
1595         assert(node->op->opar == oparity_binary);
1596         set_irn_n(node, node->op->op_index, left);
1597 }
1598
1599 ir_node *
1600 get_binop_right(const ir_node *node) {
1601         assert(node->op->opar == oparity_binary);
1602         return get_irn_n(node, node->op->op_index + 1);
1603 }
1604
1605 void
1606 set_binop_right(ir_node *node, ir_node *right) {
1607         assert(node->op->opar == oparity_binary);
1608         set_irn_n(node, node->op->op_index + 1, right);
1609 }
1610
1611 int
1612 (is_Phi)(const ir_node *n) {
1613         return _is_Phi(n);
1614 }
1615
1616 int is_Phi0(const ir_node *n) {
1617         assert(n);
1618
1619         return ((get_irn_op(n) == op_Phi) &&
1620                 (get_irn_arity(n) == 0) &&
1621                 (get_irg_phase_state(get_irn_irg(n)) ==  phase_building));
1622 }
1623
1624 ir_node **
1625 get_Phi_preds_arr(ir_node *node) {
1626   assert(node->op == op_Phi);
1627   return (ir_node **)&(get_irn_in(node)[1]);
1628 }
1629
1630 int
1631 get_Phi_n_preds(const ir_node *node) {
1632         assert(is_Phi(node) || is_Phi0(node));
1633         return (get_irn_arity(node));
1634 }
1635
1636 /*
1637 void set_Phi_n_preds(ir_node *node, int n_preds) {
1638         assert(node->op == op_Phi);
1639 }
1640 */
1641
1642 ir_node *
1643 get_Phi_pred(const ir_node *node, int pos) {
1644         assert(is_Phi(node) || is_Phi0(node));
1645         return get_irn_n(node, pos);
1646 }
1647
1648 void
1649 set_Phi_pred(ir_node *node, int pos, ir_node *pred) {
1650         assert(is_Phi(node) || is_Phi0(node));
1651         set_irn_n(node, pos, pred);
1652 }
1653
1654 ir_node *(get_Phi_next)(const ir_node *phi) {
1655         return _get_Phi_next(phi);
1656 }
1657
1658 void (set_Phi_next)(ir_node *phi, ir_node *next) {
1659         _set_Phi_next(phi, next);
1660 }
1661
1662 int is_memop(const ir_node *node) {
1663         ir_opcode code = get_irn_opcode(node);
1664         return (code == iro_Load || code == iro_Store);
1665 }
1666
1667 ir_node *get_memop_mem(const ir_node *node) {
1668         assert(is_memop(node));
1669         return get_irn_n(node, 0);
1670 }
1671
1672 void set_memop_mem(ir_node *node, ir_node *mem) {
1673         assert(is_memop(node));
1674         set_irn_n(node, 0, mem);
1675 }
1676
1677 ir_node *get_memop_ptr(const ir_node *node) {
1678         assert(is_memop(node));
1679         return get_irn_n(node, 1);
1680 }
1681
1682 void set_memop_ptr(ir_node *node, ir_node *ptr) {
1683         assert(is_memop(node));
1684         set_irn_n(node, 1, ptr);
1685 }
1686
1687 ir_node *
1688 get_Load_mem(const ir_node *node) {
1689         assert(node->op == op_Load);
1690         return get_irn_n(node, 0);
1691 }
1692
1693 void
1694 set_Load_mem(ir_node *node, ir_node *mem) {
1695         assert(node->op == op_Load);
1696         set_irn_n(node, 0, mem);
1697 }
1698
1699 ir_node *
1700 get_Load_ptr(const ir_node *node) {
1701         assert(node->op == op_Load);
1702         return get_irn_n(node, 1);
1703 }
1704
1705 void
1706 set_Load_ptr(ir_node *node, ir_node *ptr) {
1707         assert(node->op == op_Load);
1708         set_irn_n(node, 1, ptr);
1709 }
1710
1711 ir_mode *
1712 get_Load_mode(const ir_node *node) {
1713         assert(node->op == op_Load);
1714         return node->attr.load.load_mode;
1715 }
1716
1717 void
1718 set_Load_mode(ir_node *node, ir_mode *mode) {
1719         assert(node->op == op_Load);
1720         node->attr.load.load_mode = mode;
1721 }
1722
1723 ir_volatility
1724 get_Load_volatility(const ir_node *node) {
1725         assert(node->op == op_Load);
1726         return node->attr.load.volatility;
1727 }
1728
1729 void
1730 set_Load_volatility(ir_node *node, ir_volatility volatility) {
1731         assert(node->op == op_Load);
1732         node->attr.load.volatility = volatility;
1733 }
1734
1735 ir_align
1736 get_Load_align(const ir_node *node) {
1737         assert(node->op == op_Load);
1738         return node->attr.load.aligned;
1739 }
1740
1741 void
1742 set_Load_align(ir_node *node, ir_align align) {
1743         assert(node->op == op_Load);
1744         node->attr.load.aligned = align;
1745 }
1746
1747
1748 ir_node *
1749 get_Store_mem(const ir_node *node) {
1750         assert(node->op == op_Store);
1751         return get_irn_n(node, 0);
1752 }
1753
1754 void
1755 set_Store_mem(ir_node *node, ir_node *mem) {
1756         assert(node->op == op_Store);
1757         set_irn_n(node, 0, mem);
1758 }
1759
1760 ir_node *
1761 get_Store_ptr(const ir_node *node) {
1762         assert(node->op == op_Store);
1763         return get_irn_n(node, 1);
1764 }
1765
1766 void
1767 set_Store_ptr(ir_node *node, ir_node *ptr) {
1768         assert(node->op == op_Store);
1769         set_irn_n(node, 1, ptr);
1770 }
1771
1772 ir_node *
1773 get_Store_value(const ir_node *node) {
1774         assert(node->op == op_Store);
1775         return get_irn_n(node, 2);
1776 }
1777
1778 void
1779 set_Store_value(ir_node *node, ir_node *value) {
1780         assert(node->op == op_Store);
1781         set_irn_n(node, 2, value);
1782 }
1783
1784 ir_volatility
1785 get_Store_volatility(const ir_node *node) {
1786         assert(node->op == op_Store);
1787         return node->attr.store.volatility;
1788 }
1789
1790 void
1791 set_Store_volatility(ir_node *node, ir_volatility volatility) {
1792         assert(node->op == op_Store);
1793         node->attr.store.volatility = volatility;
1794 }
1795
1796 ir_align
1797 get_Store_align(const ir_node *node) {
1798         assert(node->op == op_Store);
1799         return node->attr.store.aligned;
1800 }
1801
1802 void
1803 set_Store_align(ir_node *node, ir_align align) {
1804         assert(node->op == op_Store);
1805         node->attr.store.aligned = align;
1806 }
1807
1808
1809 ir_node *
1810 get_Alloc_mem(const ir_node *node) {
1811         assert(node->op == op_Alloc);
1812         return get_irn_n(node, 0);
1813 }
1814
1815 void
1816 set_Alloc_mem(ir_node *node, ir_node *mem) {
1817         assert(node->op == op_Alloc);
1818         set_irn_n(node, 0, mem);
1819 }
1820
1821 ir_node *
1822 get_Alloc_size(const ir_node *node) {
1823         assert(node->op == op_Alloc);
1824         return get_irn_n(node, 1);
1825 }
1826
1827 void
1828 set_Alloc_size(ir_node *node, ir_node *size) {
1829         assert(node->op == op_Alloc);
1830         set_irn_n(node, 1, size);
1831 }
1832
1833 ir_type *
1834 get_Alloc_type(ir_node *node) {
1835         assert(node->op == op_Alloc);
1836         return node->attr.alloc.type = skip_tid(node->attr.alloc.type);
1837 }
1838
1839 void
1840 set_Alloc_type(ir_node *node, ir_type *tp) {
1841         assert(node->op == op_Alloc);
1842         node->attr.alloc.type = tp;
1843 }
1844
1845 ir_where_alloc
1846 get_Alloc_where(const ir_node *node) {
1847         assert(node->op == op_Alloc);
1848         return node->attr.alloc.where;
1849 }
1850
1851 void
1852 set_Alloc_where(ir_node *node, ir_where_alloc where) {
1853         assert(node->op == op_Alloc);
1854         node->attr.alloc.where = where;
1855 }
1856
1857
1858 ir_node *
1859 get_Free_mem(const ir_node *node) {
1860         assert(node->op == op_Free);
1861         return get_irn_n(node, 0);
1862 }
1863
1864 void
1865 set_Free_mem(ir_node *node, ir_node *mem) {
1866         assert(node->op == op_Free);
1867         set_irn_n(node, 0, mem);
1868 }
1869
1870 ir_node *
1871 get_Free_ptr(const ir_node *node) {
1872         assert(node->op == op_Free);
1873         return get_irn_n(node, 1);
1874 }
1875
1876 void
1877 set_Free_ptr(ir_node *node, ir_node *ptr) {
1878         assert(node->op == op_Free);
1879         set_irn_n(node, 1, ptr);
1880 }
1881
1882 ir_node *
1883 get_Free_size(const ir_node *node) {
1884         assert(node->op == op_Free);
1885         return get_irn_n(node, 2);
1886 }
1887
1888 void
1889 set_Free_size(ir_node *node, ir_node *size) {
1890         assert(node->op == op_Free);
1891         set_irn_n(node, 2, size);
1892 }
1893
1894 ir_type *
1895 get_Free_type(ir_node *node) {
1896         assert(node->op == op_Free);
1897         return node->attr.free.type = skip_tid(node->attr.free.type);
1898 }
1899
1900 void
1901 set_Free_type(ir_node *node, ir_type *tp) {
1902         assert(node->op == op_Free);
1903         node->attr.free.type = tp;
1904 }
1905
1906 ir_where_alloc
1907 get_Free_where(const ir_node *node) {
1908         assert(node->op == op_Free);
1909         return node->attr.free.where;
1910 }
1911
1912 void
1913 set_Free_where(ir_node *node, ir_where_alloc where) {
1914         assert(node->op == op_Free);
1915         node->attr.free.where = where;
1916 }
1917
1918 ir_node **get_Sync_preds_arr(ir_node *node) {
1919         assert(node->op == op_Sync);
1920         return (ir_node **)&(get_irn_in(node)[1]);
1921 }
1922
1923 int get_Sync_n_preds(const ir_node *node) {
1924         assert(node->op == op_Sync);
1925         return (get_irn_arity(node));
1926 }
1927
1928 /*
1929 void set_Sync_n_preds(ir_node *node, int n_preds) {
1930         assert(node->op == op_Sync);
1931 }
1932 */
1933
1934 ir_node *get_Sync_pred(const ir_node *node, int pos) {
1935         assert(node->op == op_Sync);
1936         return get_irn_n(node, pos);
1937 }
1938
1939 void set_Sync_pred(ir_node *node, int pos, ir_node *pred) {
1940         assert(node->op == op_Sync);
1941         set_irn_n(node, pos, pred);
1942 }
1943
1944 /* Add a new Sync predecessor */
1945 void add_Sync_pred(ir_node *node, ir_node *pred) {
1946         assert(node->op == op_Sync);
1947         add_irn_n(node, pred);
1948 }
1949
1950 /* Returns the source language type of a Proj node. */
1951 ir_type *get_Proj_type(ir_node *n) {
1952         ir_type *tp   = firm_unknown_type;
1953         ir_node *pred = get_Proj_pred(n);
1954
1955         switch (get_irn_opcode(pred)) {
1956         case iro_Proj: {
1957                 ir_node *pred_pred;
1958                 /* Deal with Start / Call here: we need to know the Proj Nr. */
1959                 assert(get_irn_mode(pred) == mode_T);
1960                 pred_pred = get_Proj_pred(pred);
1961                 if (get_irn_op(pred_pred) == op_Start)  {
1962                         ir_type *mtp = get_entity_type(get_irg_entity(get_irn_irg(pred_pred)));
1963                         tp = get_method_param_type(mtp, get_Proj_proj(n));
1964                 } else if (get_irn_op(pred_pred) == op_Call) {
1965                         ir_type *mtp = get_Call_type(pred_pred);
1966                         tp = get_method_res_type(mtp, get_Proj_proj(n));
1967                 }
1968         } break;
1969         case iro_Start: break;
1970         case iro_Call: break;
1971         case iro_Load: {
1972                 ir_node *a = get_Load_ptr(pred);
1973                 if (is_Sel(a))
1974                         tp = get_entity_type(get_Sel_entity(a));
1975         } break;
1976         default:
1977                 break;
1978         }
1979         return tp;
1980 }
1981
1982 ir_node *
1983 get_Proj_pred(const ir_node *node) {
1984         assert(is_Proj(node));
1985         return get_irn_n(node, 0);
1986 }
1987
1988 void
1989 set_Proj_pred(ir_node *node, ir_node *pred) {
1990         assert(is_Proj(node));
1991         set_irn_n(node, 0, pred);
1992 }
1993
1994 long
1995 get_Proj_proj(const ir_node *node) {
1996         assert(is_Proj(node));
1997         if (get_irn_opcode(node) == iro_Proj) {
1998                 return node->attr.proj;
1999         } else {
2000                 assert(get_irn_opcode(node) == iro_Filter);
2001                 return node->attr.filter.proj;
2002         }
2003 }
2004
2005 void
2006 set_Proj_proj(ir_node *node, long proj) {
2007         assert(node->op == op_Proj);
2008         node->attr.proj = proj;
2009 }
2010
2011 ir_node **
2012 get_Tuple_preds_arr(ir_node *node) {
2013         assert(node->op == op_Tuple);
2014         return (ir_node **)&(get_irn_in(node)[1]);
2015 }
2016
2017 int
2018 get_Tuple_n_preds(const ir_node *node) {
2019         assert(node->op == op_Tuple);
2020         return (get_irn_arity(node));
2021 }
2022
2023 /*
2024 void
2025 set_Tuple_n_preds(ir_node *node, int n_preds) {
2026         assert(node->op == op_Tuple);
2027 }
2028 */
2029
2030 ir_node *
2031 get_Tuple_pred(const ir_node *node, int pos) {
2032   assert(node->op == op_Tuple);
2033   return get_irn_n(node, pos);
2034 }
2035
2036 void
2037 set_Tuple_pred(ir_node *node, int pos, ir_node *pred) {
2038         assert(node->op == op_Tuple);
2039         set_irn_n(node, pos, pred);
2040 }
2041
2042 ir_node *
2043 get_Id_pred(const ir_node *node) {
2044         assert(node->op == op_Id);
2045         return get_irn_n(node, 0);
2046 }
2047
2048 void
2049 set_Id_pred(ir_node *node, ir_node *pred) {
2050         assert(node->op == op_Id);
2051         set_irn_n(node, 0, pred);
2052 }
2053
2054 ir_node *get_Confirm_value(const ir_node *node) {
2055         assert(node->op == op_Confirm);
2056         return get_irn_n(node, 0);
2057 }
2058
2059 void set_Confirm_value(ir_node *node, ir_node *value) {
2060         assert(node->op == op_Confirm);
2061         set_irn_n(node, 0, value);
2062 }
2063
2064 ir_node *get_Confirm_bound(const ir_node *node) {
2065         assert(node->op == op_Confirm);
2066         return get_irn_n(node, 1);
2067 }
2068
2069 void set_Confirm_bound(ir_node *node, ir_node *bound) {
2070         assert(node->op == op_Confirm);
2071         set_irn_n(node, 0, bound);
2072 }
2073
2074 pn_Cmp get_Confirm_cmp(const ir_node *node) {
2075         assert(node->op == op_Confirm);
2076         return node->attr.confirm.cmp;
2077 }
2078
2079 void set_Confirm_cmp(ir_node *node, pn_Cmp cmp) {
2080         assert(node->op == op_Confirm);
2081         node->attr.confirm.cmp = cmp;
2082 }
2083
2084 ir_node *
2085 get_Filter_pred(ir_node *node) {
2086         assert(node->op == op_Filter);
2087         return node->in[1];
2088 }
2089
2090 void
2091 set_Filter_pred(ir_node *node, ir_node *pred) {
2092         assert(node->op == op_Filter);
2093         node->in[1] = pred;
2094 }
2095
2096 long
2097 get_Filter_proj(ir_node *node) {
2098         assert(node->op == op_Filter);
2099         return node->attr.filter.proj;
2100 }
2101
2102 void
2103 set_Filter_proj(ir_node *node, long proj) {
2104         assert(node->op == op_Filter);
2105         node->attr.filter.proj = proj;
2106 }
2107
2108 /* Don't use get_irn_arity, get_irn_n in implementation as access
2109    shall work independent of view!!! */
2110 void set_Filter_cg_pred_arr(ir_node *node, int arity, ir_node ** in) {
2111         assert(node->op == op_Filter);
2112         if (node->attr.filter.in_cg == NULL || arity != ARR_LEN(node->attr.filter.in_cg) - 1) {
2113                 ir_graph *irg = get_irn_irg(node);
2114                 node->attr.filter.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
2115                 node->attr.filter.backedge = new_backedge_arr(irg->obst, arity);
2116                 node->attr.filter.in_cg[0] = node->in[0];
2117         }
2118         memcpy(node->attr.filter.in_cg + 1, in, sizeof(ir_node *) * arity);
2119 }
2120
2121 void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred) {
2122         assert(node->op == op_Filter && node->attr.filter.in_cg &&
2123                0 <= pos && pos < ARR_LEN(node->attr.filter.in_cg) - 1);
2124         node->attr.filter.in_cg[pos + 1] = pred;
2125 }
2126
2127 int get_Filter_n_cg_preds(ir_node *node) {
2128         assert(node->op == op_Filter && node->attr.filter.in_cg);
2129         return (ARR_LEN(node->attr.filter.in_cg) - 1);
2130 }
2131
2132 ir_node *get_Filter_cg_pred(ir_node *node, int pos) {
2133         int arity;
2134         assert(node->op == op_Filter && node->attr.filter.in_cg &&
2135                0 <= pos);
2136         arity = ARR_LEN(node->attr.filter.in_cg);
2137         assert(pos < arity - 1);
2138         return node->attr.filter.in_cg[pos + 1];
2139 }
2140
2141 /* Mux support */
2142 ir_node *get_Mux_sel(const ir_node *node) {
2143         if (node->op == op_Psi) {
2144                 assert(get_irn_arity(node) == 3);
2145                 return get_Psi_cond(node, 0);
2146         }
2147         assert(node->op == op_Mux);
2148         return node->in[1];
2149 }
2150
2151 void set_Mux_sel(ir_node *node, ir_node *sel) {
2152         if (node->op == op_Psi) {
2153                 assert(get_irn_arity(node) == 3);
2154                 set_Psi_cond(node, 0, sel);
2155         } else {
2156                 assert(node->op == op_Mux);
2157                 node->in[1] = sel;
2158         }
2159 }
2160
2161 ir_node *get_Mux_false(const ir_node *node) {
2162         if (node->op == op_Psi) {
2163                 assert(get_irn_arity(node) == 3);
2164                 return get_Psi_default(node);
2165         }
2166         assert(node->op == op_Mux);
2167         return node->in[2];
2168 }
2169
2170 void set_Mux_false(ir_node *node, ir_node *ir_false) {
2171         if (node->op == op_Psi) {
2172                 assert(get_irn_arity(node) == 3);
2173                 set_Psi_default(node, ir_false);
2174         } else {
2175                 assert(node->op == op_Mux);
2176                 node->in[2] = ir_false;
2177         }
2178 }
2179
2180 ir_node *get_Mux_true(const ir_node *node) {
2181         if (node->op == op_Psi) {
2182                 assert(get_irn_arity(node) == 3);
2183                 return get_Psi_val(node, 0);
2184         }
2185         assert(node->op == op_Mux);
2186         return node->in[3];
2187 }
2188
2189 void set_Mux_true(ir_node *node, ir_node *ir_true) {
2190         if (node->op == op_Psi) {
2191                 assert(get_irn_arity(node) == 3);
2192                 set_Psi_val(node, 0, ir_true);
2193         } else {
2194                 assert(node->op == op_Mux);
2195                 node->in[3] = ir_true;
2196         }
2197 }
2198
2199 /* Psi support */
2200 ir_node *get_Psi_cond(const ir_node *node, int pos) {
2201         assert(node->op == op_Psi);
2202         assert(pos < get_Psi_n_conds(node));
2203         return get_irn_n(node, 2 * pos);
2204 }
2205
2206 void set_Psi_cond(ir_node *node, int pos, ir_node *cond) {
2207         assert(node->op == op_Psi);
2208         assert(pos < get_Psi_n_conds(node));
2209         set_irn_n(node, 2 * pos, cond);
2210 }
2211
2212 ir_node *get_Psi_val(const ir_node *node, int pos) {
2213         assert(node->op == op_Psi);
2214         assert(pos < get_Psi_n_conds(node));
2215         return get_irn_n(node, 2 * pos + 1);
2216 }
2217
2218 void set_Psi_val(ir_node *node, int pos, ir_node *val) {
2219         assert(node->op == op_Psi);
2220         assert(pos < get_Psi_n_conds(node));
2221         set_irn_n(node, 2 * pos + 1, val);
2222 }
2223
2224 ir_node *get_Psi_default(const ir_node *node) {
2225         int def_pos = get_irn_arity(node) - 1;
2226         assert(node->op == op_Psi);
2227         return get_irn_n(node, def_pos);
2228 }
2229
2230 void set_Psi_default(ir_node *node, ir_node *val) {
2231         int def_pos = get_irn_arity(node);
2232         assert(node->op == op_Psi);
2233         set_irn_n(node, def_pos, val);
2234 }
2235
2236 int (get_Psi_n_conds)(const ir_node *node) {
2237         return _get_Psi_n_conds(node);
2238 }
2239
2240 /* CopyB support */
2241 ir_node *get_CopyB_mem(const ir_node *node) {
2242         assert(node->op == op_CopyB);
2243         return get_irn_n(node, 0);
2244 }
2245
2246 void set_CopyB_mem(ir_node *node, ir_node *mem) {
2247         assert(node->op == op_CopyB);
2248         set_irn_n(node, 0, mem);
2249 }
2250
2251 ir_node *get_CopyB_dst(const ir_node *node) {
2252         assert(node->op == op_CopyB);
2253         return get_irn_n(node, 1);
2254 }
2255
2256 void set_CopyB_dst(ir_node *node, ir_node *dst) {
2257         assert(node->op == op_CopyB);
2258         set_irn_n(node, 1, dst);
2259 }
2260
2261 ir_node *get_CopyB_src(const ir_node *node) {
2262   assert(node->op == op_CopyB);
2263   return get_irn_n(node, 2);
2264 }
2265
2266 void set_CopyB_src(ir_node *node, ir_node *src) {
2267         assert(node->op == op_CopyB);
2268         set_irn_n(node, 2, src);
2269 }
2270
2271 ir_type *get_CopyB_type(ir_node *node) {
2272         assert(node->op == op_CopyB);
2273         return node->attr.copyb.data_type = skip_tid(node->attr.copyb.data_type);
2274 }
2275
2276 void set_CopyB_type(ir_node *node, ir_type *data_type) {
2277         assert(node->op == op_CopyB && data_type);
2278         node->attr.copyb.data_type = data_type;
2279 }
2280
2281
2282 ir_type *
2283 get_InstOf_type(ir_node *node) {
2284         assert(node->op == op_InstOf);
2285         return node->attr.instof.type = skip_tid(node->attr.instof.type);
2286 }
2287
2288 void
2289 set_InstOf_type(ir_node *node, ir_type *type) {
2290         assert(node->op == op_InstOf);
2291         node->attr.instof.type = type;
2292 }
2293
2294 ir_node *
2295 get_InstOf_store(const ir_node *node) {
2296         assert(node->op == op_InstOf);
2297         return get_irn_n(node, 0);
2298 }
2299
2300 void
2301 set_InstOf_store(ir_node *node, ir_node *obj) {
2302         assert(node->op == op_InstOf);
2303         set_irn_n(node, 0, obj);
2304 }
2305
2306 ir_node *
2307 get_InstOf_obj(const ir_node *node) {
2308         assert(node->op == op_InstOf);
2309         return get_irn_n(node, 1);
2310 }
2311
2312 void
2313 set_InstOf_obj(ir_node *node, ir_node *obj) {
2314         assert(node->op == op_InstOf);
2315         set_irn_n(node, 1, obj);
2316 }
2317
2318 /* Returns the memory input of a Raise operation. */
2319 ir_node *
2320 get_Raise_mem(const ir_node *node) {
2321         assert(node->op == op_Raise);
2322         return get_irn_n(node, 0);
2323 }
2324
2325 void
2326 set_Raise_mem(ir_node *node, ir_node *mem) {
2327         assert(node->op == op_Raise);
2328         set_irn_n(node, 0, mem);
2329 }
2330
2331 ir_node *
2332 get_Raise_exo_ptr(const ir_node *node) {
2333         assert(node->op == op_Raise);
2334         return get_irn_n(node, 1);
2335 }
2336
2337 void
2338 set_Raise_exo_ptr(ir_node *node, ir_node *exo_ptr) {
2339         assert(node->op == op_Raise);
2340         set_irn_n(node, 1, exo_ptr);
2341 }
2342
2343 /* Bound support */
2344
2345 /* Returns the memory input of a Bound operation. */
2346 ir_node *get_Bound_mem(const ir_node *bound) {
2347         assert(bound->op == op_Bound);
2348         return get_irn_n(bound, 0);
2349 }
2350
2351 void set_Bound_mem(ir_node *bound, ir_node *mem) {
2352         assert(bound->op == op_Bound);
2353         set_irn_n(bound, 0, mem);
2354 }
2355
2356 /* Returns the index input of a Bound operation. */
2357 ir_node *get_Bound_index(const ir_node *bound) {
2358         assert(bound->op == op_Bound);
2359         return get_irn_n(bound, 1);
2360 }
2361
2362 void set_Bound_index(ir_node *bound, ir_node *idx) {
2363         assert(bound->op == op_Bound);
2364         set_irn_n(bound, 1, idx);
2365 }
2366
2367 /* Returns the lower bound input of a Bound operation. */
2368 ir_node *get_Bound_lower(const ir_node *bound) {
2369         assert(bound->op == op_Bound);
2370         return get_irn_n(bound, 2);
2371 }
2372
2373 void set_Bound_lower(ir_node *bound, ir_node *lower) {
2374         assert(bound->op == op_Bound);
2375         set_irn_n(bound, 2, lower);
2376 }
2377
2378 /* Returns the upper bound input of a Bound operation. */
2379 ir_node *get_Bound_upper(const ir_node *bound) {
2380         assert(bound->op == op_Bound);
2381         return get_irn_n(bound, 3);
2382 }
2383
2384 void set_Bound_upper(ir_node *bound, ir_node *upper) {
2385         assert(bound->op == op_Bound);
2386         set_irn_n(bound, 3, upper);
2387 }
2388
2389 /* Return the operand of a Pin node. */
2390 ir_node *get_Pin_op(const ir_node *pin) {
2391         assert(pin->op == op_Pin);
2392         return get_irn_n(pin, 0);
2393 }
2394
2395 void set_Pin_op(ir_node *pin, ir_node *node) {
2396         assert(pin->op == op_Pin);
2397         set_irn_n(pin, 0, node);
2398 }
2399
2400 /* Return the assembler text of an ASM pseudo node. */
2401 ident *get_ASM_text(const ir_node *node) {
2402         assert(node->op == op_ASM);
2403         return node->attr.assem.asm_text;
2404 }
2405
2406 /* Return the number of input constraints for an ASM node. */
2407 int get_ASM_n_input_constraints(const ir_node *node) {
2408         assert(node->op == op_ASM);
2409         return ARR_LEN(node->attr.assem.inputs);
2410 }
2411
2412 /* Return the input constraints for an ASM node. This is a flexible array. */
2413 const ir_asm_constraint *get_ASM_input_constraints(const ir_node *node) {
2414         assert(node->op == op_ASM);
2415         return node->attr.assem.inputs;
2416 }
2417
2418 /* Return the number of output constraints for an ASM node.  */
2419 int get_ASM_n_output_constraints(const ir_node *node) {
2420         assert(node->op == op_ASM);
2421         return ARR_LEN(node->attr.assem.outputs);
2422 }
2423
2424 /* Return the output constraints for an ASM node. */
2425 const ir_asm_constraint *get_ASM_output_constraints(const ir_node *node) {
2426         assert(node->op == op_ASM);
2427         return node->attr.assem.outputs;
2428 }
2429
2430 /* Return the number of clobbered registers for an ASM node.  */
2431 int get_ASM_n_clobbers(const ir_node *node) {
2432         assert(node->op == op_ASM);
2433         return ARR_LEN(node->attr.assem.clobber);
2434 }
2435
2436 /* Return the list of clobbered registers for an ASM node. */
2437 ident **get_ASM_clobbers(const ir_node *node) {
2438         assert(node->op == op_ASM);
2439         return node->attr.assem.clobber;
2440 }
2441
2442 /* returns the graph of a node */
2443 ir_graph *
2444 get_irn_irg(const ir_node *node) {
2445         /*
2446          * Do not use get_nodes_Block() here, because this
2447          * will check the pinned state.
2448          * However even a 'wrong' block is always in the proper
2449          * irg.
2450          */
2451         if (! is_Block(node))
2452                 node = get_irn_n(node, -1);
2453         if (is_Bad(node))  /* sometimes bad is predecessor of nodes instead of block: in case of optimization */
2454                 node = get_irn_n(node, -1);
2455         assert(get_irn_op(node) == op_Block);
2456         return node->attr.block.irg;
2457 }
2458
2459
2460 /*----------------------------------------------------------------*/
2461 /*  Auxiliary routines                                            */
2462 /*----------------------------------------------------------------*/
2463
2464 ir_node *
2465 skip_Proj(ir_node *node) {
2466         /* don't assert node !!! */
2467         if (node == NULL)
2468                 return NULL;
2469
2470         if (is_Proj(node))
2471                 node = get_Proj_pred(node);
2472
2473         return node;
2474 }
2475
2476 const ir_node *
2477 skip_Proj_const(const ir_node *node) {
2478         /* don't assert node !!! */
2479         if (node == NULL)
2480                 return NULL;
2481
2482         if (is_Proj(node))
2483                 node = get_Proj_pred(node);
2484
2485         return node;
2486 }
2487
2488 ir_node *
2489 skip_Tuple(ir_node *node) {
2490   ir_node *pred;
2491   ir_op   *op;
2492
2493   if (!get_opt_normalize()) return node;
2494
2495 restart:
2496         if (get_irn_op(node) == op_Proj) {
2497             pred = get_Proj_pred(node);
2498             op   = get_irn_op(pred);
2499
2500                 /*
2501                  * Looks strange but calls get_irn_op() only once
2502                  * in most often cases.
2503                  */
2504                 if (op == op_Proj) { /* nested Tuple ? */
2505                     pred = skip_Tuple(pred);
2506                     op   = get_irn_op(pred);
2507
2508                         if (op == op_Tuple) {
2509                                 node = get_Tuple_pred(pred, get_Proj_proj(node));
2510                                 goto restart;
2511                         }
2512                 } else if (op == op_Tuple) {
2513                         node = get_Tuple_pred(pred, get_Proj_proj(node));
2514                         goto restart;
2515                 }
2516         }
2517         return node;
2518 }
2519
2520 /* returns operand of node if node is a Cast */
2521 ir_node *skip_Cast(ir_node *node) {
2522         if (get_irn_op(node) == op_Cast)
2523                 return get_Cast_op(node);
2524         return node;
2525 }
2526
2527 /* returns operand of node if node is a Confirm */
2528 ir_node *skip_Confirm(ir_node *node) {
2529         if (get_irn_op(node) == op_Confirm)
2530                 return get_Confirm_value(node);
2531         return node;
2532 }
2533
2534 /* skip all high-level ops */
2535 ir_node *skip_HighLevel_ops(ir_node *node) {
2536         while (is_op_highlevel(get_irn_op(node))) {
2537                 node = get_irn_n(node, 0);
2538         }
2539         return node;
2540 }
2541
2542
2543 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2544  * than any other approach, as Id chains are resolved and all point to the real node, or
2545  * all id's are self loops.
2546  *
2547  * Note: This function takes 10% of mostly ANY the compiler run, so it's
2548  * a little bit "hand optimized".
2549  *
2550  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2551  */
2552 ir_node *
2553 skip_Id(ir_node *node) {
2554         ir_node *pred;
2555         /* don't assert node !!! */
2556
2557         if (!node || (node->op != op_Id)) return node;
2558
2559         /* Don't use get_Id_pred():  We get into an endless loop for
2560            self-referencing Ids. */
2561         pred = node->in[0+1];
2562
2563         if (pred->op != op_Id) return pred;
2564
2565         if (node != pred) {  /* not a self referencing Id. Resolve Id chain. */
2566                 ir_node *rem_pred, *res;
2567
2568                 if (pred->op != op_Id) return pred; /* shortcut */
2569                 rem_pred = pred;
2570
2571                 assert(get_irn_arity (node) > 0);
2572
2573                 node->in[0+1] = node;   /* turn us into a self referencing Id:  shorten Id cycles. */
2574                 res = skip_Id(rem_pred);
2575                 if (res->op == op_Id) /* self-loop */ return node;
2576
2577                 node->in[0+1] = res;    /* Turn Id chain into Ids all referencing the chain end. */
2578                 return res;
2579         } else {
2580                 return node;
2581         }
2582 }
2583
2584 void skip_Id_and_store(ir_node **node) {
2585         ir_node *n = *node;
2586
2587         if (!n || (n->op != op_Id)) return;
2588
2589         /* Don't use get_Id_pred():  We get into an endless loop for
2590            self-referencing Ids. */
2591         *node = skip_Id(n);
2592 }
2593
2594 int
2595 (is_Bad)(const ir_node *node) {
2596         return _is_Bad(node);
2597 }
2598
2599 int
2600 (is_NoMem)(const ir_node *node) {
2601         return _is_NoMem(node);
2602 }
2603
2604 int
2605 (is_Minus)(const ir_node *node) {
2606         return _is_Minus(node);
2607 }
2608
2609 int
2610 (is_Abs)(const ir_node *node) {
2611         return _is_Abs(node);
2612 }
2613
2614 int
2615 (is_Mod)(const ir_node *node) {
2616         return _is_Mod(node);
2617 }
2618
2619 int
2620 (is_Div)(const ir_node *node) {
2621         return _is_Div(node);
2622 }
2623
2624 int
2625 (is_DivMod)(const ir_node *node) {
2626         return _is_DivMod(node);
2627 }
2628
2629 int
2630 (is_Quot)(const ir_node *node) {
2631         return _is_Quot(node);
2632 }
2633
2634 int
2635 (is_Add)(const ir_node *node) {
2636         return _is_Add(node);
2637 }
2638
2639 int
2640 (is_And)(const ir_node *node) {
2641         return _is_And(node);
2642 }
2643
2644 int
2645 (is_Or)(const ir_node *node) {
2646         return _is_Or(node);
2647 }
2648
2649 int
2650 (is_Eor)(const ir_node *node) {
2651         return _is_Eor(node);
2652 }
2653
2654 int
2655 (is_Sub)(const ir_node *node) {
2656         return _is_Sub(node);
2657 }
2658
2659 int
2660 (is_Shl)(const ir_node *node) {
2661         return _is_Shl(node);
2662 }
2663
2664 int
2665 (is_Shr)(const ir_node *node) {
2666         return _is_Shr(node);
2667 }
2668
2669 int
2670 (is_Shrs)(const ir_node *node) {
2671         return _is_Shrs(node);
2672 }
2673
2674 int
2675 (is_Rot)(const ir_node *node) {
2676         return _is_Rot(node);
2677 }
2678
2679 int
2680 (is_Not)(const ir_node *node) {
2681         return _is_Not(node);
2682 }
2683
2684 int
2685 (is_Psi)(const ir_node *node) {
2686         return _is_Psi(node);
2687 }
2688
2689 int
2690 (is_Tuple)(const ir_node *node) {
2691         return _is_Tuple(node);
2692 }
2693
2694 int
2695 (is_Bound)(const ir_node *node) {
2696         return _is_Bound(node);
2697 }
2698
2699 int
2700 (is_Start)(const ir_node *node) {
2701   return _is_Start(node);
2702 }
2703
2704 int
2705 (is_End)(const ir_node *node) {
2706         return _is_End(node);
2707 }
2708
2709 int
2710 (is_Const)(const ir_node *node) {
2711         return _is_Const(node);
2712 }
2713
2714 int
2715 (is_Conv)(const ir_node *node) {
2716         return _is_Conv(node);
2717 }
2718
2719 int
2720 (is_strictConv)(const ir_node *node) {
2721         return _is_strictConv(node);
2722 }
2723
2724 int
2725 (is_Cast)(const ir_node *node) {
2726         return _is_Cast(node);
2727 }
2728
2729 int
2730 (is_no_Block)(const ir_node *node) {
2731         return _is_no_Block(node);
2732 }
2733
2734 int
2735 (is_Block)(const ir_node *node) {
2736         return _is_Block(node);
2737 }
2738
2739 /* returns true if node is an Unknown node. */
2740 int
2741 (is_Unknown)(const ir_node *node) {
2742         return _is_Unknown(node);
2743 }
2744
2745 /* returns true if node is a Return node. */
2746 int
2747 (is_Return)(const ir_node *node) {
2748         return _is_Return(node);
2749 }
2750
2751 /* returns true if node is a Call node. */
2752 int
2753 (is_Call)(const ir_node *node) {
2754         return _is_Call(node);
2755 }
2756
2757 /* returns true if node is a Sel node. */
2758 int
2759 (is_Sel)(const ir_node *node) {
2760         return _is_Sel(node);
2761 }
2762
2763 /* returns true if node is a Mux node or a Psi with only one condition. */
2764 int
2765 (is_Mux)(const ir_node *node) {
2766         return _is_Mux(node);
2767 }
2768
2769 /* returns true if node is a Load node. */
2770 int
2771 (is_Load)(const ir_node *node) {
2772         return _is_Load(node);
2773 }
2774
2775 /* returns true if node is a Load node. */
2776 int
2777 (is_Store)(const ir_node *node) {
2778         return _is_Store(node);
2779 }
2780
2781 /* returns true if node is a Sync node. */
2782 int
2783 (is_Sync)(const ir_node *node) {
2784         return _is_Sync(node);
2785 }
2786
2787 /* Returns true if node is a Confirm node. */
2788 int
2789 (is_Confirm)(const ir_node *node) {
2790         return _is_Confirm(node);
2791 }
2792
2793 /* Returns true if node is a Pin node. */
2794 int
2795 (is_Pin)(const ir_node *node) {
2796         return _is_Pin(node);
2797 }
2798
2799 /* Returns true if node is a SymConst node. */
2800 int
2801 (is_SymConst)(const ir_node *node) {
2802         return _is_SymConst(node);
2803 }
2804
2805 /* Returns true if node is a SymConst node with kind symconst_addr_ent. */
2806 int
2807 (is_SymConst_addr_ent)(const ir_node *node) {
2808         return _is_SymConst_addr_ent(node);
2809 }
2810
2811 /* Returns true if node is a Cond node. */
2812 int
2813 (is_Cond)(const ir_node *node) {
2814         return _is_Cond(node);
2815 }
2816
2817 int
2818 (is_CopyB)(const ir_node *node) {
2819         return _is_CopyB(node);
2820 }
2821
2822 /* returns true if node is a Cmp node. */
2823 int
2824 (is_Cmp)(const ir_node *node) {
2825         return _is_Cmp(node);
2826 }
2827
2828 /* returns true if node is an Alloc node. */
2829 int
2830 (is_Alloc)(const ir_node *node) {
2831         return _is_Alloc(node);
2832 }
2833
2834 /* returns true if a node is a Jmp node. */
2835 int
2836 (is_Jmp)(const ir_node *node) {
2837         return _is_Jmp(node);
2838 }
2839
2840 /* returns true if a node is a Raise node. */
2841 int
2842 (is_Raise)(const ir_node *node) {
2843         return _is_Raise(node);
2844 }
2845
2846 /* returns true if a node is an ASM node. */
2847 int
2848 (is_ASM)(const ir_node *node) {
2849         return _is_ASM(node);
2850 }
2851
2852 int
2853 (is_Proj)(const ir_node *node) {
2854         assert(node);
2855         return node->op == op_Proj ||
2856                (!get_interprocedural_view() && node->op == op_Filter);
2857 }
2858
2859 /* Returns true if the operation manipulates control flow. */
2860 int is_cfop(const ir_node *node) {
2861         return is_op_cfopcode(get_irn_op(node));
2862 }
2863
2864 /* Returns true if the operation manipulates interprocedural control flow:
2865    CallBegin, EndReg, EndExcept */
2866 int is_ip_cfop(const ir_node *node) {
2867         return is_ip_cfopcode(get_irn_op(node));
2868 }
2869
2870 /* Returns true if the operation can change the control flow because
2871    of an exception. */
2872 int
2873 is_fragile_op(const ir_node *node) {
2874         return is_op_fragile(get_irn_op(node));
2875 }
2876
2877 /* Returns the memory operand of fragile operations. */
2878 ir_node *get_fragile_op_mem(ir_node *node) {
2879         assert(node && is_fragile_op(node));
2880
2881         switch (get_irn_opcode(node)) {
2882         case iro_Call  :
2883         case iro_Quot  :
2884         case iro_DivMod:
2885         case iro_Div   :
2886         case iro_Mod   :
2887         case iro_Load  :
2888         case iro_Store :
2889         case iro_Alloc :
2890         case iro_Bound :
2891         case iro_CopyB :
2892                 return get_irn_n(node, pn_Generic_M_regular);
2893         case iro_Bad   :
2894         case iro_Unknown:
2895                 return node;
2896         default: ;
2897                 assert(0 && "should not be reached");
2898                 return NULL;
2899         }
2900 }
2901
2902 /* Returns the result mode of a Div operation. */
2903 ir_mode *get_divop_resmod(const ir_node *node) {
2904         switch (get_irn_opcode(node)) {
2905         case iro_Quot  : return get_Quot_resmode(node);
2906         case iro_DivMod: return get_DivMod_resmode(node);
2907         case iro_Div   : return get_Div_resmode(node);
2908         case iro_Mod   : return get_Mod_resmode(node);
2909         default: ;
2910                 assert(0 && "should not be reached");
2911                 return NULL;
2912         }
2913 }
2914
2915 /* Returns true if the operation is a forking control flow operation. */
2916 int (is_irn_forking)(const ir_node *node) {
2917         return _is_irn_forking(node);
2918 }
2919
2920 /* Return the type associated with the value produced by n
2921  * if the node remarks this type as it is the case for
2922  * Cast, Const, SymConst and some Proj nodes. */
2923 ir_type *(get_irn_type)(ir_node *node) {
2924         return _get_irn_type(node);
2925 }
2926
2927 /* Return the type attribute of a node n (SymConst, Call, Alloc, Free,
2928    Cast) or NULL.*/
2929 ir_type *(get_irn_type_attr)(ir_node *node) {
2930         return _get_irn_type_attr(node);
2931 }
2932
2933 /* Return the entity attribute of a node n (SymConst, Sel) or NULL. */
2934 ir_entity *(get_irn_entity_attr)(ir_node *node) {
2935         return _get_irn_entity_attr(node);
2936 }
2937
2938 /* Returns non-zero for constant-like nodes. */
2939 int (is_irn_constlike)(const ir_node *node) {
2940         return _is_irn_constlike(node);
2941 }
2942
2943 /*
2944  * Returns non-zero for nodes that are allowed to have keep-alives and
2945  * are neither Block nor PhiM.
2946  */
2947 int (is_irn_keep)(const ir_node *node) {
2948         return _is_irn_keep(node);
2949 }
2950
2951 /*
2952  * Returns non-zero for nodes that are always placed in the start block.
2953  */
2954 int (is_irn_start_block_placed)(const ir_node *node) {
2955         return _is_irn_start_block_placed(node);
2956 }
2957
2958 /* Returns non-zero for nodes that are machine operations. */
2959 int (is_irn_machine_op)(const ir_node *node) {
2960         return _is_irn_machine_op(node);
2961 }
2962
2963 /* Returns non-zero for nodes that are machine operands. */
2964 int (is_irn_machine_operand)(const ir_node *node) {
2965         return _is_irn_machine_operand(node);
2966 }
2967
2968 /* Returns non-zero for nodes that have the n'th user machine flag set. */
2969 int (is_irn_machine_user)(const ir_node *node, unsigned n) {
2970         return _is_irn_machine_user(node, n);
2971 }
2972
2973
2974 /* Gets the string representation of the jump prediction .*/
2975 const char *get_cond_jmp_predicate_name(cond_jmp_predicate pred) {
2976         switch (pred) {
2977         default:
2978         case COND_JMP_PRED_NONE:  return "no prediction";
2979         case COND_JMP_PRED_TRUE:  return "true taken";
2980         case COND_JMP_PRED_FALSE: return "false taken";
2981         }
2982 }
2983
2984 /* Returns the conditional jump prediction of a Cond node. */
2985 cond_jmp_predicate (get_Cond_jmp_pred)(const ir_node *cond) {
2986         return _get_Cond_jmp_pred(cond);
2987 }
2988
2989 /* Sets a new conditional jump prediction. */
2990 void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) {
2991         _set_Cond_jmp_pred(cond, pred);
2992 }
2993
2994 /** the get_type operation must be always implemented and return a firm type */
2995 static ir_type *get_Default_type(ir_node *n) {
2996         (void) n;
2997         return get_unknown_type();
2998 }
2999
3000 /* Sets the get_type operation for an ir_op_ops. */
3001 ir_op_ops *firm_set_default_get_type(ir_opcode code, ir_op_ops *ops) {
3002         switch (code) {
3003         case iro_Const:    ops->get_type = get_Const_type; break;
3004         case iro_SymConst: ops->get_type = get_SymConst_value_type; break;
3005         case iro_Cast:     ops->get_type = get_Cast_type; break;
3006         case iro_Proj:     ops->get_type = get_Proj_type; break;
3007         default:
3008                 /* not allowed to be NULL */
3009                 if (! ops->get_type)
3010                         ops->get_type = get_Default_type;
3011                 break;
3012         }
3013         return ops;
3014 }
3015
3016 /** Return the attribute type of a SymConst node if exists */
3017 static ir_type *get_SymConst_attr_type(ir_node *self) {
3018         symconst_kind kind = get_SymConst_kind(self);
3019         if (SYMCONST_HAS_TYPE(kind))
3020                 return get_SymConst_type(self);
3021         return NULL;
3022 }
3023
3024 /** Return the attribute entity of a SymConst node if exists */
3025 static ir_entity *get_SymConst_attr_entity(ir_node *self) {
3026         symconst_kind kind = get_SymConst_kind(self);
3027         if (SYMCONST_HAS_ENT(kind))
3028                 return get_SymConst_entity(self);
3029         return NULL;
3030 }
3031
3032 /** the get_type_attr operation must be always implemented */
3033 static ir_type *get_Null_type(ir_node *n) {
3034         (void) n;
3035         return firm_unknown_type;
3036 }
3037
3038 /* Sets the get_type operation for an ir_op_ops. */
3039 ir_op_ops *firm_set_default_get_type_attr(ir_opcode code, ir_op_ops *ops) {
3040         switch (code) {
3041         case iro_SymConst: ops->get_type_attr = get_SymConst_attr_type; break;
3042         case iro_Call:     ops->get_type_attr = get_Call_type; break;
3043         case iro_Alloc:    ops->get_type_attr = get_Alloc_type; break;
3044         case iro_Free:     ops->get_type_attr = get_Free_type; break;
3045         case iro_Cast:     ops->get_type_attr = get_Cast_type; break;
3046         default:
3047                 /* not allowed to be NULL */
3048                 if (! ops->get_type_attr)
3049                         ops->get_type_attr = get_Null_type;
3050                 break;
3051         }
3052         return ops;
3053 }
3054
3055 /** the get_entity_attr operation must be always implemented */
3056 static ir_entity *get_Null_ent(ir_node *n) {
3057         (void) n;
3058         return NULL;
3059 }
3060
3061 /* Sets the get_type operation for an ir_op_ops. */
3062 ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops) {
3063         switch (code) {
3064         case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break;
3065         case iro_Sel:      ops->get_entity_attr = _get_Sel_entity; break;
3066         default:
3067                 /* not allowed to be NULL */
3068                 if (! ops->get_entity_attr)
3069                         ops->get_entity_attr = get_Null_ent;
3070                 break;
3071         }
3072         return ops;
3073 }
3074
3075 /* Sets the debug information of a node. */
3076 void (set_irn_dbg_info)(ir_node *n, dbg_info *db) {
3077         _set_irn_dbg_info(n, db);
3078 }
3079
3080 /**
3081  * Returns the debug information of an node.
3082  *
3083  * @param n   The node.
3084  */
3085 dbg_info *(get_irn_dbg_info)(const ir_node *n) {
3086         return _get_irn_dbg_info(n);
3087 }
3088
3089 #if 0 /* allow the global pointer */
3090
3091 /* checks whether a node represents a global address */
3092 int is_Global(const ir_node *node) {
3093         ir_node *ptr;
3094
3095         if (is_SymConst_addr_ent(node))
3096                 return 1;
3097         if (! is_Sel(node))
3098                 return 0;
3099
3100         ptr = get_Sel_ptr(node);
3101         return is_globals_pointer(ptr) != NULL;
3102 }
3103
3104 /* returns the entity of a global address */
3105 ir_entity *get_Global_entity(const ir_node *node) {
3106         if (is_SymConst(node))
3107                 return get_SymConst_entity(node);
3108         else
3109                 return get_Sel_entity(node);
3110 }
3111 #else
3112
3113 /* checks whether a node represents a global address */
3114 int is_Global(const ir_node *node) {
3115         return is_SymConst_addr_ent(node);
3116 }
3117
3118 /* returns the entity of a global address */
3119 ir_entity *get_Global_entity(const ir_node *node) {
3120         return get_SymConst_entity(node);
3121 }
3122 #endif
3123
3124 #ifdef DEBUG_libfirm
3125 void dump_irn(const ir_node *n) {
3126         int i, arity = get_irn_arity(n);
3127         printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n);
3128         if (!is_Block(n)) {
3129                 ir_node *pred = get_irn_n(n, -1);
3130                 printf("  block: %s%s: %ld (%p)\n", get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
3131                         get_irn_node_nr(pred), (void *)pred);
3132         }
3133         printf("  preds: \n");
3134         for (i = 0; i < arity; ++i) {
3135                 ir_node *pred = get_irn_n(n, i);
3136                 printf("    %d: %s%s: %ld (%p)\n", i, get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
3137                         get_irn_node_nr(pred), (void *)pred);
3138         }
3139 }
3140
3141 #else  /* DEBUG_libfirm */
3142 void dump_irn(const ir_node *n) { (void) n; }
3143 #endif /* DEBUG_libfirm */