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