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