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