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