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