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