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