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