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