- get_Block_cfgpred_arr() IS supported, but should not be in the official
[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 ir_node **get_Block_cfgpred_arr(ir_node *node) {
640         assert(is_Block(node));
641         return (ir_node **)&(get_irn_in(node)[1]);
642 }
643
644 int (get_Block_n_cfgpreds)(const ir_node *node) {
645         return _get_Block_n_cfgpreds(node);
646 }
647
648 ir_node *(get_Block_cfgpred)(const ir_node *node, int pos) {
649         return _get_Block_cfgpred(node, pos);
650 }
651
652 void set_Block_cfgpred(ir_node *node, int pos, ir_node *pred) {
653         assert(is_Block(node));
654         set_irn_n(node, pos, pred);
655 }
656
657 int get_Block_cfgpred_pos(const ir_node *block, const ir_node *pred) {
658         int i;
659
660         for (i = get_Block_n_cfgpreds(block) - 1; i >= 0; --i) {
661                 if (get_Block_cfgpred_block(block, i) == pred)
662                         return i;
663         }
664         return -1;
665 }
666
667 ir_node *(get_Block_cfgpred_block)(const ir_node *node, int pos) {
668         return _get_Block_cfgpred_block(node, pos);
669 }
670
671 int get_Block_matured(const ir_node *node) {
672         assert(is_Block(node));
673         return (int)node->attr.block.is_matured;
674 }
675
676 void set_Block_matured(ir_node *node, int matured) {
677         assert(is_Block(node));
678         node->attr.block.is_matured = matured;
679 }
680
681 ir_visited_t (get_Block_block_visited)(const ir_node *node) {
682         return _get_Block_block_visited(node);
683 }
684
685 void (set_Block_block_visited)(ir_node *node, ir_visited_t visit) {
686         _set_Block_block_visited(node, visit);
687 }
688
689 /* For this current_ir_graph must be set. */
690 void (mark_Block_block_visited)(ir_node *node) {
691         _mark_Block_block_visited(node);
692 }
693
694 int (Block_block_visited)(const ir_node *node) {
695         return _Block_block_visited(node);
696 }
697
698 ir_node *get_Block_graph_arr(ir_node *node, int pos) {
699         assert(is_Block(node));
700         return node->attr.block.graph_arr[pos+1];
701 }
702
703 void set_Block_graph_arr(ir_node *node, int pos, ir_node *value) {
704         assert(is_Block(node));
705         node->attr.block.graph_arr[pos+1] = value;
706 }
707
708 #ifdef INTERPROCEDURAL_VIEW
709 void set_Block_cg_cfgpred_arr(ir_node *node, int arity, ir_node *in[]) {
710         assert(is_Block(node));
711         if (node->attr.block.in_cg == NULL || arity != ARR_LEN(node->attr.block.in_cg) - 1) {
712                 node->attr.block.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
713                 node->attr.block.in_cg[0] = NULL;
714                 node->attr.block.cg_backedge = new_backedge_arr(current_ir_graph->obst, arity);
715                 {
716                         /* Fix backedge array.  fix_backedges() operates depending on
717                            interprocedural_view. */
718                         int ipv = get_interprocedural_view();
719                         set_interprocedural_view(1);
720                         fix_backedges(current_ir_graph->obst, node);
721                         set_interprocedural_view(ipv);
722                 }
723         }
724         memcpy(node->attr.block.in_cg + 1, in, sizeof(ir_node *) * arity);
725 }
726
727 void set_Block_cg_cfgpred(ir_node *node, int pos, ir_node *pred) {
728         assert(is_Block(node) && node->attr.block.in_cg &&
729                0 <= pos && pos < ARR_LEN(node->attr.block.in_cg) - 1);
730         node->attr.block.in_cg[pos + 1] = pred;
731 }
732
733 ir_node **get_Block_cg_cfgpred_arr(ir_node *node) {
734         assert(is_Block(node));
735         return node->attr.block.in_cg == NULL ? NULL : node->attr.block.in_cg  + 1;
736 }
737
738 int get_Block_cg_n_cfgpreds(const ir_node *node) {
739         assert(is_Block(node));
740         return node->attr.block.in_cg == NULL ? 0 : ARR_LEN(node->attr.block.in_cg) - 1;
741 }
742
743 ir_node *get_Block_cg_cfgpred(const ir_node *node, int pos) {
744         assert(is_Block(node) && node->attr.block.in_cg);
745         return node->attr.block.in_cg[pos + 1];
746 }
747
748 void remove_Block_cg_cfgpred_arr(ir_node *node) {
749         assert(is_Block(node));
750         node->attr.block.in_cg = NULL;
751 }
752 #endif /* INTERPROCEDURAL_VIEW */
753
754 ir_node *(set_Block_dead)(ir_node *block) {
755         return _set_Block_dead(block);
756 }
757
758 int (is_Block_dead)(const ir_node *block) {
759         return _is_Block_dead(block);
760 }
761
762 ir_extblk *get_Block_extbb(const ir_node *block) {
763         ir_extblk *res;
764         assert(is_Block(block));
765         res = block->attr.block.extblk;
766         assert(res == NULL || is_ir_extbb(res));
767         return res;
768 }
769
770 void set_Block_extbb(ir_node *block, ir_extblk *extblk) {
771         assert(is_Block(block));
772         assert(extblk == NULL || is_ir_extbb(extblk));
773         block->attr.block.extblk = extblk;
774 }
775
776 /* Returns the macro block header of a block.*/
777 ir_node *get_Block_MacroBlock(const ir_node *block) {
778         ir_node *mbh;
779         assert(is_Block(block));
780         mbh = get_irn_n(block, -1);
781         /* once macro block header is respected by all optimizations,
782            this assert can be removed */
783         assert(mbh != NULL);
784         return mbh;
785 }
786
787 /* Sets the macro block header of a block. */
788 void set_Block_MacroBlock(ir_node *block, ir_node *mbh) {
789         assert(is_Block(block));
790         assert(is_Block(mbh));
791         set_irn_n(block, -1, mbh);
792 }
793
794 /* returns the macro block header of a node. */
795 ir_node *get_irn_MacroBlock(const ir_node *n) {
796         if (! is_Block(n)) {
797                 n = get_nodes_block(n);
798                 /* if the Block is Bad, do NOT try to get it's MB, it will fail. */
799                 if (is_Bad(n))
800                         return (ir_node *)n;
801         }
802         return get_Block_MacroBlock(n);
803 }
804
805 /* returns the graph of a Block. */
806 ir_graph *get_Block_irg(const ir_node *block) {
807         assert(is_Block(block));
808         return block->attr.block.irg;
809 }
810
811 int has_Block_label(const ir_node *block) {
812         assert(is_Block(block));
813         return block->attr.block.has_label;
814 }
815
816 ir_label_t get_Block_label(const ir_node *block) {
817         assert(is_Block(block));
818         return block->attr.block.label;
819 }
820
821 void set_Block_label(ir_node *block, ir_label_t label) {
822         assert(is_Block(block));
823         block->attr.block.has_label = 1;
824         block->attr.block.label = label;
825 }
826
827 ir_node *(get_Block_phis)(const ir_node *block) {
828         return _get_Block_phis(block);
829 }
830
831 void (set_Block_phis)(ir_node *block, ir_node *phi) {
832         _set_Block_phis(block, phi);
833 }
834
835 void (add_Block_phi)(ir_node *block, ir_node *phi) {
836         _add_Block_phi(block, phi);
837 }
838
839 /* Get the Block mark (single bit). */
840 unsigned (get_Block_mark)(const ir_node *block) {
841         return _get_Block_mark(block);
842 }
843
844 /* Set the Block mark (single bit). */
845 void (set_Block_mark)(ir_node *block, unsigned mark) {
846         _set_Block_mark(block, mark);
847 }
848
849 int get_End_n_keepalives(const ir_node *end) {
850         assert(is_End(end));
851         return (get_irn_arity(end) - END_KEEPALIVE_OFFSET);
852 }
853
854 ir_node *get_End_keepalive(const ir_node *end, int pos) {
855         assert(is_End(end));
856         return get_irn_n(end, pos + END_KEEPALIVE_OFFSET);
857 }
858
859 void add_End_keepalive(ir_node *end, ir_node *ka) {
860         assert(is_End(end));
861         add_irn_n(end, ka);
862 }
863
864 void set_End_keepalive(ir_node *end, int pos, ir_node *ka) {
865         assert(is_End(end));
866         set_irn_n(end, pos + END_KEEPALIVE_OFFSET, ka);
867 }
868
869 /* Set new keep-alives */
870 void set_End_keepalives(ir_node *end, int n, ir_node *in[]) {
871         int i;
872         ir_graph *irg = get_irn_irg(end);
873
874         /* notify that edges are deleted */
875         for (i = END_KEEPALIVE_OFFSET; i < ARR_LEN(end->in) - 1; ++i) {
876                 edges_notify_edge(end, i, NULL, end->in[i + 1], irg);
877         }
878         ARR_RESIZE(ir_node *, end->in, n + 1 + END_KEEPALIVE_OFFSET);
879
880         for (i = 0; i < n; ++i) {
881                 end->in[1 + END_KEEPALIVE_OFFSET + i] = in[i];
882                 edges_notify_edge(end, END_KEEPALIVE_OFFSET + i, end->in[1 + END_KEEPALIVE_OFFSET + i], NULL, irg);
883         }
884 }
885
886 /* Set new keep-alives from old keep-alives, skipping irn */
887 void remove_End_keepalive(ir_node *end, ir_node *irn) {
888         int      n = get_End_n_keepalives(end);
889         int      i, idx;
890         ir_graph *irg;
891
892         idx = -1;
893         for (i = n -1; i >= 0; --i) {
894                 ir_node *old_ka = end->in[1 + END_KEEPALIVE_OFFSET + i];
895
896                 /* find irn */
897                 if (old_ka == irn) {
898                         idx = i;
899                         goto found;
900                 }
901         }
902         return;
903 found:
904         irg = get_irn_irg(end);
905
906         /* remove the edge */
907         edges_notify_edge(end, idx, NULL, irn, irg);
908
909         if (idx != n - 1) {
910                 /* exchange with the last one */
911                 ir_node *old = end->in[1 + END_KEEPALIVE_OFFSET + n - 1];
912                 edges_notify_edge(end, n - 1, NULL, old, irg);
913                 end->in[1 + END_KEEPALIVE_OFFSET + idx] = old;
914                 edges_notify_edge(end, idx, old, NULL, irg);
915         }
916         /* now n - 1 keeps, 1 block input */
917         ARR_RESIZE(ir_node *, end->in, (n - 1) + 1 + END_KEEPALIVE_OFFSET);
918 }
919
920 /* remove Bads, NoMems and doublets from the keep-alive set */
921 void remove_End_Bads_and_doublets(ir_node *end) {
922         pset_new_t keeps;
923         int        idx, n = get_End_n_keepalives(end);
924         ir_graph   *irg;
925
926         if (n <= 0)
927                 return;
928
929         irg = get_irn_irg(end);
930         pset_new_init(&keeps);
931
932         for (idx = n - 1; idx >= 0; --idx) {
933                 ir_node *ka = get_End_keepalive(end, idx);
934
935                 if (is_Bad(ka) || is_NoMem(ka) || pset_new_contains(&keeps, ka)) {
936                         /* remove the edge */
937                         edges_notify_edge(end, idx, NULL, ka, irg);
938
939                         if (idx != n - 1) {
940                                 /* exchange with the last one */
941                                 ir_node *old = end->in[1 + END_KEEPALIVE_OFFSET + n - 1];
942                                 edges_notify_edge(end, n - 1, NULL, old, irg);
943                                 end->in[1 + END_KEEPALIVE_OFFSET + idx] = old;
944                                 edges_notify_edge(end, idx, old, NULL, irg);
945                         }
946                         --n;
947                 } else {
948                         pset_new_insert(&keeps, ka);
949                 }
950         }
951         /* n keeps, 1 block input */
952         ARR_RESIZE(ir_node *, end->in, n + 1 + END_KEEPALIVE_OFFSET);
953
954         pset_new_destroy(&keeps);
955 }
956
957 void free_End(ir_node *end) {
958         assert(is_End(end));
959         end->kind = k_BAD;
960         DEL_ARR_F(end->in);
961         end->in = NULL;   /* @@@ make sure we get an error if we use the
962                              in array afterwards ... */
963 }
964
965 /* Return the target address of an IJmp */
966 ir_node *get_IJmp_target(const ir_node *ijmp) {
967         assert(is_IJmp(ijmp));
968         return get_irn_n(ijmp, 0);
969 }
970
971 /** Sets the target address of an IJmp */
972 void set_IJmp_target(ir_node *ijmp, ir_node *tgt) {
973         assert(is_IJmp(ijmp));
974         set_irn_n(ijmp, 0, tgt);
975 }
976
977 /*
978 > Implementing the case construct (which is where the constant Proj node is
979 > important) involves far more than simply determining the constant values.
980 > We could argue that this is more properly a function of the translator from
981 > Firm to the target machine.  That could be done if there was some way of
982 > projecting "default" out of the Cond node.
983 I know it's complicated.
984 Basically there are two problems:
985  - determining the gaps between the Projs
986  - determining the biggest case constant to know the proj number for
987    the default node.
988 I see several solutions:
989 1. Introduce a ProjDefault node.  Solves both problems.
990    This means to extend all optimizations executed during construction.
991 2. Give the Cond node for switch two flavors:
992    a) there are no gaps in the Projs  (existing flavor)
993    b) gaps may exist, default proj is still the Proj with the largest
994       projection number.  This covers also the gaps.
995 3. Fix the semantic of the Cond to that of 2b)
996
997 Solution 2 seems to be the best:
998 Computing the gaps in the Firm representation is not too hard, i.e.,
999 libFIRM can implement a routine that transforms between the two
1000 flavours.  This is also possible for 1) but 2) does not require to
1001 change any existing optimization.
1002 Further it should be far simpler to determine the biggest constant than
1003 to compute all gaps.
1004 I don't want to choose 3) as 2a) seems to have advantages for
1005 dataflow analysis and 3) does not allow to convert the representation to
1006 2a).
1007 */
1008
1009 const char *get_cond_kind_name(cond_kind kind)
1010 {
1011 #define X(a)    case a: return #a;
1012         switch (kind) {
1013                 X(dense);
1014                 X(fragmentary);
1015         }
1016         return "<unknown>";
1017 #undef X
1018 }
1019
1020 ir_node *
1021 get_Cond_selector(const ir_node *node) {
1022         assert(is_Cond(node));
1023         return get_irn_n(node, 0);
1024 }
1025
1026 void
1027 set_Cond_selector(ir_node *node, ir_node *selector) {
1028         assert(is_Cond(node));
1029         set_irn_n(node, 0, selector);
1030 }
1031
1032 cond_kind
1033 get_Cond_kind(const ir_node *node) {
1034         assert(is_Cond(node));
1035         return node->attr.cond.kind;
1036 }
1037
1038 void
1039 set_Cond_kind(ir_node *node, cond_kind kind) {
1040         assert(is_Cond(node));
1041         node->attr.cond.kind = kind;
1042 }
1043
1044 long
1045 get_Cond_default_proj(const ir_node *node) {
1046         assert(is_Cond(node));
1047         return node->attr.cond.default_proj;
1048 }
1049
1050 void set_Cond_default_proj(ir_node *node, long defproj) {
1051         assert(is_Cond(node));
1052         node->attr.cond.default_proj = defproj;
1053 }
1054
1055 ir_node *
1056 get_Return_mem(const ir_node *node) {
1057         assert(is_Return(node));
1058         return get_irn_n(node, 0);
1059 }
1060
1061 void
1062 set_Return_mem(ir_node *node, ir_node *mem) {
1063         assert(is_Return(node));
1064         set_irn_n(node, 0, mem);
1065 }
1066
1067 int
1068 get_Return_n_ress(const ir_node *node) {
1069         assert(is_Return(node));
1070         return (get_irn_arity(node) - RETURN_RESULT_OFFSET);
1071 }
1072
1073 ir_node **
1074 get_Return_res_arr(ir_node *node) {
1075         assert(is_Return(node));
1076         if (get_Return_n_ress(node) > 0)
1077                 return (ir_node **)&(get_irn_in(node)[1 + RETURN_RESULT_OFFSET]);
1078         else
1079                 return NULL;
1080 }
1081
1082 /*
1083 void
1084 set_Return_n_res(ir_node *node, int results) {
1085         assert(is_Return(node));
1086 }
1087 */
1088
1089 ir_node *
1090 get_Return_res(const ir_node *node, int pos) {
1091         assert(is_Return(node));
1092         assert(get_Return_n_ress(node) > pos);
1093         return get_irn_n(node, pos + RETURN_RESULT_OFFSET);
1094 }
1095
1096 void
1097 set_Return_res(ir_node *node, int pos, ir_node *res){
1098         assert(is_Return(node));
1099         set_irn_n(node, pos + RETURN_RESULT_OFFSET, res);
1100 }
1101
1102 tarval *(get_Const_tarval)(const ir_node *node) {
1103         return _get_Const_tarval(node);
1104 }
1105
1106 void
1107 set_Const_tarval(ir_node *node, tarval *con) {
1108         assert(is_Const(node));
1109         node->attr.con.tv = con;
1110 }
1111
1112 int (is_Const_null)(const ir_node *node) {
1113         return _is_Const_null(node);
1114 }
1115
1116 int (is_Const_one)(const ir_node *node) {
1117         return _is_Const_one(node);
1118 }
1119
1120 int (is_Const_all_one)(const ir_node *node) {
1121         return _is_Const_all_one(node);
1122 }
1123
1124
1125 /* The source language type.  Must be an atomic type.  Mode of type must
1126    be mode of node. For tarvals from entities type must be pointer to
1127    entity type. */
1128 ir_type *
1129 get_Const_type(ir_node *node) {
1130         assert(is_Const(node));
1131         node->attr.con.tp = skip_tid(node->attr.con.tp);
1132         return node->attr.con.tp;
1133 }
1134
1135 void
1136 set_Const_type(ir_node *node, ir_type *tp) {
1137         assert(is_Const(node));
1138         if (tp != firm_unknown_type) {
1139                 assert(is_atomic_type(tp));
1140                 assert(get_type_mode(tp) == get_irn_mode(node));
1141         }
1142         node->attr.con.tp = tp;
1143 }
1144
1145
1146 symconst_kind
1147 get_SymConst_kind(const ir_node *node) {
1148         assert(is_SymConst(node));
1149         return node->attr.symc.kind;
1150 }
1151
1152 void
1153 set_SymConst_kind(ir_node *node, symconst_kind kind) {
1154         assert(is_SymConst(node));
1155         node->attr.symc.kind = kind;
1156 }
1157
1158 ir_type *
1159 get_SymConst_type(const ir_node *node) {
1160         /* the cast here is annoying, but we have to compensate for
1161            the skip_tip() */
1162         ir_node *irn = (ir_node *)node;
1163         assert(is_SymConst(node) &&
1164                (SYMCONST_HAS_TYPE(get_SymConst_kind(node))));
1165         return irn->attr.symc.sym.type_p = skip_tid(irn->attr.symc.sym.type_p);
1166 }
1167
1168 void
1169 set_SymConst_type(ir_node *node, ir_type *tp) {
1170         assert(is_SymConst(node) &&
1171                (SYMCONST_HAS_TYPE(get_SymConst_kind(node))));
1172         node->attr.symc.sym.type_p = tp;
1173 }
1174
1175 ident *
1176 get_SymConst_name(const ir_node *node) {
1177         assert(is_SymConst(node) && SYMCONST_HAS_ID(get_SymConst_kind(node)));
1178         return node->attr.symc.sym.ident_p;
1179 }
1180
1181 void
1182 set_SymConst_name(ir_node *node, ident *name) {
1183         assert(is_SymConst(node) && SYMCONST_HAS_ID(get_SymConst_kind(node)));
1184         node->attr.symc.sym.ident_p = name;
1185 }
1186
1187
1188 /* Only to access SymConst of kind symconst_addr_ent.  Else assertion: */
1189 ir_entity *get_SymConst_entity(const ir_node *node) {
1190         assert(is_SymConst(node) && SYMCONST_HAS_ENT(get_SymConst_kind(node)));
1191         return node->attr.symc.sym.entity_p;
1192 }
1193
1194 void set_SymConst_entity(ir_node *node, ir_entity *ent) {
1195         assert(is_SymConst(node) && SYMCONST_HAS_ENT(get_SymConst_kind(node)));
1196         node->attr.symc.sym.entity_p  = ent;
1197 }
1198
1199 ir_enum_const *get_SymConst_enum(const ir_node *node) {
1200         assert(is_SymConst(node) && SYMCONST_HAS_ENUM(get_SymConst_kind(node)));
1201         return node->attr.symc.sym.enum_p;
1202 }
1203
1204 void set_SymConst_enum(ir_node *node, ir_enum_const *ec) {
1205         assert(is_SymConst(node) && SYMCONST_HAS_ENUM(get_SymConst_kind(node)));
1206         node->attr.symc.sym.enum_p  = ec;
1207 }
1208
1209 union symconst_symbol
1210 get_SymConst_symbol(const ir_node *node) {
1211         assert(is_SymConst(node));
1212         return node->attr.symc.sym;
1213 }
1214
1215 void
1216 set_SymConst_symbol(ir_node *node, union symconst_symbol sym) {
1217         assert(is_SymConst(node));
1218         node->attr.symc.sym = sym;
1219 }
1220
1221 ir_label_t get_SymConst_label(const ir_node *node) {
1222         assert(is_SymConst(node) && SYMCONST_HAS_LABEL(get_SymConst_kind(node)));
1223         return node->attr.symc.sym.label;
1224 }
1225
1226 void set_SymConst_label(ir_node *node, ir_label_t label) {
1227         assert(is_SymConst(node) && SYMCONST_HAS_LABEL(get_SymConst_kind(node)));
1228         node->attr.symc.sym.label = label;
1229 }
1230
1231 ir_type *
1232 get_SymConst_value_type(ir_node *node) {
1233         assert(is_SymConst(node));
1234         if (node->attr.symc.tp) node->attr.symc.tp = skip_tid(node->attr.symc.tp);
1235         return node->attr.symc.tp;
1236 }
1237
1238 void
1239 set_SymConst_value_type(ir_node *node, ir_type *tp) {
1240         assert(is_SymConst(node));
1241         node->attr.symc.tp = tp;
1242 }
1243
1244 ir_node *
1245 get_Sel_mem(const ir_node *node) {
1246         assert(is_Sel(node));
1247         return get_irn_n(node, 0);
1248 }
1249
1250 void
1251 set_Sel_mem(ir_node *node, ir_node *mem) {
1252         assert(is_Sel(node));
1253         set_irn_n(node, 0, mem);
1254 }
1255
1256 ir_node *
1257 get_Sel_ptr(const ir_node *node) {
1258         assert(is_Sel(node));
1259         return get_irn_n(node, 1);
1260 }
1261
1262 void
1263 set_Sel_ptr(ir_node *node, ir_node *ptr) {
1264         assert(is_Sel(node));
1265         set_irn_n(node, 1, ptr);
1266 }
1267
1268 int
1269 get_Sel_n_indexs(const ir_node *node) {
1270         assert(is_Sel(node));
1271         return (get_irn_arity(node) - SEL_INDEX_OFFSET);
1272 }
1273
1274 ir_node **
1275 get_Sel_index_arr(ir_node *node) {
1276         assert(is_Sel(node));
1277         if (get_Sel_n_indexs(node) > 0)
1278                 return (ir_node **)& get_irn_in(node)[SEL_INDEX_OFFSET + 1];
1279         else
1280                 return NULL;
1281 }
1282
1283 ir_node *
1284 get_Sel_index(const ir_node *node, int pos) {
1285         assert(is_Sel(node));
1286         return get_irn_n(node, pos + SEL_INDEX_OFFSET);
1287 }
1288
1289 void
1290 set_Sel_index(ir_node *node, int pos, ir_node *index) {
1291         assert(is_Sel(node));
1292         set_irn_n(node, pos + SEL_INDEX_OFFSET, index);
1293 }
1294
1295 ir_entity *
1296 get_Sel_entity(const ir_node *node) {
1297         assert(is_Sel(node));
1298         return node->attr.sel.ent;
1299 }
1300
1301 /* need a version without const to prevent warning */
1302 static ir_entity *_get_Sel_entity(ir_node *node) {
1303         return get_Sel_entity(node);
1304 }
1305
1306 void
1307 set_Sel_entity(ir_node *node, ir_entity *ent) {
1308         assert(is_Sel(node));
1309         node->attr.sel.ent = ent;
1310 }
1311
1312
1313 /* For unary and binary arithmetic operations the access to the
1314    operands can be factored out.  Left is the first, right the
1315    second arithmetic value  as listed in tech report 0999-33.
1316    unops are: Minus, Abs, Not, Conv, Cast
1317    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
1318    Shr, Shrs, Rotate, Cmp */
1319
1320
1321 ir_node *
1322 get_Call_mem(const ir_node *node) {
1323         assert(is_Call(node));
1324         return get_irn_n(node, 0);
1325 }
1326
1327 void
1328 set_Call_mem(ir_node *node, ir_node *mem) {
1329         assert(is_Call(node));
1330         set_irn_n(node, 0, mem);
1331 }
1332
1333 ir_node *
1334 get_Call_ptr(const ir_node *node) {
1335         assert(is_Call(node));
1336         return get_irn_n(node, 1);
1337 }
1338
1339 void
1340 set_Call_ptr(ir_node *node, ir_node *ptr) {
1341         assert(is_Call(node));
1342         set_irn_n(node, 1, ptr);
1343 }
1344
1345 ir_node **
1346 get_Call_param_arr(ir_node *node) {
1347         assert(is_Call(node));
1348         return &get_irn_in(node)[CALL_PARAM_OFFSET + 1];
1349 }
1350
1351 int
1352 get_Call_n_params(const ir_node *node)  {
1353         assert(is_Call(node));
1354         return (get_irn_arity(node) - CALL_PARAM_OFFSET);
1355 }
1356
1357 ir_node *
1358 get_Call_param(const ir_node *node, int pos) {
1359         assert(is_Call(node));
1360         return get_irn_n(node, pos + CALL_PARAM_OFFSET);
1361 }
1362
1363 void
1364 set_Call_param(ir_node *node, int pos, ir_node *param) {
1365         assert(is_Call(node));
1366         set_irn_n(node, pos + CALL_PARAM_OFFSET, param);
1367 }
1368
1369 ir_type *
1370 get_Call_type(ir_node *node) {
1371         assert(is_Call(node));
1372         return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
1373 }
1374
1375 void
1376 set_Call_type(ir_node *node, ir_type *tp) {
1377         assert(is_Call(node));
1378         assert((get_unknown_type() == tp) || is_Method_type(tp));
1379         node->attr.call.cld_tp = tp;
1380 }
1381
1382 ir_node *
1383 get_Builtin_mem(const ir_node *node) {
1384         assert(is_Builtin(node));
1385         return get_irn_n(node, 0);
1386 }
1387
1388 void
1389 set_Builin_mem(ir_node *node, ir_node *mem) {
1390         assert(is_Builtin(node));
1391         set_irn_n(node, 0, mem);
1392 }
1393
1394 ir_builtin_kind
1395 get_Builtin_kind(const ir_node *node) {
1396         assert(is_Builtin(node));
1397         return node->attr.builtin.kind;
1398 }
1399
1400 void
1401 set_Builtin_kind(ir_node *node, ir_builtin_kind kind) {
1402         assert(is_Builtin(node));
1403         node->attr.builtin.kind = kind;
1404 }
1405
1406 ir_node **
1407 get_Builtin_param_arr(ir_node *node) {
1408         assert(is_Builtin(node));
1409         return &get_irn_in(node)[BUILDIN_PARAM_OFFSET + 1];
1410 }
1411
1412 int
1413 get_Builtin_n_params(const ir_node *node)  {
1414         assert(is_Builtin(node));
1415         return (get_irn_arity(node) - BUILDIN_PARAM_OFFSET);
1416 }
1417
1418 ir_node *
1419 get_Builtin_param(const ir_node *node, int pos) {
1420         assert(is_Builtin(node));
1421         return get_irn_n(node, pos + BUILDIN_PARAM_OFFSET);
1422 }
1423
1424 void
1425 set_Builtin_param(ir_node *node, int pos, ir_node *param) {
1426         assert(is_Builtin(node));
1427         set_irn_n(node, pos + BUILDIN_PARAM_OFFSET, param);
1428 }
1429
1430 ir_type *
1431 get_Builtin_type(ir_node *node) {
1432         assert(is_Builtin(node));
1433         return node->attr.builtin.builtin_tp = skip_tid(node->attr.builtin.builtin_tp);
1434 }
1435
1436 void
1437 set_Builtin_type(ir_node *node, ir_type *tp) {
1438         assert(is_Builtin(node));
1439         assert((get_unknown_type() == tp) || is_Method_type(tp));
1440         node->attr.builtin.builtin_tp = tp;
1441 }
1442
1443 /* Returns a human readable string for the ir_builtin_kind. */
1444 const char *get_builtin_kind_name(ir_builtin_kind kind) {
1445 #define X(a)    case a: return #a;
1446         switch (kind) {
1447                 X(ir_bk_trap);
1448                 X(ir_bk_debugbreak);
1449                 X(ir_bk_return_address);
1450                 X(ir_bk_frame_addess);
1451                 X(ir_bk_prefetch);
1452                 X(ir_bk_ffs);
1453                 X(ir_bk_clz);
1454                 X(ir_bk_ctz);
1455                 X(ir_bk_popcount);
1456                 X(ir_bk_parity);
1457                 X(ir_bk_bswap);
1458                 X(ir_bk_inport);
1459                 X(ir_bk_outport);
1460                 X(ir_bk_inner_trampoline);
1461         }
1462         return "<unknown>";
1463 #undef X
1464 }
1465
1466
1467 int Call_has_callees(const ir_node *node) {
1468         assert(is_Call(node));
1469         return ((get_irg_callee_info_state(get_irn_irg(node)) != irg_callee_info_none) &&
1470                 (node->attr.call.callee_arr != NULL));
1471 }
1472
1473 int get_Call_n_callees(const ir_node *node) {
1474   assert(is_Call(node) && node->attr.call.callee_arr);
1475   return ARR_LEN(node->attr.call.callee_arr);
1476 }
1477
1478 ir_entity *get_Call_callee(const ir_node *node, int pos) {
1479         assert(pos >= 0 && pos < get_Call_n_callees(node));
1480         return node->attr.call.callee_arr[pos];
1481 }
1482
1483 void set_Call_callee_arr(ir_node *node, const int n, ir_entity ** arr) {
1484         assert(is_Call(node));
1485         if (node->attr.call.callee_arr == NULL || get_Call_n_callees(node) != n) {
1486                 node->attr.call.callee_arr = NEW_ARR_D(ir_entity *, current_ir_graph->obst, n);
1487         }
1488         memcpy(node->attr.call.callee_arr, arr, n * sizeof(ir_entity *));
1489 }
1490
1491 void remove_Call_callee_arr(ir_node *node) {
1492         assert(is_Call(node));
1493         node->attr.call.callee_arr = NULL;
1494 }
1495
1496 ir_node *get_CallBegin_ptr(const ir_node *node) {
1497         assert(is_CallBegin(node));
1498         return get_irn_n(node, 0);
1499 }
1500
1501 void set_CallBegin_ptr(ir_node *node, ir_node *ptr) {
1502         assert(is_CallBegin(node));
1503         set_irn_n(node, 0, ptr);
1504 }
1505
1506 ir_node *get_CallBegin_call(const ir_node *node) {
1507         assert(is_CallBegin(node));
1508         return node->attr.callbegin.call;
1509 }
1510
1511 void set_CallBegin_call(ir_node *node, ir_node *call) {
1512         assert(is_CallBegin(node));
1513         node->attr.callbegin.call = call;
1514 }
1515
1516 /*
1517  * Returns non-zero if a Call is surely a self-recursive Call.
1518  * Beware: if this functions returns 0, the call might be self-recursive!
1519  */
1520 int is_self_recursive_Call(const ir_node *call) {
1521         const ir_node *callee = get_Call_ptr(call);
1522
1523         if (is_SymConst_addr_ent(callee)) {
1524                 const ir_entity *ent = get_SymConst_entity(callee);
1525                 const ir_graph  *irg = get_entity_irg(ent);
1526                 if (irg == get_irn_irg(call))
1527                         return 1;
1528         }
1529         return 0;
1530 }
1531
1532 #define BINOP(OP)                                      \
1533 ir_node * get_##OP##_left(const ir_node *node) {       \
1534   assert(is_##OP(node));                               \
1535   return get_irn_n(node, node->op->op_index);          \
1536 }                                                      \
1537 void set_##OP##_left(ir_node *node, ir_node *left) {   \
1538   assert(is_##OP(node));                               \
1539   set_irn_n(node, node->op->op_index, left);           \
1540 }                                                      \
1541 ir_node *get_##OP##_right(const ir_node *node) {       \
1542   assert(is_##OP(node));                               \
1543   return get_irn_n(node, node->op->op_index + 1);      \
1544 }                                                      \
1545 void set_##OP##_right(ir_node *node, ir_node *right) { \
1546   assert(is_##OP(node));                               \
1547   set_irn_n(node, node->op->op_index + 1, right);      \
1548 }
1549
1550 #define UNOP(OP)                                  \
1551 ir_node *get_##OP##_op(const ir_node *node) {     \
1552   assert(is_##OP(node));                          \
1553   return get_irn_n(node, node->op->op_index);     \
1554 }                                                 \
1555 void set_##OP##_op(ir_node *node, ir_node *op) {  \
1556   assert(is_##OP(node));                          \
1557   set_irn_n(node, node->op->op_index, op);        \
1558 }
1559
1560 #define BINOP_MEM(OP)                         \
1561 BINOP(OP)                                     \
1562                                               \
1563 ir_node *                                     \
1564 get_##OP##_mem(const ir_node *node) {         \
1565   assert(is_##OP(node));                      \
1566   return get_irn_n(node, 0);                  \
1567 }                                             \
1568                                               \
1569 void                                          \
1570 set_##OP##_mem(ir_node *node, ir_node *mem) { \
1571   assert(is_##OP(node));                      \
1572   set_irn_n(node, 0, mem);                    \
1573 }
1574
1575 #define DIVOP(OP)                                       \
1576 BINOP_MEM(OP)                                           \
1577                                                         \
1578 ir_mode *get_##OP##_resmode(const ir_node *node) {      \
1579   assert(is_##OP(node));                                \
1580   return node->attr.divmod.res_mode;                    \
1581 }                                                       \
1582                                                         \
1583 void set_##OP##_resmode(ir_node *node, ir_mode *mode) { \
1584   assert(is_##OP(node));                                \
1585   node->attr.divmod.res_mode = mode;                    \
1586 }
1587
1588
1589 BINOP(Add)
1590 BINOP(Carry)
1591 BINOP(Sub)
1592 UNOP(Minus)
1593 BINOP(Mul)
1594 BINOP(Mulh)
1595 DIVOP(Quot)
1596 DIVOP(DivMod)
1597 DIVOP(Div)
1598 DIVOP(Mod)
1599 UNOP(Abs)
1600 BINOP(And)
1601 BINOP(Or)
1602 BINOP(Eor)
1603 UNOP(Not)
1604 BINOP(Shl)
1605 BINOP(Shr)
1606 BINOP(Shrs)
1607 BINOP(Rotl)
1608 BINOP(Cmp)
1609 UNOP(Conv)
1610 UNOP(Cast)
1611
1612 int get_Div_no_remainder(const ir_node *node) {
1613         assert(is_Div(node));
1614         return node->attr.divmod.no_remainder;
1615 }
1616
1617 int get_Conv_strict(const ir_node *node) {
1618         assert(is_Conv(node));
1619         return node->attr.conv.strict;
1620 }
1621
1622 void set_Conv_strict(ir_node *node, int strict_flag) {
1623         assert(is_Conv(node));
1624         node->attr.conv.strict = (char)strict_flag;
1625 }
1626
1627 ir_type *
1628 get_Cast_type(ir_node *node) {
1629         assert(is_Cast(node));
1630         node->attr.cast.totype = skip_tid(node->attr.cast.totype);
1631         return node->attr.cast.totype;
1632 }
1633
1634 void
1635 set_Cast_type(ir_node *node, ir_type *to_tp) {
1636         assert(is_Cast(node));
1637         node->attr.cast.totype = to_tp;
1638 }
1639
1640
1641 /* Checks for upcast.
1642  *
1643  * Returns true if the Cast node casts a class type to a super type.
1644  */
1645 int is_Cast_upcast(ir_node *node) {
1646         ir_type *totype   = get_Cast_type(node);
1647         ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1648
1649         assert(get_irg_typeinfo_state(get_irn_irg(node)) == ir_typeinfo_consistent);
1650         assert(fromtype);
1651
1652         while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1653                 totype   = get_pointer_points_to_type(totype);
1654                 fromtype = get_pointer_points_to_type(fromtype);
1655         }
1656
1657         assert(fromtype);
1658
1659         if (!is_Class_type(totype)) return 0;
1660         return is_SubClass_of(fromtype, totype);
1661 }
1662
1663 /* Checks for downcast.
1664  *
1665  * Returns true if the Cast node casts a class type to a sub type.
1666  */
1667 int is_Cast_downcast(ir_node *node) {
1668         ir_type *totype   = get_Cast_type(node);
1669         ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1670
1671         assert(get_irg_typeinfo_state(get_irn_irg(node)) == ir_typeinfo_consistent);
1672         assert(fromtype);
1673
1674         while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1675                 totype   = get_pointer_points_to_type(totype);
1676                 fromtype = get_pointer_points_to_type(fromtype);
1677         }
1678
1679         assert(fromtype);
1680
1681         if (!is_Class_type(totype)) return 0;
1682         return is_SubClass_of(totype, fromtype);
1683 }
1684
1685 int
1686 (is_unop)(const ir_node *node) {
1687         return _is_unop(node);
1688 }
1689
1690 ir_node *
1691 get_unop_op(const ir_node *node) {
1692         if (node->op->opar == oparity_unary)
1693                 return get_irn_n(node, node->op->op_index);
1694
1695         assert(node->op->opar == oparity_unary);
1696         return NULL;
1697 }
1698
1699 void
1700 set_unop_op(ir_node *node, ir_node *op) {
1701         if (node->op->opar == oparity_unary)
1702                 set_irn_n(node, node->op->op_index, op);
1703
1704         assert(node->op->opar == oparity_unary);
1705 }
1706
1707 int
1708 (is_binop)(const ir_node *node) {
1709         return _is_binop(node);
1710 }
1711
1712 ir_node *
1713 get_binop_left(const ir_node *node) {
1714         assert(node->op->opar == oparity_binary);
1715         return get_irn_n(node, node->op->op_index);
1716 }
1717
1718 void
1719 set_binop_left(ir_node *node, ir_node *left) {
1720         assert(node->op->opar == oparity_binary);
1721         set_irn_n(node, node->op->op_index, left);
1722 }
1723
1724 ir_node *
1725 get_binop_right(const ir_node *node) {
1726         assert(node->op->opar == oparity_binary);
1727         return get_irn_n(node, node->op->op_index + 1);
1728 }
1729
1730 void
1731 set_binop_right(ir_node *node, ir_node *right) {
1732         assert(node->op->opar == oparity_binary);
1733         set_irn_n(node, node->op->op_index + 1, right);
1734 }
1735
1736 int
1737 (is_Phi)(const ir_node *n) {
1738         return _is_Phi(n);
1739 }
1740
1741 int is_Phi0(const ir_node *n) {
1742         assert(n);
1743
1744         return ((get_irn_op(n) == op_Phi) &&
1745                 (get_irn_arity(n) == 0) &&
1746                 (get_irg_phase_state(get_irn_irg(n)) ==  phase_building));
1747 }
1748
1749 ir_node **
1750 get_Phi_preds_arr(ir_node *node) {
1751   assert(node->op == op_Phi);
1752   return (ir_node **)&(get_irn_in(node)[1]);
1753 }
1754
1755 int
1756 get_Phi_n_preds(const ir_node *node) {
1757         assert(is_Phi(node) || is_Phi0(node));
1758         return (get_irn_arity(node));
1759 }
1760
1761 /*
1762 void set_Phi_n_preds(ir_node *node, int n_preds) {
1763         assert(node->op == op_Phi);
1764 }
1765 */
1766
1767 ir_node *
1768 get_Phi_pred(const ir_node *node, int pos) {
1769         assert(is_Phi(node) || is_Phi0(node));
1770         return get_irn_n(node, pos);
1771 }
1772
1773 void
1774 set_Phi_pred(ir_node *node, int pos, ir_node *pred) {
1775         assert(is_Phi(node) || is_Phi0(node));
1776         set_irn_n(node, pos, pred);
1777 }
1778
1779 ir_node *(get_Phi_next)(const ir_node *phi) {
1780         return _get_Phi_next(phi);
1781 }
1782
1783 void (set_Phi_next)(ir_node *phi, ir_node *next) {
1784         _set_Phi_next(phi, next);
1785 }
1786
1787 int is_memop(const ir_node *node) {
1788         ir_opcode code = get_irn_opcode(node);
1789         return (code == iro_Load || code == iro_Store);
1790 }
1791
1792 ir_node *get_memop_mem(const ir_node *node) {
1793         assert(is_memop(node));
1794         return get_irn_n(node, 0);
1795 }
1796
1797 void set_memop_mem(ir_node *node, ir_node *mem) {
1798         assert(is_memop(node));
1799         set_irn_n(node, 0, mem);
1800 }
1801
1802 ir_node *get_memop_ptr(const ir_node *node) {
1803         assert(is_memop(node));
1804         return get_irn_n(node, 1);
1805 }
1806
1807 void set_memop_ptr(ir_node *node, ir_node *ptr) {
1808         assert(is_memop(node));
1809         set_irn_n(node, 1, ptr);
1810 }
1811
1812 ir_node *
1813 get_Load_mem(const ir_node *node) {
1814         assert(is_Load(node));
1815         return get_irn_n(node, 0);
1816 }
1817
1818 void
1819 set_Load_mem(ir_node *node, ir_node *mem) {
1820         assert(is_Load(node));
1821         set_irn_n(node, 0, mem);
1822 }
1823
1824 ir_node *
1825 get_Load_ptr(const ir_node *node) {
1826         assert(is_Load(node));
1827         return get_irn_n(node, 1);
1828 }
1829
1830 void
1831 set_Load_ptr(ir_node *node, ir_node *ptr) {
1832         assert(is_Load(node));
1833         set_irn_n(node, 1, ptr);
1834 }
1835
1836 ir_mode *
1837 get_Load_mode(const ir_node *node) {
1838         assert(is_Load(node));
1839         return node->attr.load.load_mode;
1840 }
1841
1842 void
1843 set_Load_mode(ir_node *node, ir_mode *mode) {
1844         assert(is_Load(node));
1845         node->attr.load.load_mode = mode;
1846 }
1847
1848 ir_volatility
1849 get_Load_volatility(const ir_node *node) {
1850         assert(is_Load(node));
1851         return node->attr.load.volatility;
1852 }
1853
1854 void
1855 set_Load_volatility(ir_node *node, ir_volatility volatility) {
1856         assert(is_Load(node));
1857         node->attr.load.volatility = volatility;
1858 }
1859
1860 ir_align
1861 get_Load_align(const ir_node *node) {
1862         assert(is_Load(node));
1863         return node->attr.load.aligned;
1864 }
1865
1866 void
1867 set_Load_align(ir_node *node, ir_align align) {
1868         assert(is_Load(node));
1869         node->attr.load.aligned = align;
1870 }
1871
1872
1873 ir_node *
1874 get_Store_mem(const ir_node *node) {
1875         assert(is_Store(node));
1876         return get_irn_n(node, 0);
1877 }
1878
1879 void
1880 set_Store_mem(ir_node *node, ir_node *mem) {
1881         assert(is_Store(node));
1882         set_irn_n(node, 0, mem);
1883 }
1884
1885 ir_node *
1886 get_Store_ptr(const ir_node *node) {
1887         assert(is_Store(node));
1888         return get_irn_n(node, 1);
1889 }
1890
1891 void
1892 set_Store_ptr(ir_node *node, ir_node *ptr) {
1893         assert(is_Store(node));
1894         set_irn_n(node, 1, ptr);
1895 }
1896
1897 ir_node *
1898 get_Store_value(const ir_node *node) {
1899         assert(is_Store(node));
1900         return get_irn_n(node, 2);
1901 }
1902
1903 void
1904 set_Store_value(ir_node *node, ir_node *value) {
1905         assert(is_Store(node));
1906         set_irn_n(node, 2, value);
1907 }
1908
1909 ir_volatility
1910 get_Store_volatility(const ir_node *node) {
1911         assert(is_Store(node));
1912         return node->attr.store.volatility;
1913 }
1914
1915 void
1916 set_Store_volatility(ir_node *node, ir_volatility volatility) {
1917         assert(is_Store(node));
1918         node->attr.store.volatility = volatility;
1919 }
1920
1921 ir_align
1922 get_Store_align(const ir_node *node) {
1923         assert(is_Store(node));
1924         return node->attr.store.aligned;
1925 }
1926
1927 void
1928 set_Store_align(ir_node *node, ir_align align) {
1929         assert(is_Store(node));
1930         node->attr.store.aligned = align;
1931 }
1932
1933
1934 ir_node *
1935 get_Alloc_mem(const ir_node *node) {
1936         assert(is_Alloc(node));
1937         return get_irn_n(node, 0);
1938 }
1939
1940 void
1941 set_Alloc_mem(ir_node *node, ir_node *mem) {
1942         assert(is_Alloc(node));
1943         set_irn_n(node, 0, mem);
1944 }
1945
1946 ir_node *
1947 get_Alloc_size(const ir_node *node) {
1948         assert(is_Alloc(node));
1949         return get_irn_n(node, 1);
1950 }
1951
1952 void
1953 set_Alloc_size(ir_node *node, ir_node *size) {
1954         assert(is_Alloc(node));
1955         set_irn_n(node, 1, size);
1956 }
1957
1958 ir_type *
1959 get_Alloc_type(ir_node *node) {
1960         assert(is_Alloc(node));
1961         return node->attr.alloc.type = skip_tid(node->attr.alloc.type);
1962 }
1963
1964 void
1965 set_Alloc_type(ir_node *node, ir_type *tp) {
1966         assert(is_Alloc(node));
1967         node->attr.alloc.type = tp;
1968 }
1969
1970 ir_where_alloc
1971 get_Alloc_where(const ir_node *node) {
1972         assert(is_Alloc(node));
1973         return node->attr.alloc.where;
1974 }
1975
1976 void
1977 set_Alloc_where(ir_node *node, ir_where_alloc where) {
1978         assert(is_Alloc(node));
1979         node->attr.alloc.where = where;
1980 }
1981
1982
1983 ir_node *
1984 get_Free_mem(const ir_node *node) {
1985         assert(is_Free(node));
1986         return get_irn_n(node, 0);
1987 }
1988
1989 void
1990 set_Free_mem(ir_node *node, ir_node *mem) {
1991         assert(is_Free(node));
1992         set_irn_n(node, 0, mem);
1993 }
1994
1995 ir_node *
1996 get_Free_ptr(const ir_node *node) {
1997         assert(is_Free(node));
1998         return get_irn_n(node, 1);
1999 }
2000
2001 void
2002 set_Free_ptr(ir_node *node, ir_node *ptr) {
2003         assert(is_Free(node));
2004         set_irn_n(node, 1, ptr);
2005 }
2006
2007 ir_node *
2008 get_Free_size(const ir_node *node) {
2009         assert(is_Free(node));
2010         return get_irn_n(node, 2);
2011 }
2012
2013 void
2014 set_Free_size(ir_node *node, ir_node *size) {
2015         assert(is_Free(node));
2016         set_irn_n(node, 2, size);
2017 }
2018
2019 ir_type *
2020 get_Free_type(ir_node *node) {
2021         assert(is_Free(node));
2022         return node->attr.free.type = skip_tid(node->attr.free.type);
2023 }
2024
2025 void
2026 set_Free_type(ir_node *node, ir_type *tp) {
2027         assert(is_Free(node));
2028         node->attr.free.type = tp;
2029 }
2030
2031 ir_where_alloc
2032 get_Free_where(const ir_node *node) {
2033         assert(is_Free(node));
2034         return node->attr.free.where;
2035 }
2036
2037 void
2038 set_Free_where(ir_node *node, ir_where_alloc where) {
2039         assert(is_Free(node));
2040         node->attr.free.where = where;
2041 }
2042
2043 ir_node **get_Sync_preds_arr(ir_node *node) {
2044         assert(is_Sync(node));
2045         return (ir_node **)&(get_irn_in(node)[1]);
2046 }
2047
2048 int get_Sync_n_preds(const ir_node *node) {
2049         assert(is_Sync(node));
2050         return (get_irn_arity(node));
2051 }
2052
2053 /*
2054 void set_Sync_n_preds(ir_node *node, int n_preds) {
2055         assert(is_Sync(node));
2056 }
2057 */
2058
2059 ir_node *get_Sync_pred(const ir_node *node, int pos) {
2060         assert(is_Sync(node));
2061         return get_irn_n(node, pos);
2062 }
2063
2064 void set_Sync_pred(ir_node *node, int pos, ir_node *pred) {
2065         assert(is_Sync(node));
2066         set_irn_n(node, pos, pred);
2067 }
2068
2069 /* Add a new Sync predecessor */
2070 void add_Sync_pred(ir_node *node, ir_node *pred) {
2071         assert(is_Sync(node));
2072         add_irn_n(node, pred);
2073 }
2074
2075 /* Returns the source language type of a Proj node. */
2076 ir_type *get_Proj_type(ir_node *n) {
2077         ir_type *tp   = firm_unknown_type;
2078         ir_node *pred = get_Proj_pred(n);
2079
2080         switch (get_irn_opcode(pred)) {
2081         case iro_Proj: {
2082                 ir_node *pred_pred;
2083                 /* Deal with Start / Call here: we need to know the Proj Nr. */
2084                 assert(get_irn_mode(pred) == mode_T);
2085                 pred_pred = get_Proj_pred(pred);
2086
2087                 if (is_Start(pred_pred))  {
2088                         ir_type *mtp = get_entity_type(get_irg_entity(get_irn_irg(pred_pred)));
2089                         tp = get_method_param_type(mtp, get_Proj_proj(n));
2090                 } else if (is_Call(pred_pred)) {
2091                         ir_type *mtp = get_Call_type(pred_pred);
2092                         tp = get_method_res_type(mtp, get_Proj_proj(n));
2093                 }
2094         } break;
2095         case iro_Start: break;
2096         case iro_Call: break;
2097         case iro_Load: {
2098                 ir_node *a = get_Load_ptr(pred);
2099                 if (is_Sel(a))
2100                         tp = get_entity_type(get_Sel_entity(a));
2101         } break;
2102         default:
2103                 break;
2104         }
2105         return tp;
2106 }
2107
2108 ir_node *
2109 get_Proj_pred(const ir_node *node) {
2110         assert(is_Proj(node));
2111         return get_irn_n(node, 0);
2112 }
2113
2114 void
2115 set_Proj_pred(ir_node *node, ir_node *pred) {
2116         assert(is_Proj(node));
2117         set_irn_n(node, 0, pred);
2118 }
2119
2120 long
2121 get_Proj_proj(const ir_node *node) {
2122 #ifdef INTERPROCEDURAL_VIEW
2123         ir_opcode code = get_irn_opcode(node);
2124
2125         if (code == iro_Proj) {
2126                 return node->attr.proj;
2127         }
2128         else {
2129                 assert(code == iro_Filter);
2130                 return node->attr.filter.proj;
2131         }
2132 #else
2133         assert(is_Proj(node));
2134         return node->attr.proj;
2135 #endif /* INTERPROCEDURAL_VIEW */
2136 }
2137
2138 void
2139 set_Proj_proj(ir_node *node, long proj) {
2140 #ifdef INTERPROCEDURAL_VIEW
2141         ir_opcode code = get_irn_opcode(node);
2142
2143         if (code == iro_Proj) {
2144                 node->attr.proj = proj;
2145         }
2146         else {
2147                 assert(code == iro_Filter);
2148                 node->attr.filter.proj = proj;
2149         }
2150 #else
2151         assert(is_Proj(node));
2152         node->attr.proj = proj;
2153 #endif /* INTERPROCEDURAL_VIEW */
2154 }
2155
2156 /* Returns non-zero if a node is a routine parameter. */
2157 int (is_arg_Proj)(const ir_node *node) {
2158         return _is_arg_Proj(node);
2159 }
2160
2161 ir_node **
2162 get_Tuple_preds_arr(ir_node *node) {
2163         assert(is_Tuple(node));
2164         return (ir_node **)&(get_irn_in(node)[1]);
2165 }
2166
2167 int
2168 get_Tuple_n_preds(const ir_node *node) {
2169         assert(is_Tuple(node));
2170         return get_irn_arity(node);
2171 }
2172
2173 /*
2174 void
2175 set_Tuple_n_preds(ir_node *node, int n_preds) {
2176         assert(is_Tuple(node));
2177 }
2178 */
2179
2180 ir_node *
2181 get_Tuple_pred(const ir_node *node, int pos) {
2182   assert(is_Tuple(node));
2183   return get_irn_n(node, pos);
2184 }
2185
2186 void
2187 set_Tuple_pred(ir_node *node, int pos, ir_node *pred) {
2188         assert(is_Tuple(node));
2189         set_irn_n(node, pos, pred);
2190 }
2191
2192 ir_node *
2193 get_Id_pred(const ir_node *node) {
2194         assert(is_Id(node));
2195         return get_irn_n(node, 0);
2196 }
2197
2198 void
2199 set_Id_pred(ir_node *node, ir_node *pred) {
2200         assert(is_Id(node));
2201         set_irn_n(node, 0, pred);
2202 }
2203
2204 ir_node *get_Confirm_value(const ir_node *node) {
2205         assert(is_Confirm(node));
2206         return get_irn_n(node, 0);
2207 }
2208
2209 void set_Confirm_value(ir_node *node, ir_node *value) {
2210         assert(is_Confirm(node));
2211         set_irn_n(node, 0, value);
2212 }
2213
2214 ir_node *get_Confirm_bound(const ir_node *node) {
2215         assert(is_Confirm(node));
2216         return get_irn_n(node, 1);
2217 }
2218
2219 void set_Confirm_bound(ir_node *node, ir_node *bound) {
2220         assert(is_Confirm(node));
2221         set_irn_n(node, 0, bound);
2222 }
2223
2224 pn_Cmp get_Confirm_cmp(const ir_node *node) {
2225         assert(is_Confirm(node));
2226         return node->attr.confirm.cmp;
2227 }
2228
2229 void set_Confirm_cmp(ir_node *node, pn_Cmp cmp) {
2230         assert(is_Confirm(node));
2231         node->attr.confirm.cmp = cmp;
2232 }
2233
2234 ir_node *
2235 get_Filter_pred(ir_node *node) {
2236         assert(is_Filter(node));
2237         return node->in[1];
2238 }
2239
2240 void
2241 set_Filter_pred(ir_node *node, ir_node *pred) {
2242         assert(is_Filter(node));
2243         node->in[1] = pred;
2244 }
2245
2246 long
2247 get_Filter_proj(ir_node *node) {
2248         assert(is_Filter(node));
2249         return node->attr.filter.proj;
2250 }
2251
2252 void
2253 set_Filter_proj(ir_node *node, long proj) {
2254         assert(is_Filter(node));
2255         node->attr.filter.proj = proj;
2256 }
2257
2258 /* Don't use get_irn_arity, get_irn_n in implementation as access
2259    shall work independent of view!!! */
2260 void set_Filter_cg_pred_arr(ir_node *node, int arity, ir_node ** in) {
2261         assert(is_Filter(node));
2262         if (node->attr.filter.in_cg == NULL || arity != ARR_LEN(node->attr.filter.in_cg) - 1) {
2263                 ir_graph *irg = get_irn_irg(node);
2264                 node->attr.filter.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
2265                 node->attr.filter.backedge = new_backedge_arr(irg->obst, arity);
2266                 node->attr.filter.in_cg[0] = node->in[0];
2267         }
2268         memcpy(node->attr.filter.in_cg + 1, in, sizeof(ir_node *) * arity);
2269 }
2270
2271 void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred) {
2272         assert(is_Filter(node) && node->attr.filter.in_cg &&
2273                0 <= pos && pos < ARR_LEN(node->attr.filter.in_cg) - 1);
2274         node->attr.filter.in_cg[pos + 1] = pred;
2275 }
2276
2277 int get_Filter_n_cg_preds(ir_node *node) {
2278         assert(is_Filter(node) && node->attr.filter.in_cg);
2279         return (ARR_LEN(node->attr.filter.in_cg) - 1);
2280 }
2281
2282 ir_node *get_Filter_cg_pred(ir_node *node, int pos) {
2283         int arity;
2284         assert(is_Filter(node) && node->attr.filter.in_cg &&
2285                0 <= pos);
2286         arity = ARR_LEN(node->attr.filter.in_cg);
2287         assert(pos < arity - 1);
2288         return node->attr.filter.in_cg[pos + 1];
2289 }
2290
2291 /* Mux support */
2292 ir_node *get_Mux_sel(const ir_node *node) {
2293         assert(is_Mux(node));
2294         return node->in[1];
2295 }
2296
2297 void set_Mux_sel(ir_node *node, ir_node *sel) {
2298         assert(is_Mux(node));
2299         node->in[1] = sel;
2300 }
2301
2302 ir_node *get_Mux_false(const ir_node *node) {
2303         assert(is_Mux(node));
2304         return node->in[2];
2305 }
2306
2307 void set_Mux_false(ir_node *node, ir_node *ir_false) {
2308         assert(is_Mux(node));
2309         node->in[2] = ir_false;
2310 }
2311
2312 ir_node *get_Mux_true(const ir_node *node) {
2313         assert(is_Mux(node));
2314         return node->in[3];
2315 }
2316
2317 void set_Mux_true(ir_node *node, ir_node *ir_true) {
2318         assert(is_Mux(node));
2319         node->in[3] = ir_true;
2320 }
2321
2322 /* CopyB support */
2323 ir_node *get_CopyB_mem(const ir_node *node) {
2324         assert(is_CopyB(node));
2325         return get_irn_n(node, 0);
2326 }
2327
2328 void set_CopyB_mem(ir_node *node, ir_node *mem) {
2329         assert(node->op == op_CopyB);
2330         set_irn_n(node, 0, mem);
2331 }
2332
2333 ir_node *get_CopyB_dst(const ir_node *node) {
2334         assert(is_CopyB(node));
2335         return get_irn_n(node, 1);
2336 }
2337
2338 void set_CopyB_dst(ir_node *node, ir_node *dst) {
2339         assert(is_CopyB(node));
2340         set_irn_n(node, 1, dst);
2341 }
2342
2343 ir_node *get_CopyB_src(const ir_node *node) {
2344   assert(is_CopyB(node));
2345   return get_irn_n(node, 2);
2346 }
2347
2348 void set_CopyB_src(ir_node *node, ir_node *src) {
2349         assert(is_CopyB(node));
2350         set_irn_n(node, 2, src);
2351 }
2352
2353 ir_type *get_CopyB_type(ir_node *node) {
2354         assert(is_CopyB(node));
2355         return node->attr.copyb.data_type = skip_tid(node->attr.copyb.data_type);
2356 }
2357
2358 void set_CopyB_type(ir_node *node, ir_type *data_type) {
2359         assert(is_CopyB(node) && data_type);
2360         node->attr.copyb.data_type = data_type;
2361 }
2362
2363
2364 ir_type *
2365 get_InstOf_type(ir_node *node) {
2366         assert(node->op == op_InstOf);
2367         return node->attr.instof.type = skip_tid(node->attr.instof.type);
2368 }
2369
2370 void
2371 set_InstOf_type(ir_node *node, ir_type *type) {
2372         assert(node->op == op_InstOf);
2373         node->attr.instof.type = type;
2374 }
2375
2376 ir_node *
2377 get_InstOf_store(const ir_node *node) {
2378         assert(node->op == op_InstOf);
2379         return get_irn_n(node, 0);
2380 }
2381
2382 void
2383 set_InstOf_store(ir_node *node, ir_node *obj) {
2384         assert(node->op == op_InstOf);
2385         set_irn_n(node, 0, obj);
2386 }
2387
2388 ir_node *
2389 get_InstOf_obj(const ir_node *node) {
2390         assert(node->op == op_InstOf);
2391         return get_irn_n(node, 1);
2392 }
2393
2394 void
2395 set_InstOf_obj(ir_node *node, ir_node *obj) {
2396         assert(node->op == op_InstOf);
2397         set_irn_n(node, 1, obj);
2398 }
2399
2400 /* Returns the memory input of a Raise operation. */
2401 ir_node *
2402 get_Raise_mem(const ir_node *node) {
2403         assert(is_Raise(node));
2404         return get_irn_n(node, 0);
2405 }
2406
2407 void
2408 set_Raise_mem(ir_node *node, ir_node *mem) {
2409         assert(is_Raise(node));
2410         set_irn_n(node, 0, mem);
2411 }
2412
2413 ir_node *
2414 get_Raise_exo_ptr(const ir_node *node) {
2415         assert(is_Raise(node));
2416         return get_irn_n(node, 1);
2417 }
2418
2419 void
2420 set_Raise_exo_ptr(ir_node *node, ir_node *exo_ptr) {
2421         assert(is_Raise(node));
2422         set_irn_n(node, 1, exo_ptr);
2423 }
2424
2425 /* Bound support */
2426
2427 /* Returns the memory input of a Bound operation. */
2428 ir_node *get_Bound_mem(const ir_node *bound) {
2429         assert(is_Bound(bound));
2430         return get_irn_n(bound, 0);
2431 }
2432
2433 void set_Bound_mem(ir_node *bound, ir_node *mem) {
2434         assert(is_Bound(bound));
2435         set_irn_n(bound, 0, mem);
2436 }
2437
2438 /* Returns the index input of a Bound operation. */
2439 ir_node *get_Bound_index(const ir_node *bound) {
2440         assert(is_Bound(bound));
2441         return get_irn_n(bound, 1);
2442 }
2443
2444 void set_Bound_index(ir_node *bound, ir_node *idx) {
2445         assert(is_Bound(bound));
2446         set_irn_n(bound, 1, idx);
2447 }
2448
2449 /* Returns the lower bound input of a Bound operation. */
2450 ir_node *get_Bound_lower(const ir_node *bound) {
2451         assert(is_Bound(bound));
2452         return get_irn_n(bound, 2);
2453 }
2454
2455 void set_Bound_lower(ir_node *bound, ir_node *lower) {
2456         assert(is_Bound(bound));
2457         set_irn_n(bound, 2, lower);
2458 }
2459
2460 /* Returns the upper bound input of a Bound operation. */
2461 ir_node *get_Bound_upper(const ir_node *bound) {
2462         assert(is_Bound(bound));
2463         return get_irn_n(bound, 3);
2464 }
2465
2466 void set_Bound_upper(ir_node *bound, ir_node *upper) {
2467         assert(is_Bound(bound));
2468         set_irn_n(bound, 3, upper);
2469 }
2470
2471 /* Return the operand of a Pin node. */
2472 ir_node *get_Pin_op(const ir_node *pin) {
2473         assert(is_Pin(pin));
2474         return get_irn_n(pin, 0);
2475 }
2476
2477 void set_Pin_op(ir_node *pin, ir_node *node) {
2478         assert(is_Pin(pin));
2479         set_irn_n(pin, 0, node);
2480 }
2481
2482 /* Return the assembler text of an ASM pseudo node. */
2483 ident *get_ASM_text(const ir_node *node) {
2484         assert(is_ASM(node));
2485         return node->attr.assem.asm_text;
2486 }
2487
2488 /* Return the number of input constraints for an ASM node. */
2489 int get_ASM_n_input_constraints(const ir_node *node) {
2490         assert(is_ASM(node));
2491         return ARR_LEN(node->attr.assem.inputs);
2492 }
2493
2494 /* Return the input constraints for an ASM node. This is a flexible array. */
2495 const ir_asm_constraint *get_ASM_input_constraints(const ir_node *node) {
2496         assert(is_ASM(node));
2497         return node->attr.assem.inputs;
2498 }
2499
2500 /* Return the number of output constraints for an ASM node.  */
2501 int get_ASM_n_output_constraints(const ir_node *node) {
2502         assert(is_ASM(node));
2503         return ARR_LEN(node->attr.assem.outputs);
2504 }
2505
2506 /* Return the output constraints for an ASM node. */
2507 const ir_asm_constraint *get_ASM_output_constraints(const ir_node *node) {
2508         assert(is_ASM(node));
2509         return node->attr.assem.outputs;
2510 }
2511
2512 /* Return the number of clobbered registers for an ASM node.  */
2513 int get_ASM_n_clobbers(const ir_node *node) {
2514         assert(is_ASM(node));
2515         return ARR_LEN(node->attr.assem.clobber);
2516 }
2517
2518 /* Return the list of clobbered registers for an ASM node. */
2519 ident **get_ASM_clobbers(const ir_node *node) {
2520         assert(is_ASM(node));
2521         return node->attr.assem.clobber;
2522 }
2523
2524 /* returns the graph of a node */
2525 ir_graph *
2526 get_irn_irg(const ir_node *node) {
2527         /*
2528          * Do not use get_nodes_Block() here, because this
2529          * will check the pinned state.
2530          * However even a 'wrong' block is always in the proper
2531          * irg.
2532          */
2533         if (! is_Block(node))
2534                 node = get_irn_n(node, -1);
2535         if (is_Bad(node))  /* sometimes bad is predecessor of nodes instead of block: in case of optimization */
2536                 node = get_irn_n(node, -1);
2537         assert(is_Block(node));
2538         return node->attr.block.irg;
2539 }
2540
2541
2542 /*----------------------------------------------------------------*/
2543 /*  Auxiliary routines                                            */
2544 /*----------------------------------------------------------------*/
2545
2546 ir_node *
2547 skip_Proj(ir_node *node) {
2548         /* don't assert node !!! */
2549         if (node == NULL)
2550                 return NULL;
2551
2552         if (is_Proj(node))
2553                 node = get_Proj_pred(node);
2554
2555         return node;
2556 }
2557
2558 const ir_node *
2559 skip_Proj_const(const ir_node *node) {
2560         /* don't assert node !!! */
2561         if (node == NULL)
2562                 return NULL;
2563
2564         if (is_Proj(node))
2565                 node = get_Proj_pred(node);
2566
2567         return node;
2568 }
2569
2570 ir_node *
2571 skip_Tuple(ir_node *node) {
2572   ir_node *pred;
2573   ir_op   *op;
2574
2575 restart:
2576         if (is_Proj(node)) {
2577             pred = get_Proj_pred(node);
2578             op   = get_irn_op(pred);
2579
2580                 /*
2581                  * Looks strange but calls get_irn_op() only once
2582                  * in most often cases.
2583                  */
2584                 if (op == op_Proj) { /* nested Tuple ? */
2585                     pred = skip_Tuple(pred);
2586
2587                         if (is_Tuple(pred)) {
2588                                 node = get_Tuple_pred(pred, get_Proj_proj(node));
2589                                 goto restart;
2590                         }
2591                 } else if (op == op_Tuple) {
2592                         node = get_Tuple_pred(pred, get_Proj_proj(node));
2593                         goto restart;
2594                 }
2595         }
2596         return node;
2597 }
2598
2599 /* returns operand of node if node is a Cast */
2600 ir_node *skip_Cast(ir_node *node) {
2601         if (is_Cast(node))
2602                 return get_Cast_op(node);
2603         return node;
2604 }
2605
2606 /* returns operand of node if node is a Cast */
2607 const ir_node *skip_Cast_const(const ir_node *node) {
2608         if (is_Cast(node))
2609                 return get_Cast_op(node);
2610         return node;
2611 }
2612
2613 /* returns operand of node if node is a Pin */
2614 ir_node *skip_Pin(ir_node *node) {
2615         if (is_Pin(node))
2616                 return get_Pin_op(node);
2617         return node;
2618 }
2619
2620 /* returns operand of node if node is a Confirm */
2621 ir_node *skip_Confirm(ir_node *node) {
2622         if (is_Confirm(node))
2623                 return get_Confirm_value(node);
2624         return node;
2625 }
2626
2627 /* skip all high-level ops */
2628 ir_node *skip_HighLevel_ops(ir_node *node) {
2629         while (is_op_highlevel(get_irn_op(node))) {
2630                 node = get_irn_n(node, 0);
2631         }
2632         return node;
2633 }
2634
2635
2636 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2637  * than any other approach, as Id chains are resolved and all point to the real node, or
2638  * all id's are self loops.
2639  *
2640  * Note: This function takes 10% of mostly ANY the compiler run, so it's
2641  * a little bit "hand optimized".
2642  *
2643  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2644  */
2645 ir_node *
2646 skip_Id(ir_node *node) {
2647         ir_node *pred;
2648         /* don't assert node !!! */
2649
2650         if (!node || (node->op != op_Id)) return node;
2651
2652         /* Don't use get_Id_pred():  We get into an endless loop for
2653            self-referencing Ids. */
2654         pred = node->in[0+1];
2655
2656         if (pred->op != op_Id) return pred;
2657
2658         if (node != pred) {  /* not a self referencing Id. Resolve Id chain. */
2659                 ir_node *rem_pred, *res;
2660
2661                 if (pred->op != op_Id) return pred; /* shortcut */
2662                 rem_pred = pred;
2663
2664                 assert(get_irn_arity (node) > 0);
2665
2666                 node->in[0+1] = node;   /* turn us into a self referencing Id:  shorten Id cycles. */
2667                 res = skip_Id(rem_pred);
2668                 if (res->op == op_Id) /* self-loop */ return node;
2669
2670                 node->in[0+1] = res;    /* Turn Id chain into Ids all referencing the chain end. */
2671                 return res;
2672         } else {
2673                 return node;
2674         }
2675 }
2676
2677 void skip_Id_and_store(ir_node **node) {
2678         ir_node *n = *node;
2679
2680         if (!n || (n->op != op_Id)) return;
2681
2682         /* Don't use get_Id_pred():  We get into an endless loop for
2683            self-referencing Ids. */
2684         *node = skip_Id(n);
2685 }
2686
2687 int
2688 (is_Bad)(const ir_node *node) {
2689         return _is_Bad(node);
2690 }
2691
2692 int
2693 (is_NoMem)(const ir_node *node) {
2694         return _is_NoMem(node);
2695 }
2696
2697 int
2698 (is_Minus)(const ir_node *node) {
2699         return _is_Minus(node);
2700 }
2701
2702 int
2703 (is_Abs)(const ir_node *node) {
2704         return _is_Abs(node);
2705 }
2706
2707 int
2708 (is_Mod)(const ir_node *node) {
2709         return _is_Mod(node);
2710 }
2711
2712 int
2713 (is_Div)(const ir_node *node) {
2714         return _is_Div(node);
2715 }
2716
2717 int
2718 (is_DivMod)(const ir_node *node) {
2719         return _is_DivMod(node);
2720 }
2721
2722 int
2723 (is_Quot)(const ir_node *node) {
2724         return _is_Quot(node);
2725 }
2726
2727 int
2728 (is_Add)(const ir_node *node) {
2729         return _is_Add(node);
2730 }
2731
2732 int
2733 (is_Carry)(const ir_node *node) {
2734         return _is_Carry(node);
2735 }
2736
2737 int
2738 (is_And)(const ir_node *node) {
2739         return _is_And(node);
2740 }
2741
2742 int
2743 (is_Or)(const ir_node *node) {
2744         return _is_Or(node);
2745 }
2746
2747 int
2748 (is_Eor)(const ir_node *node) {
2749         return _is_Eor(node);
2750 }
2751
2752 int
2753 (is_Sub)(const ir_node *node) {
2754         return _is_Sub(node);
2755 }
2756
2757 int
2758 (is_Shl)(const ir_node *node) {
2759         return _is_Shl(node);
2760 }
2761
2762 int
2763 (is_Shr)(const ir_node *node) {
2764         return _is_Shr(node);
2765 }
2766
2767 int
2768 (is_Shrs)(const ir_node *node) {
2769         return _is_Shrs(node);
2770 }
2771
2772 int
2773 (is_Rotl)(const ir_node *node) {
2774         return _is_Rotl(node);
2775 }
2776
2777 int
2778 (is_Not)(const ir_node *node) {
2779         return _is_Not(node);
2780 }
2781
2782 int
2783 (is_Id)(const ir_node *node) {
2784         return _is_Id(node);
2785 }
2786
2787 int
2788 (is_Tuple)(const ir_node *node) {
2789         return _is_Tuple(node);
2790 }
2791
2792 int
2793 (is_Bound)(const ir_node *node) {
2794         return _is_Bound(node);
2795 }
2796
2797 int
2798 (is_Start)(const ir_node *node) {
2799   return _is_Start(node);
2800 }
2801
2802 int
2803 (is_End)(const ir_node *node) {
2804         return _is_End(node);
2805 }
2806
2807 int
2808 (is_Const)(const ir_node *node) {
2809         return _is_Const(node);
2810 }
2811
2812 int
2813 (is_Conv)(const ir_node *node) {
2814         return _is_Conv(node);
2815 }
2816
2817 int
2818 (is_strictConv)(const ir_node *node) {
2819         return _is_strictConv(node);
2820 }
2821
2822 int
2823 (is_Cast)(const ir_node *node) {
2824         return _is_Cast(node);
2825 }
2826
2827 int
2828 (is_no_Block)(const ir_node *node) {
2829         return _is_no_Block(node);
2830 }
2831
2832 int
2833 (is_Block)(const ir_node *node) {
2834         return _is_Block(node);
2835 }
2836
2837 /* returns true if node is an Unknown node. */
2838 int
2839 (is_Unknown)(const ir_node *node) {
2840         return _is_Unknown(node);
2841 }
2842
2843 /* returns true if node is a Return node. */
2844 int
2845 (is_Return)(const ir_node *node) {
2846         return _is_Return(node);
2847 }
2848
2849 /* returns true if node is a Call node. */
2850 int
2851 (is_Call)(const ir_node *node) {
2852         return _is_Call(node);
2853 }
2854
2855 /* returns true if node is a Builtin node. */
2856 int
2857 (is_Builtin)(const ir_node *node) {
2858         return _is_Builtin(node);
2859 }
2860
2861 /* returns true if node is a CallBegin node. */
2862 int
2863 (is_CallBegin)(const ir_node *node) {
2864         return _is_CallBegin(node);
2865 }
2866
2867 /* returns true if node is a Sel node. */
2868 int
2869 (is_Sel)(const ir_node *node) {
2870         return _is_Sel(node);
2871 }
2872
2873 /* returns true if node is a Mux node. */
2874 int
2875 (is_Mux)(const ir_node *node) {
2876         return _is_Mux(node);
2877 }
2878
2879 /* returns true if node is a Load node. */
2880 int
2881 (is_Load)(const ir_node *node) {
2882         return _is_Load(node);
2883 }
2884
2885 /* returns true if node is a Load node. */
2886 int
2887 (is_Store)(const ir_node *node) {
2888         return _is_Store(node);
2889 }
2890
2891 /* returns true if node is a Sync node. */
2892 int
2893 (is_Sync)(const ir_node *node) {
2894         return _is_Sync(node);
2895 }
2896
2897 /* Returns true if node is a Confirm node. */
2898 int
2899 (is_Confirm)(const ir_node *node) {
2900         return _is_Confirm(node);
2901 }
2902
2903 /* Returns true if node is a Pin node. */
2904 int
2905 (is_Pin)(const ir_node *node) {
2906         return _is_Pin(node);
2907 }
2908
2909 /* Returns true if node is a SymConst node. */
2910 int
2911 (is_SymConst)(const ir_node *node) {
2912         return _is_SymConst(node);
2913 }
2914
2915 /* Returns true if node is a SymConst node with kind symconst_addr_ent. */
2916 int
2917 (is_SymConst_addr_ent)(const ir_node *node) {
2918         return _is_SymConst_addr_ent(node);
2919 }
2920
2921 /* Returns true if node is a Cond node. */
2922 int
2923 (is_Cond)(const ir_node *node) {
2924         return _is_Cond(node);
2925 }
2926
2927 int
2928 (is_CopyB)(const ir_node *node) {
2929         return _is_CopyB(node);
2930 }
2931
2932 /* returns true if node is a Cmp node. */
2933 int
2934 (is_Cmp)(const ir_node *node) {
2935         return _is_Cmp(node);
2936 }
2937
2938 /* returns true if node is an Alloc node. */
2939 int
2940 (is_Alloc)(const ir_node *node) {
2941         return _is_Alloc(node);
2942 }
2943
2944 /* returns true if node is a Free node. */
2945 int
2946 (is_Free)(const ir_node *node) {
2947         return _is_Free(node);
2948 }
2949
2950 /* returns true if a node is a Jmp node. */
2951 int
2952 (is_Jmp)(const ir_node *node) {
2953         return _is_Jmp(node);
2954 }
2955
2956 /* returns true if a node is a IJmp node. */
2957 int
2958 (is_IJmp)(const ir_node *node) {
2959         return _is_IJmp(node);
2960 }
2961
2962 /* returns true if a node is a Raise node. */
2963 int
2964 (is_Raise)(const ir_node *node) {
2965         return _is_Raise(node);
2966 }
2967
2968 /* returns true if a node is an ASM node. */
2969 int
2970 (is_ASM)(const ir_node *node) {
2971         return _is_ASM(node);
2972 }
2973
2974 /* returns true if a node is an Dummy node. */
2975 int
2976 (is_Dummy)(const ir_node *node) {
2977         return _is_Dummy(node);
2978 }
2979
2980 int
2981 (is_Proj)(const ir_node *node) {
2982         return _is_Proj(node);
2983 }
2984
2985 /* Returns true if node is a Filter node. */
2986 int
2987 (is_Filter)(const ir_node *node) {
2988         return _is_Filter(node);
2989 }
2990
2991 /* Returns true if the operation manipulates control flow. */
2992 int is_cfop(const ir_node *node) {
2993         return is_op_cfopcode(get_irn_op(node));
2994 }
2995
2996 /* Returns true if the operation manipulates interprocedural control flow:
2997    CallBegin, EndReg, EndExcept */
2998 int is_ip_cfop(const ir_node *node) {
2999         return is_ip_cfopcode(get_irn_op(node));
3000 }
3001
3002 /* Returns true if the operation can change the control flow because
3003    of an exception. */
3004 int
3005 is_fragile_op(const ir_node *node) {
3006         return is_op_fragile(get_irn_op(node));
3007 }
3008
3009 /* Returns the memory operand of fragile operations. */
3010 ir_node *get_fragile_op_mem(ir_node *node) {
3011         assert(node && is_fragile_op(node));
3012
3013         switch (get_irn_opcode(node)) {
3014         case iro_Call  :
3015         case iro_Quot  :
3016         case iro_DivMod:
3017         case iro_Div   :
3018         case iro_Mod   :
3019         case iro_Load  :
3020         case iro_Store :
3021         case iro_Alloc :
3022         case iro_Bound :
3023         case iro_CopyB :
3024                 return get_irn_n(node, pn_Generic_M_regular);
3025         case iro_Bad   :
3026         case iro_Unknown:
3027                 return node;
3028         default: ;
3029                 assert(0 && "should not be reached");
3030                 return NULL;
3031         }
3032 }
3033
3034 /* Returns the result mode of a Div operation. */
3035 ir_mode *get_divop_resmod(const ir_node *node) {
3036         switch (get_irn_opcode(node)) {
3037         case iro_Quot  : return get_Quot_resmode(node);
3038         case iro_DivMod: return get_DivMod_resmode(node);
3039         case iro_Div   : return get_Div_resmode(node);
3040         case iro_Mod   : return get_Mod_resmode(node);
3041         default: ;
3042                 assert(0 && "should not be reached");
3043                 return NULL;
3044         }
3045 }
3046
3047 /* Returns true if the operation is a forking control flow operation. */
3048 int (is_irn_forking)(const ir_node *node) {
3049         return _is_irn_forking(node);
3050 }
3051
3052 /* Return the type associated with the value produced by n
3053  * if the node remarks this type as it is the case for
3054  * Cast, Const, SymConst and some Proj nodes. */
3055 ir_type *(get_irn_type)(ir_node *node) {
3056         return _get_irn_type(node);
3057 }
3058
3059 /* Return the type attribute of a node n (SymConst, Call, Alloc, Free,
3060    Cast) or NULL.*/
3061 ir_type *(get_irn_type_attr)(ir_node *node) {
3062         return _get_irn_type_attr(node);
3063 }
3064
3065 /* Return the entity attribute of a node n (SymConst, Sel) or NULL. */
3066 ir_entity *(get_irn_entity_attr)(ir_node *node) {
3067         return _get_irn_entity_attr(node);
3068 }
3069
3070 /* Returns non-zero for constant-like nodes. */
3071 int (is_irn_constlike)(const ir_node *node) {
3072         return _is_irn_constlike(node);
3073 }
3074
3075 /*
3076  * Returns non-zero for nodes that are allowed to have keep-alives and
3077  * are neither Block nor PhiM.
3078  */
3079 int (is_irn_keep)(const ir_node *node) {
3080         return _is_irn_keep(node);
3081 }
3082
3083 /*
3084  * Returns non-zero for nodes that are always placed in the start block.
3085  */
3086 int (is_irn_start_block_placed)(const ir_node *node) {
3087         return _is_irn_start_block_placed(node);
3088 }
3089
3090 /* Returns non-zero for nodes that are machine operations. */
3091 int (is_irn_machine_op)(const ir_node *node) {
3092         return _is_irn_machine_op(node);
3093 }
3094
3095 /* Returns non-zero for nodes that are machine operands. */
3096 int (is_irn_machine_operand)(const ir_node *node) {
3097         return _is_irn_machine_operand(node);
3098 }
3099
3100 /* Returns non-zero for nodes that have the n'th user machine flag set. */
3101 int (is_irn_machine_user)(const ir_node *node, unsigned n) {
3102         return _is_irn_machine_user(node, n);
3103 }
3104
3105
3106 /* Gets the string representation of the jump prediction .*/
3107 const char *get_cond_jmp_predicate_name(cond_jmp_predicate pred) {
3108 #define X(a)    case a: return #a;
3109         switch (pred) {
3110                 X(COND_JMP_PRED_NONE);
3111                 X(COND_JMP_PRED_TRUE);
3112                 X(COND_JMP_PRED_FALSE);
3113         }
3114         return "<unknown>";
3115 #undef X
3116 }
3117
3118 /* Returns the conditional jump prediction of a Cond node. */
3119 cond_jmp_predicate (get_Cond_jmp_pred)(const ir_node *cond) {
3120         return _get_Cond_jmp_pred(cond);
3121 }
3122
3123 /* Sets a new conditional jump prediction. */
3124 void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) {
3125         _set_Cond_jmp_pred(cond, pred);
3126 }
3127
3128 /** the get_type operation must be always implemented and return a firm type */
3129 static ir_type *get_Default_type(ir_node *n) {
3130         (void) n;
3131         return get_unknown_type();
3132 }
3133
3134 /* Sets the get_type operation for an ir_op_ops. */
3135 ir_op_ops *firm_set_default_get_type(ir_opcode code, ir_op_ops *ops) {
3136         switch (code) {
3137         case iro_Const:    ops->get_type = get_Const_type; break;
3138         case iro_SymConst: ops->get_type = get_SymConst_value_type; break;
3139         case iro_Cast:     ops->get_type = get_Cast_type; break;
3140         case iro_Proj:     ops->get_type = get_Proj_type; break;
3141         default:
3142                 /* not allowed to be NULL */
3143                 if (! ops->get_type)
3144                         ops->get_type = get_Default_type;
3145                 break;
3146         }
3147         return ops;
3148 }
3149
3150 /** Return the attribute type of a SymConst node if exists */
3151 static ir_type *get_SymConst_attr_type(ir_node *self) {
3152         symconst_kind kind = get_SymConst_kind(self);
3153         if (SYMCONST_HAS_TYPE(kind))
3154                 return get_SymConst_type(self);
3155         return NULL;
3156 }
3157
3158 /** Return the attribute entity of a SymConst node if exists */
3159 static ir_entity *get_SymConst_attr_entity(ir_node *self) {
3160         symconst_kind kind = get_SymConst_kind(self);
3161         if (SYMCONST_HAS_ENT(kind))
3162                 return get_SymConst_entity(self);
3163         return NULL;
3164 }
3165
3166 /** the get_type_attr operation must be always implemented */
3167 static ir_type *get_Null_type(ir_node *n) {
3168         (void) n;
3169         return firm_unknown_type;
3170 }
3171
3172 /* Sets the get_type operation for an ir_op_ops. */
3173 ir_op_ops *firm_set_default_get_type_attr(ir_opcode code, ir_op_ops *ops) {
3174         switch (code) {
3175         case iro_SymConst: ops->get_type_attr = get_SymConst_attr_type; break;
3176         case iro_Call:     ops->get_type_attr = get_Call_type; break;
3177         case iro_Alloc:    ops->get_type_attr = get_Alloc_type; break;
3178         case iro_Free:     ops->get_type_attr = get_Free_type; break;
3179         case iro_Cast:     ops->get_type_attr = get_Cast_type; break;
3180         default:
3181                 /* not allowed to be NULL */
3182                 if (! ops->get_type_attr)
3183                         ops->get_type_attr = get_Null_type;
3184                 break;
3185         }
3186         return ops;
3187 }
3188
3189 /** the get_entity_attr operation must be always implemented */
3190 static ir_entity *get_Null_ent(ir_node *n) {
3191         (void) n;
3192         return NULL;
3193 }
3194
3195 /* Sets the get_type operation for an ir_op_ops. */
3196 ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops) {
3197         switch (code) {
3198         case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break;
3199         case iro_Sel:      ops->get_entity_attr = _get_Sel_entity; break;
3200         default:
3201                 /* not allowed to be NULL */
3202                 if (! ops->get_entity_attr)
3203                         ops->get_entity_attr = get_Null_ent;
3204                 break;
3205         }
3206         return ops;
3207 }
3208
3209 /* Sets the debug information of a node. */
3210 void (set_irn_dbg_info)(ir_node *n, dbg_info *db) {
3211         _set_irn_dbg_info(n, db);
3212 }
3213
3214 /**
3215  * Returns the debug information of an node.
3216  *
3217  * @param n   The node.
3218  */
3219 dbg_info *(get_irn_dbg_info)(const ir_node *n) {
3220         return _get_irn_dbg_info(n);
3221 }
3222
3223 #if 0 /* allow the global pointer */
3224
3225 /* checks whether a node represents a global address */
3226 int is_Global(const ir_node *node) {
3227         ir_node *ptr;
3228
3229         if (is_SymConst_addr_ent(node))
3230                 return 1;
3231         if (! is_Sel(node))
3232                 return 0;
3233
3234         ptr = get_Sel_ptr(node);
3235         return is_globals_pointer(ptr) != NULL;
3236 }
3237
3238 /* returns the entity of a global address */
3239 ir_entity *get_Global_entity(const ir_node *node) {
3240         if (is_SymConst(node))
3241                 return get_SymConst_entity(node);
3242         else
3243                 return get_Sel_entity(node);
3244 }
3245 #else
3246
3247 /* checks whether a node represents a global address */
3248 int is_Global(const ir_node *node) {
3249         return is_SymConst_addr_ent(node);
3250 }
3251
3252 /* returns the entity of a global address */
3253 ir_entity *get_Global_entity(const ir_node *node) {
3254         return get_SymConst_entity(node);
3255 }
3256 #endif
3257
3258 /*
3259  * Calculate a hash value of a node.
3260  */
3261 unsigned firm_default_hash(const ir_node *node) {
3262         unsigned h;
3263         int i, irn_arity;
3264
3265         /* hash table value = 9*(9*(9*(9*(9*arity+in[0])+in[1])+ ...)+mode)+code */
3266         h = irn_arity = get_irn_intra_arity(node);
3267
3268         /* consider all in nodes... except the block if not a control flow. */
3269         for (i = is_cfop(node) ? -1 : 0;  i < irn_arity;  ++i) {
3270                 h = 9*h + HASH_PTR(get_irn_intra_n(node, i));
3271         }
3272
3273         /* ...mode,... */
3274         h = 9*h + HASH_PTR(get_irn_mode(node));
3275         /* ...and code */
3276         h = 9*h + HASH_PTR(get_irn_op(node));
3277
3278         return h;
3279 }  /* firm_default_hash */