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