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