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