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