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