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