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