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