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