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