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