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