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