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