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