removed pn_Bound_M_except, Bound now have only one memory output
[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          && (SYMCONST_HAS_TYPE(get_SymConst_kind(node))));
1000   return node->attr.i.sym.type_p = skip_tid(node->attr.i.sym.type_p);
1001 }
1002
1003 void
1004 set_SymConst_type (ir_node *node, ir_type *tp) {
1005   assert(   (node->op == op_SymConst)
1006          && (SYMCONST_HAS_TYPE(get_SymConst_kind(node))));
1007   node->attr.i.sym.type_p = tp;
1008 }
1009
1010 ident *
1011 get_SymConst_name (ir_node *node) {
1012   assert (   (node->op == op_SymConst)
1013           && (get_SymConst_kind(node) == symconst_addr_name));
1014   return node->attr.i.sym.ident_p;
1015 }
1016
1017 void
1018 set_SymConst_name (ir_node *node, ident *name) {
1019   assert (   (node->op == op_SymConst)
1020           && (get_SymConst_kind(node) == symconst_addr_name));
1021   node->attr.i.sym.ident_p = name;
1022 }
1023
1024
1025 /* Only to access SymConst of kind symconst_addr_ent.  Else assertion: */
1026 entity   *get_SymConst_entity (ir_node *node) {
1027   assert (   (node->op == op_SymConst)
1028           && (get_SymConst_kind (node) == symconst_addr_ent));
1029   return node->attr.i.sym.entity_p;
1030 }
1031
1032 void     set_SymConst_entity (ir_node *node, entity *ent) {
1033   assert (   (node->op == op_SymConst)
1034           && (get_SymConst_kind(node) == symconst_addr_ent));
1035   node->attr.i.sym.entity_p  = ent;
1036 }
1037
1038 union symconst_symbol
1039 get_SymConst_symbol (ir_node *node) {
1040   assert (node->op == op_SymConst);
1041   return node->attr.i.sym;
1042 }
1043
1044 void
1045 set_SymConst_symbol (ir_node *node, union symconst_symbol sym) {
1046   assert (node->op == op_SymConst);
1047   //memcpy (&(node->attr.i.sym), sym, sizeof(type_or_id));
1048   node->attr.i.sym = sym;
1049 }
1050
1051 ir_type *
1052 get_SymConst_value_type (ir_node *node) {
1053   assert (node->op == op_SymConst);
1054   if (node->attr.i.tp) node->attr.i.tp = skip_tid(node->attr.i.tp);
1055   return node->attr.i.tp;
1056 }
1057
1058 void
1059 set_SymConst_value_type (ir_node *node, ir_type *tp) {
1060   assert (node->op == op_SymConst);
1061   node->attr.i.tp = tp;
1062 }
1063
1064 ir_node *
1065 get_Sel_mem (ir_node *node) {
1066   assert (node->op == op_Sel);
1067   return get_irn_n(node, 0);
1068 }
1069
1070 void
1071 set_Sel_mem (ir_node *node, ir_node *mem) {
1072   assert (node->op == op_Sel);
1073   set_irn_n(node, 0, mem);
1074 }
1075
1076 ir_node *
1077 get_Sel_ptr (ir_node *node) {
1078   assert (node->op == op_Sel);
1079   return get_irn_n(node, 1);
1080 }
1081
1082 void
1083 set_Sel_ptr (ir_node *node, ir_node *ptr) {
1084   assert (node->op == op_Sel);
1085   set_irn_n(node, 1, ptr);
1086 }
1087
1088 int
1089 get_Sel_n_indexs (ir_node *node) {
1090   assert (node->op == op_Sel);
1091   return (get_irn_arity(node) - SEL_INDEX_OFFSET);
1092 }
1093
1094 ir_node **
1095 get_Sel_index_arr (ir_node *node)
1096 {
1097   assert ((node->op == op_Sel));
1098   if (get_Sel_n_indexs(node) > 0)
1099     return (ir_node **)& get_irn_in(node)[SEL_INDEX_OFFSET + 1];
1100   else
1101     return NULL;
1102 }
1103
1104 ir_node *
1105 get_Sel_index (ir_node *node, int pos) {
1106   assert (node->op == op_Sel);
1107   return get_irn_n(node, pos + SEL_INDEX_OFFSET);
1108 }
1109
1110 void
1111 set_Sel_index (ir_node *node, int pos, ir_node *index) {
1112   assert (node->op == op_Sel);
1113   set_irn_n(node, pos + SEL_INDEX_OFFSET, index);
1114 }
1115
1116 entity *
1117 get_Sel_entity (ir_node *node) {
1118   assert (node->op == op_Sel);
1119   return node->attr.s.ent;
1120 }
1121
1122 void
1123 set_Sel_entity (ir_node *node, entity *ent) {
1124   assert (node->op == op_Sel);
1125   node->attr.s.ent = ent;
1126 }
1127
1128
1129 /* For unary and binary arithmetic operations the access to the
1130    operands can be factored out.  Left is the first, right the
1131    second arithmetic value  as listed in tech report 0999-33.
1132    unops are: Minus, Abs, Not, Conv, Cast
1133    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
1134    Shr, Shrs, Rotate, Cmp */
1135
1136
1137 ir_node *
1138 get_Call_mem (ir_node *node) {
1139   assert (node->op == op_Call);
1140   return get_irn_n(node, 0);
1141 }
1142
1143 void
1144 set_Call_mem (ir_node *node, ir_node *mem) {
1145   assert (node->op == op_Call);
1146   set_irn_n(node, 0, mem);
1147 }
1148
1149 ir_node *
1150 get_Call_ptr (ir_node *node) {
1151   assert (node->op == op_Call);
1152   return get_irn_n(node, 1);
1153 }
1154
1155 void
1156 set_Call_ptr (ir_node *node, ir_node *ptr) {
1157   assert (node->op == op_Call);
1158   set_irn_n(node, 1, ptr);
1159 }
1160
1161 ir_node **
1162 get_Call_param_arr (ir_node *node) {
1163   assert (node->op == op_Call);
1164   return (ir_node **)&get_irn_in(node)[CALL_PARAM_OFFSET + 1];
1165 }
1166
1167 int
1168 get_Call_n_params (ir_node *node)  {
1169   assert (node->op == op_Call);
1170   return (get_irn_arity(node) - CALL_PARAM_OFFSET);
1171 }
1172
1173 int
1174 get_Call_arity (ir_node *node) {
1175   assert (node->op == op_Call);
1176   return get_Call_n_params(node);
1177 }
1178
1179 /* void
1180 set_Call_arity (ir_node *node, ir_node *arity) {
1181   assert (node->op == op_Call);
1182 }
1183 */
1184
1185 ir_node *
1186 get_Call_param (ir_node *node, int pos) {
1187   assert (node->op == op_Call);
1188   return get_irn_n(node, pos + CALL_PARAM_OFFSET);
1189 }
1190
1191 void
1192 set_Call_param (ir_node *node, int pos, ir_node *param) {
1193   assert (node->op == op_Call);
1194   set_irn_n(node, pos + CALL_PARAM_OFFSET, param);
1195 }
1196
1197 ir_type *
1198 get_Call_type (ir_node *node) {
1199   assert (node->op == op_Call);
1200   return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
1201 }
1202
1203 void
1204 set_Call_type (ir_node *node, ir_type *tp) {
1205   assert (node->op == op_Call);
1206   assert ((get_unknown_type() == tp) || is_Method_type(tp));
1207   node->attr.call.cld_tp = tp;
1208 }
1209
1210 int Call_has_callees(ir_node *node) {
1211   assert(node && node->op == op_Call);
1212   return ((get_irg_callee_info_state(get_irn_irg(node)) != irg_callee_info_none) &&
1213       (node->attr.call.callee_arr != NULL));
1214 }
1215
1216 int get_Call_n_callees(ir_node * node) {
1217   assert(node && node->op == op_Call && node->attr.call.callee_arr);
1218   return ARR_LEN(node->attr.call.callee_arr);
1219 }
1220
1221 entity * get_Call_callee(ir_node * node, int pos) {
1222   assert(pos >= 0 && pos < get_Call_n_callees(node));
1223   return node->attr.call.callee_arr[pos];
1224 }
1225
1226 void set_Call_callee_arr(ir_node * node, const int n, entity ** arr) {
1227   assert(node->op == op_Call);
1228   if (node->attr.call.callee_arr == NULL || get_Call_n_callees(node) != n) {
1229     node->attr.call.callee_arr = NEW_ARR_D(entity *, current_ir_graph->obst, n);
1230   }
1231   memcpy(node->attr.call.callee_arr, arr, n * sizeof(entity *));
1232 }
1233
1234 void remove_Call_callee_arr(ir_node * node) {
1235   assert(node->op == op_Call);
1236   node->attr.call.callee_arr = NULL;
1237 }
1238
1239 ir_node * get_CallBegin_ptr (ir_node *node) {
1240   assert(node->op == op_CallBegin);
1241   return get_irn_n(node, 0);
1242 }
1243 void set_CallBegin_ptr (ir_node *node, ir_node *ptr) {
1244   assert(node->op == op_CallBegin);
1245   set_irn_n(node, 0, ptr);
1246 }
1247 ir_node * get_CallBegin_call (ir_node *node) {
1248   assert(node->op == op_CallBegin);
1249   return node->attr.callbegin.call;
1250 }
1251 void  set_CallBegin_call (ir_node *node, ir_node *call) {
1252   assert(node->op == op_CallBegin);
1253   node->attr.callbegin.call = call;
1254 }
1255
1256
1257 #define BINOP(OP)                   \
1258 ir_node * get_##OP##_left(ir_node *node) {      \
1259   assert(node->op == op_##OP);              \
1260   return get_irn_n(node, node->op->op_index);       \
1261 }                           \
1262 void set_##OP##_left(ir_node *node, ir_node *left) {    \
1263   assert(node->op == op_##OP);              \
1264   set_irn_n(node, node->op->op_index, left);        \
1265 }                           \
1266 ir_node *get_##OP##_right(ir_node *node) {      \
1267   assert(node->op == op_##OP);              \
1268   return get_irn_n(node, node->op->op_index + 1);   \
1269 }                           \
1270 void set_##OP##_right(ir_node *node, ir_node *right) {  \
1271   assert(node->op == op_##OP);              \
1272   set_irn_n(node, node->op->op_index + 1, right);   \
1273 }
1274
1275 #define UNOP(OP)                    \
1276 ir_node *get_##OP##_op(ir_node *node) {         \
1277   assert(node->op == op_##OP);              \
1278   return get_irn_n(node, node->op->op_index);       \
1279 }                           \
1280 void set_##OP##_op (ir_node *node, ir_node *op) {   \
1281   assert(node->op == op_##OP);              \
1282   set_irn_n(node, node->op->op_index, op);      \
1283 }
1284
1285 BINOP(Add)
1286 BINOP(Sub)
1287 UNOP(Minus)
1288 BINOP(Mul)
1289 BINOP(Quot)
1290
1291 ir_node *
1292 get_Quot_mem (ir_node *node) {
1293   assert (node->op == op_Quot);
1294   return get_irn_n(node, 0);
1295 }
1296
1297 void
1298 set_Quot_mem (ir_node *node, ir_node *mem) {
1299   assert (node->op == op_Quot);
1300   set_irn_n(node, 0, mem);
1301 }
1302
1303 BINOP(DivMod)
1304
1305 ir_node *
1306 get_DivMod_mem (ir_node *node) {
1307   assert (node->op == op_DivMod);
1308   return get_irn_n(node, 0);
1309 }
1310
1311 void
1312 set_DivMod_mem (ir_node *node, ir_node *mem) {
1313   assert (node->op == op_DivMod);
1314   set_irn_n(node, 0, mem);
1315 }
1316
1317 BINOP(Div)
1318
1319 ir_node *
1320 get_Div_mem (ir_node *node) {
1321   assert (node->op == op_Div);
1322   return get_irn_n(node, 0);
1323 }
1324
1325 void
1326 set_Div_mem (ir_node *node, ir_node *mem) {
1327   assert (node->op == op_Div);
1328   set_irn_n(node, 0, mem);
1329 }
1330
1331 BINOP(Mod)
1332
1333 ir_node *
1334 get_Mod_mem (ir_node *node) {
1335   assert (node->op == op_Mod);
1336   return get_irn_n(node, 0);
1337 }
1338
1339 void
1340 set_Mod_mem (ir_node *node, ir_node *mem) {
1341   assert (node->op == op_Mod);
1342   set_irn_n(node, 0, mem);
1343 }
1344
1345 UNOP(Abs)
1346 BINOP(And)
1347 BINOP(Or)
1348 BINOP(Eor)
1349 UNOP(Not)
1350 BINOP(Shl)
1351 BINOP(Shr)
1352 BINOP(Shrs)
1353 BINOP(Rot)
1354 BINOP(Cmp)
1355 UNOP(Conv)
1356 UNOP(Cast)
1357
1358 ir_type *
1359 get_Cast_type (ir_node *node) {
1360   assert (node->op == op_Cast);
1361   return node->attr.cast.totype;
1362 }
1363
1364 void
1365 set_Cast_type (ir_node *node, ir_type *to_tp) {
1366   assert (node->op == op_Cast);
1367   node->attr.cast.totype = to_tp;
1368 }
1369
1370
1371 /* Checks for upcast.
1372  *
1373  * Returns true if the Cast node casts a class type to a super type.
1374  */
1375 int is_Cast_upcast(ir_node *node) {
1376   ir_type *totype   = get_Cast_type(node);
1377   ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1378   ir_graph *myirg = get_irn_irg(node);
1379
1380   assert(get_irg_typeinfo_state(myirg) == ir_typeinfo_consistent);
1381   assert(fromtype);
1382
1383   while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1384     totype   = get_pointer_points_to_type(totype);
1385     fromtype = get_pointer_points_to_type(fromtype);
1386   }
1387
1388   assert(fromtype);
1389
1390   if (!is_Class_type(totype)) return 0;
1391   return is_SubClass_of(fromtype, totype);
1392 }
1393
1394 /* Checks for downcast.
1395  *
1396  * Returns true if the Cast node casts a class type to a sub type.
1397  */
1398 int is_Cast_downcast(ir_node *node) {
1399   ir_type *totype   = get_Cast_type(node);
1400   ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1401
1402   assert(get_irg_typeinfo_state(get_irn_irg(node)) == ir_typeinfo_consistent);
1403   assert(fromtype);
1404
1405   while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1406     totype   = get_pointer_points_to_type(totype);
1407     fromtype = get_pointer_points_to_type(fromtype);
1408   }
1409
1410   assert(fromtype);
1411
1412   if (!is_Class_type(totype)) return 0;
1413   return is_SubClass_of(totype, fromtype);
1414 }
1415
1416 int
1417 (is_unop)(const ir_node *node) {
1418   return _is_unop(node);
1419 }
1420
1421 ir_node *
1422 get_unop_op (ir_node *node) {
1423   if (node->op->opar == oparity_unary)
1424     return get_irn_n(node, node->op->op_index);
1425
1426   assert(node->op->opar == oparity_unary);
1427   return NULL;
1428 }
1429
1430 void
1431 set_unop_op (ir_node *node, ir_node *op) {
1432   if (node->op->opar == oparity_unary)
1433     set_irn_n(node, node->op->op_index, op);
1434
1435   assert(node->op->opar == oparity_unary);
1436 }
1437
1438 int
1439 (is_binop)(const ir_node *node) {
1440   return _is_binop(node);
1441 }
1442
1443 ir_node *
1444 get_binop_left (ir_node *node) {
1445   if (node->op->opar == oparity_binary)
1446     return get_irn_n(node, node->op->op_index);
1447
1448   assert(node->op->opar == oparity_binary);
1449   return NULL;
1450 }
1451
1452 void
1453 set_binop_left (ir_node *node, ir_node *left) {
1454   if (node->op->opar == oparity_binary)
1455     set_irn_n(node, node->op->op_index, left);
1456
1457   assert (node->op->opar == oparity_binary);
1458 }
1459
1460 ir_node *
1461 get_binop_right (ir_node *node) {
1462   if (node->op->opar == oparity_binary)
1463     return get_irn_n(node, node->op->op_index + 1);
1464
1465   assert(node->op->opar == oparity_binary);
1466   return NULL;
1467 }
1468
1469 void
1470 set_binop_right (ir_node *node, ir_node *right) {
1471   if (node->op->opar == oparity_binary)
1472     set_irn_n(node, node->op->op_index + 1, right);
1473
1474   assert (node->op->opar == oparity_binary);
1475 }
1476
1477 int is_Phi (const ir_node *n) {
1478   ir_op *op;
1479
1480   assert(n);
1481   op = get_irn_op(n);
1482
1483   if (op == op_Filter) return get_interprocedural_view();
1484
1485   if (op == op_Phi)
1486     return  ((get_irg_phase_state(get_irn_irg(n)) !=  phase_building) ||
1487          (get_irn_arity(n) > 0));
1488
1489   return 0;
1490 }
1491
1492 int is_Phi0 (const ir_node *n) {
1493   assert(n);
1494
1495   return ((get_irn_op(n) == op_Phi) &&
1496       (get_irn_arity(n) == 0) &&
1497       (get_irg_phase_state(get_irn_irg(n)) ==  phase_building));
1498 }
1499
1500 ir_node **
1501 get_Phi_preds_arr (ir_node *node) {
1502   assert (node->op == op_Phi);
1503   return (ir_node **)&(get_irn_in(node)[1]);
1504 }
1505
1506 int
1507 get_Phi_n_preds (ir_node *node) {
1508   assert (is_Phi(node) || is_Phi0(node));
1509   return (get_irn_arity(node));
1510 }
1511
1512 /*
1513 void set_Phi_n_preds (ir_node *node, int n_preds) {
1514   assert (node->op == op_Phi);
1515 }
1516 */
1517
1518 ir_node *
1519 get_Phi_pred (ir_node *node, int pos) {
1520   assert (is_Phi(node) || is_Phi0(node));
1521   return get_irn_n(node, pos);
1522 }
1523
1524 void
1525 set_Phi_pred (ir_node *node, int pos, ir_node *pred) {
1526   assert (is_Phi(node) || is_Phi0(node));
1527   set_irn_n(node, pos, pred);
1528 }
1529
1530
1531 int is_memop(ir_node *node) {
1532   return ((get_irn_op(node) == op_Load) || (get_irn_op(node) == op_Store));
1533 }
1534
1535 ir_node *get_memop_mem (ir_node *node) {
1536   assert(is_memop(node));
1537   return get_irn_n(node, 0);
1538 }
1539
1540 void     set_memop_mem (ir_node *node, ir_node *mem) {
1541   assert(is_memop(node));
1542   set_irn_n(node, 0, mem);
1543 }
1544
1545 ir_node *get_memop_ptr (ir_node *node) {
1546   assert(is_memop(node));
1547   return get_irn_n(node, 1);
1548 }
1549
1550 void     set_memop_ptr (ir_node *node, ir_node *ptr) {
1551   assert(is_memop(node));
1552   set_irn_n(node, 1, ptr);
1553 }
1554
1555 ir_node *
1556 get_Load_mem (ir_node *node) {
1557   assert (node->op == op_Load);
1558   return get_irn_n(node, 0);
1559 }
1560
1561 void
1562 set_Load_mem (ir_node *node, ir_node *mem) {
1563   assert (node->op == op_Load);
1564   set_irn_n(node, 0, mem);
1565 }
1566
1567 ir_node *
1568 get_Load_ptr (ir_node *node) {
1569   assert (node->op == op_Load);
1570   return get_irn_n(node, 1);
1571 }
1572
1573 void
1574 set_Load_ptr (ir_node *node, ir_node *ptr) {
1575   assert (node->op == op_Load);
1576   set_irn_n(node, 1, ptr);
1577 }
1578
1579 ir_mode *
1580 get_Load_mode (ir_node *node) {
1581   assert (node->op == op_Load);
1582   return node->attr.load.load_mode;
1583 }
1584
1585 void
1586 set_Load_mode (ir_node *node, ir_mode *mode) {
1587   assert (node->op == op_Load);
1588   node->attr.load.load_mode = mode;
1589 }
1590
1591 ent_volatility
1592 get_Load_volatility (ir_node *node) {
1593   assert (node->op == op_Load);
1594   return node->attr.load.volatility;
1595 }
1596
1597 void
1598 set_Load_volatility (ir_node *node, ent_volatility volatility) {
1599   assert (node->op == op_Load);
1600   node->attr.load.volatility = volatility;
1601 }
1602
1603
1604 ir_node *
1605 get_Store_mem (ir_node *node) {
1606   assert (node->op == op_Store);
1607   return get_irn_n(node, 0);
1608 }
1609
1610 void
1611 set_Store_mem (ir_node *node, ir_node *mem) {
1612   assert (node->op == op_Store);
1613   set_irn_n(node, 0, mem);
1614 }
1615
1616 ir_node *
1617 get_Store_ptr (ir_node *node) {
1618   assert (node->op == op_Store);
1619   return get_irn_n(node, 1);
1620 }
1621
1622 void
1623 set_Store_ptr (ir_node *node, ir_node *ptr) {
1624   assert (node->op == op_Store);
1625   set_irn_n(node, 1, ptr);
1626 }
1627
1628 ir_node *
1629 get_Store_value (ir_node *node) {
1630   assert (node->op == op_Store);
1631   return get_irn_n(node, 2);
1632 }
1633
1634 void
1635 set_Store_value (ir_node *node, ir_node *value) {
1636   assert (node->op == op_Store);
1637   set_irn_n(node, 2, value);
1638 }
1639
1640 ent_volatility
1641 get_Store_volatility (ir_node *node) {
1642   assert (node->op == op_Store);
1643   return node->attr.store.volatility;
1644 }
1645
1646 void
1647 set_Store_volatility (ir_node *node, ent_volatility volatility) {
1648   assert (node->op == op_Store);
1649   node->attr.store.volatility = volatility;
1650 }
1651
1652
1653 ir_node *
1654 get_Alloc_mem (ir_node *node) {
1655   assert (node->op == op_Alloc);
1656   return get_irn_n(node, 0);
1657 }
1658
1659 void
1660 set_Alloc_mem (ir_node *node, ir_node *mem) {
1661   assert (node->op == op_Alloc);
1662   set_irn_n(node, 0, mem);
1663 }
1664
1665 ir_node *
1666 get_Alloc_size (ir_node *node) {
1667   assert (node->op == op_Alloc);
1668   return get_irn_n(node, 1);
1669 }
1670
1671 void
1672 set_Alloc_size (ir_node *node, ir_node *size) {
1673   assert (node->op == op_Alloc);
1674   set_irn_n(node, 1, size);
1675 }
1676
1677 ir_type  *
1678 get_Alloc_type (ir_node *node) {
1679   assert (node->op == op_Alloc);
1680   return node->attr.a.type = skip_tid(node->attr.a.type);
1681 }
1682
1683 void
1684 set_Alloc_type (ir_node *node, ir_type *tp) {
1685   assert (node->op == op_Alloc);
1686   node->attr.a.type = tp;
1687 }
1688
1689 where_alloc
1690 get_Alloc_where (ir_node *node) {
1691   assert (node->op == op_Alloc);
1692   return node->attr.a.where;
1693 }
1694
1695 void
1696 set_Alloc_where (ir_node *node, where_alloc where) {
1697   assert (node->op == op_Alloc);
1698   node->attr.a.where = where;
1699 }
1700
1701
1702 ir_node *
1703 get_Free_mem (ir_node *node) {
1704   assert (node->op == op_Free);
1705   return get_irn_n(node, 0);
1706 }
1707
1708 void
1709 set_Free_mem (ir_node *node, ir_node *mem) {
1710   assert (node->op == op_Free);
1711   set_irn_n(node, 0, mem);
1712 }
1713
1714 ir_node *
1715 get_Free_ptr (ir_node *node) {
1716   assert (node->op == op_Free);
1717   return get_irn_n(node, 1);
1718 }
1719
1720 void
1721 set_Free_ptr (ir_node *node, ir_node *ptr) {
1722   assert (node->op == op_Free);
1723   set_irn_n(node, 1, ptr);
1724 }
1725
1726 ir_node *
1727 get_Free_size (ir_node *node) {
1728   assert (node->op == op_Free);
1729   return get_irn_n(node, 2);
1730 }
1731
1732 void
1733 set_Free_size (ir_node *node, ir_node *size) {
1734   assert (node->op == op_Free);
1735   set_irn_n(node, 2, size);
1736 }
1737
1738 ir_type *
1739 get_Free_type (ir_node *node) {
1740   assert (node->op == op_Free);
1741   return node->attr.f.type = skip_tid(node->attr.f.type);
1742 }
1743
1744 void
1745 set_Free_type (ir_node *node, ir_type *tp) {
1746   assert (node->op == op_Free);
1747   node->attr.f.type = tp;
1748 }
1749
1750 where_alloc
1751 get_Free_where (ir_node *node) {
1752   assert (node->op == op_Free);
1753   return node->attr.f.where;
1754 }
1755
1756 void
1757 set_Free_where (ir_node *node, where_alloc where) {
1758   assert (node->op == op_Free);
1759   node->attr.f.where = where;
1760 }
1761
1762 ir_node **get_Sync_preds_arr (ir_node *node) {
1763   assert (node->op == op_Sync);
1764   return (ir_node **)&(get_irn_in(node)[1]);
1765 }
1766
1767 int get_Sync_n_preds (ir_node *node) {
1768   assert(node->op == op_Sync);
1769   return (get_irn_arity(node));
1770 }
1771
1772 /*
1773 void set_Sync_n_preds (ir_node *node, int n_preds) {
1774   assert (node->op == op_Sync);
1775 }
1776 */
1777
1778 ir_node *get_Sync_pred (ir_node *node, int pos) {
1779   assert(node->op == op_Sync);
1780   return get_irn_n(node, pos);
1781 }
1782
1783 void set_Sync_pred (ir_node *node, int pos, ir_node *pred) {
1784   assert(node->op == op_Sync);
1785   set_irn_n(node, pos, pred);
1786 }
1787
1788 /* Add a new Sync predecessor */
1789 void add_Sync_pred (ir_node *node, ir_node *pred) {
1790   int l;
1791   ir_graph *irg = get_irn_irg(node);
1792
1793   assert(node->op == op_Sync);
1794   l = ARR_LEN(node->in);
1795   ARR_APP1(ir_node *, node->in, pred);
1796   edges_notify_edge(node, l, node->in[l], NULL, irg);
1797 }
1798
1799 ir_type *get_Proj_type(ir_node *n)
1800 {
1801   ir_type *tp   = NULL;
1802   ir_node *pred = get_Proj_pred(n);
1803
1804   switch (get_irn_opcode(pred)) {
1805   case iro_Proj: {
1806     ir_node *pred_pred;
1807     /* Deal with Start / Call here: we need to know the Proj Nr. */
1808     assert(get_irn_mode(pred) == mode_T);
1809     pred_pred = get_Proj_pred(pred);
1810     if (get_irn_op(pred_pred) == op_Start)  {
1811       ir_type *mtp = get_entity_type(get_irg_entity(get_irn_irg(pred_pred)));
1812       tp = get_method_param_type(mtp, get_Proj_proj(n));
1813     } else if (get_irn_op(pred_pred) == op_Call) {
1814       ir_type *mtp = get_Call_type(pred_pred);
1815       tp = get_method_res_type(mtp, get_Proj_proj(n));
1816     }
1817   } break;
1818   case iro_Start: break;
1819   case iro_Call: break;
1820   case iro_Load: {
1821     ir_node *a = get_Load_ptr(pred);
1822     if (is_Sel(a))
1823       tp = get_entity_type(get_Sel_entity(a));
1824   } break;
1825   default:
1826     break;
1827   }
1828   return tp;
1829 }
1830
1831 ir_node *
1832 get_Proj_pred (const ir_node *node) {
1833   assert (is_Proj(node));
1834   return get_irn_n(node, 0);
1835 }
1836
1837 void
1838 set_Proj_pred (ir_node *node, ir_node *pred) {
1839   assert (is_Proj(node));
1840   set_irn_n(node, 0, pred);
1841 }
1842
1843 long
1844 get_Proj_proj (const ir_node *node) {
1845   assert (is_Proj(node));
1846   if (get_irn_opcode(node) == iro_Proj) {
1847     return node->attr.proj;
1848   } else {
1849     assert(get_irn_opcode(node) == iro_Filter);
1850     return node->attr.filter.proj;
1851   }
1852 }
1853
1854 void
1855 set_Proj_proj (ir_node *node, long proj) {
1856   assert (node->op == op_Proj);
1857   node->attr.proj = proj;
1858 }
1859
1860 ir_node **
1861 get_Tuple_preds_arr (ir_node *node) {
1862   assert (node->op == op_Tuple);
1863   return (ir_node **)&(get_irn_in(node)[1]);
1864 }
1865
1866 int
1867 get_Tuple_n_preds (ir_node *node) {
1868   assert (node->op == op_Tuple);
1869   return (get_irn_arity(node));
1870 }
1871
1872 /*
1873 void
1874 set_Tuple_n_preds (ir_node *node, int n_preds) {
1875   assert (node->op == op_Tuple);
1876 }
1877 */
1878
1879 ir_node *
1880 get_Tuple_pred (ir_node *node, int pos) {
1881   assert (node->op == op_Tuple);
1882   return get_irn_n(node, pos);
1883 }
1884
1885 void
1886 set_Tuple_pred (ir_node *node, int pos, ir_node *pred) {
1887   assert (node->op == op_Tuple);
1888   set_irn_n(node, pos, pred);
1889 }
1890
1891 ir_node *
1892 get_Id_pred (ir_node *node) {
1893   assert (node->op == op_Id);
1894   return get_irn_n(node, 0);
1895 }
1896
1897 void
1898 set_Id_pred (ir_node *node, ir_node *pred) {
1899   assert (node->op == op_Id);
1900   set_irn_n(node, 0, pred);
1901 }
1902
1903 ir_node *get_Confirm_value (ir_node *node) {
1904   assert (node->op == op_Confirm);
1905   return get_irn_n(node, 0);
1906 }
1907 void     set_Confirm_value (ir_node *node, ir_node *value) {
1908   assert (node->op == op_Confirm);
1909   set_irn_n(node, 0, value);
1910 }
1911 ir_node *get_Confirm_bound (ir_node *node) {
1912   assert (node->op == op_Confirm);
1913   return get_irn_n(node, 1);
1914 }
1915 void     set_Confirm_bound (ir_node *node, ir_node *bound) {
1916   assert (node->op == op_Confirm);
1917   set_irn_n(node, 0, bound);
1918 }
1919 pn_Cmp   get_Confirm_cmp   (ir_node *node) {
1920   assert (node->op == op_Confirm);
1921   return node->attr.confirm_cmp;
1922 }
1923 void     set_Confirm_cmp   (ir_node *node, pn_Cmp cmp) {
1924   assert (node->op == op_Confirm);
1925   node->attr.confirm_cmp = cmp;
1926 }
1927
1928
1929 ir_node *
1930 get_Filter_pred (ir_node *node) {
1931   assert(node->op == op_Filter);
1932   return node->in[1];
1933 }
1934 void
1935 set_Filter_pred (ir_node *node, ir_node *pred) {
1936   assert(node->op == op_Filter);
1937   node->in[1] = pred;
1938 }
1939 long
1940 get_Filter_proj(ir_node *node) {
1941   assert(node->op == op_Filter);
1942   return node->attr.filter.proj;
1943 }
1944 void
1945 set_Filter_proj (ir_node *node, long proj) {
1946   assert(node->op == op_Filter);
1947   node->attr.filter.proj = proj;
1948 }
1949
1950 /* Don't use get_irn_arity, get_irn_n in implementation as access
1951    shall work independent of view!!! */
1952 void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in) {
1953   assert(node->op == op_Filter);
1954   if (node->attr.filter.in_cg == NULL || arity != ARR_LEN(node->attr.filter.in_cg) - 1) {
1955     node->attr.filter.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
1956     node->attr.filter.backedge = NEW_ARR_D (int, current_ir_graph->obst, arity);
1957     memset(node->attr.filter.backedge, 0, sizeof(int) * arity);
1958     node->attr.filter.in_cg[0] = node->in[0];
1959   }
1960   memcpy(node->attr.filter.in_cg + 1, in, sizeof(ir_node *) * arity);
1961 }
1962
1963 void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred) {
1964   assert(node->op == op_Filter && node->attr.filter.in_cg &&
1965      0 <= pos && pos < ARR_LEN(node->attr.filter.in_cg) - 1);
1966   node->attr.filter.in_cg[pos + 1] = pred;
1967 }
1968 int get_Filter_n_cg_preds(ir_node *node) {
1969   assert(node->op == op_Filter && node->attr.filter.in_cg);
1970   return (ARR_LEN(node->attr.filter.in_cg) - 1);
1971 }
1972 ir_node *get_Filter_cg_pred(ir_node *node, int pos) {
1973   int arity;
1974   assert(node->op == op_Filter && node->attr.filter.in_cg &&
1975      0 <= pos);
1976   arity = ARR_LEN(node->attr.filter.in_cg);
1977   assert(pos <  arity - 1);
1978   return node->attr.filter.in_cg[pos + 1];
1979 }
1980
1981 /* Mux support */
1982 ir_node *get_Mux_sel   (ir_node *node) {
1983   if (node->op == op_Psi) {
1984     assert(get_irn_arity(node) == 3);
1985     return get_Psi_cond(node, 0);
1986   }
1987   assert(node->op == op_Mux);
1988   return node->in[1];
1989 }
1990 void     set_Mux_sel   (ir_node *node, ir_node *sel) {
1991   if (node->op == op_Psi) {
1992     assert(get_irn_arity(node) == 3);
1993     set_Psi_cond(node, 0, sel);
1994   }
1995   else {
1996     assert(node->op == op_Mux);
1997     node->in[1] = sel;
1998   }
1999 }
2000
2001 ir_node *get_Mux_false (ir_node *node) {
2002   if (node->op == op_Psi) {
2003     assert(get_irn_arity(node) == 3);
2004     return get_Psi_default(node);
2005   }
2006   assert(node->op == op_Mux);
2007   return node->in[2];
2008 }
2009 void     set_Mux_false (ir_node *node, ir_node *ir_false) {
2010   if (node->op == op_Psi) {
2011     assert(get_irn_arity(node) == 3);
2012     set_Psi_default(node, ir_false);
2013   }
2014   else {
2015     assert(node->op == op_Mux);
2016     node->in[2] = ir_false;
2017   }
2018 }
2019
2020 ir_node *get_Mux_true  (ir_node *node) {
2021   if (node->op == op_Psi) {
2022     assert(get_irn_arity(node) == 3);
2023     return get_Psi_val(node, 0);
2024   }
2025   assert(node->op == op_Mux);
2026   return node->in[3];
2027 }
2028 void     set_Mux_true  (ir_node *node, ir_node *ir_true) {
2029   if (node->op == op_Psi) {
2030     assert(get_irn_arity(node) == 3);
2031     set_Psi_val(node, 0, ir_true);
2032   }
2033   else {
2034     assert(node->op == op_Mux);
2035     node->in[3] = ir_true;
2036   }
2037 }
2038
2039 /* Psi support */
2040 ir_node *get_Psi_cond   (ir_node *node, int pos) {
2041   int num_conds = get_Psi_n_conds(node);
2042   assert(node->op == op_Psi);
2043   assert(pos < num_conds);
2044         return get_irn_n(node, 2 * pos);
2045 }
2046
2047 void     set_Psi_cond   (ir_node *node, int pos, ir_node *cond) {
2048   int num_conds = get_Psi_n_conds(node);
2049   assert(node->op == op_Psi);
2050   assert(pos < num_conds);
2051         set_irn_n(node, 2 * pos, cond);
2052 }
2053
2054 ir_node *get_Psi_val    (ir_node *node, int pos) {
2055   int num_vals = get_Psi_n_conds(node);
2056   assert(node->op == op_Psi);
2057   assert(pos < num_vals);
2058         return get_irn_n(node, 2 * pos + 1);
2059 }
2060
2061 void     set_Psi_val    (ir_node *node, int pos, ir_node *val) {
2062   int num_vals = get_Psi_n_conds(node);
2063   assert(node->op == op_Psi);
2064   assert(pos < num_vals);
2065         set_irn_n(node, 2 * pos + 1, val);
2066 }
2067
2068 ir_node *get_Psi_default(ir_node *node) {
2069   int def_pos = get_irn_arity(node) - 1;
2070   assert(node->op == op_Psi);
2071         return get_irn_n(node, def_pos);
2072 }
2073
2074 void     set_Psi_default(ir_node *node, ir_node *val) {
2075   int def_pos = get_irn_arity(node);
2076   assert(node->op == op_Psi);
2077         set_irn_n(node, def_pos, val);
2078 }
2079
2080 int (get_Psi_n_conds)(ir_node *node) {
2081   return _get_Psi_n_conds(node);
2082 }
2083
2084 /* CopyB support */
2085 ir_node *get_CopyB_mem (ir_node *node) {
2086   assert (node->op == op_CopyB);
2087   return get_irn_n(node, 0);
2088 }
2089
2090 void     set_CopyB_mem (ir_node *node, ir_node *mem) {
2091   assert (node->op == op_CopyB);
2092   set_irn_n(node, 0, mem);
2093 }
2094
2095 ir_node *get_CopyB_dst (ir_node *node) {
2096   assert (node->op == op_CopyB);
2097   return get_irn_n(node, 1);
2098 }
2099
2100 void     set_CopyB_dst (ir_node *node, ir_node *dst) {
2101   assert (node->op == op_CopyB);
2102   set_irn_n(node, 1, dst);
2103 }
2104
2105 ir_node *get_CopyB_src (ir_node *node) {
2106   assert (node->op == op_CopyB);
2107   return get_irn_n(node, 2);
2108 }
2109
2110 void     set_CopyB_src (ir_node *node, ir_node *src) {
2111   assert (node->op == op_CopyB);
2112   set_irn_n(node, 2, src);
2113 }
2114
2115 ir_type *get_CopyB_type(ir_node *node) {
2116   assert (node->op == op_CopyB);
2117   return node->attr.copyb.data_type;
2118 }
2119
2120 void     set_CopyB_type(ir_node *node, ir_type *data_type) {
2121   assert (node->op == op_CopyB && data_type);
2122   node->attr.copyb.data_type = data_type;
2123 }
2124
2125
2126 ir_type *
2127 get_InstOf_type (ir_node *node) {
2128   assert (node->op = op_InstOf);
2129   return node->attr.io.type;
2130 }
2131
2132 void
2133 set_InstOf_type (ir_node *node, ir_type *type) {
2134   assert (node->op = op_InstOf);
2135   node->attr.io.type = type;
2136 }
2137
2138 ir_node *
2139 get_InstOf_store (ir_node *node) {
2140   assert (node->op = op_InstOf);
2141   return get_irn_n(node, 0);
2142 }
2143
2144 void
2145 set_InstOf_store (ir_node *node, ir_node *obj) {
2146   assert (node->op = op_InstOf);
2147   set_irn_n(node, 0, obj);
2148 }
2149
2150 ir_node *
2151 get_InstOf_obj (ir_node *node) {
2152   assert (node->op = op_InstOf);
2153   return get_irn_n(node, 1);
2154 }
2155
2156 void
2157 set_InstOf_obj (ir_node *node, ir_node *obj) {
2158   assert (node->op = op_InstOf);
2159   set_irn_n(node, 1, obj);
2160 }
2161
2162 /* Returns the memory input of a Raise operation. */
2163 ir_node *
2164 get_Raise_mem (ir_node *node) {
2165   assert (node->op == op_Raise);
2166   return get_irn_n(node, 0);
2167 }
2168
2169 void
2170 set_Raise_mem (ir_node *node, ir_node *mem) {
2171   assert (node->op == op_Raise);
2172   set_irn_n(node, 0, mem);
2173 }
2174
2175 ir_node *
2176 get_Raise_exo_ptr (ir_node *node) {
2177   assert (node->op == op_Raise);
2178   return get_irn_n(node, 1);
2179 }
2180
2181 void
2182 set_Raise_exo_ptr (ir_node *node, ir_node *exo_ptr) {
2183   assert (node->op == op_Raise);
2184   set_irn_n(node, 1, exo_ptr);
2185 }
2186
2187 /* Bound support */
2188
2189 /* Returns the memory input of a Bound operation. */
2190 ir_node *get_Bound_mem(ir_node *bound) {
2191   assert (bound->op == op_Bound);
2192   return get_irn_n(bound, 0);
2193 }
2194
2195 void     set_Bound_mem (ir_node *bound, ir_node *mem) {
2196   assert (bound->op == op_Bound);
2197   set_irn_n(bound, 0, mem);
2198 }
2199
2200 /* Returns the index input of a Bound operation. */
2201 ir_node *get_Bound_index(ir_node *bound) {
2202   assert (bound->op == op_Bound);
2203   return get_irn_n(bound, 1);
2204 }
2205
2206 void     set_Bound_index(ir_node *bound, ir_node *idx) {
2207   assert (bound->op == op_Bound);
2208   set_irn_n(bound, 1, idx);
2209 }
2210
2211 /* Returns the lower bound input of a Bound operation. */
2212 ir_node *get_Bound_lower(ir_node *bound) {
2213   assert (bound->op == op_Bound);
2214   return get_irn_n(bound, 2);
2215 }
2216
2217 void     set_Bound_lower(ir_node *bound, ir_node *lower) {
2218   assert (bound->op == op_Bound);
2219   set_irn_n(bound, 2, lower);
2220 }
2221
2222 /* Returns the upper bound input of a Bound operation. */
2223 ir_node *get_Bound_upper(ir_node *bound) {
2224   assert (bound->op == op_Bound);
2225   return get_irn_n(bound, 3);
2226 }
2227
2228 void     set_Bound_upper(ir_node *bound, ir_node *upper) {
2229   assert (bound->op == op_Bound);
2230   set_irn_n(bound, 3, upper);
2231 }
2232
2233 /* returns the graph of a node */
2234 ir_graph *
2235 get_irn_irg(const ir_node *node) {
2236         /*
2237          * Do not use get_nodes_Block() here, because this
2238          * will check the pinned state.
2239          * However even a 'wrong' block is always in the proper
2240          * irg.
2241          */
2242   if (! is_Block(node))
2243     node = get_irn_n(node, -1);
2244   if (is_Bad(node))  /* sometimes bad is predecessor of nodes instead of block: in case of optimization */
2245     node = get_irn_n(node, -1);
2246   assert(get_irn_op(node) == op_Block);
2247   return node->attr.block.irg;
2248 }
2249
2250
2251 /*----------------------------------------------------------------*/
2252 /*  Auxiliary routines                                            */
2253 /*----------------------------------------------------------------*/
2254
2255 ir_node *
2256 skip_Proj (ir_node *node) {
2257   /* don't assert node !!! */
2258   if (node && is_Proj(node)) {
2259     return get_Proj_pred(node);
2260   } else {
2261     return node;
2262   }
2263 }
2264
2265 ir_node *
2266 skip_Tuple (ir_node *node) {
2267   ir_node *pred;
2268   ir_op   *op;
2269
2270   if (!get_opt_normalize()) return node;
2271
2272 restart:
2273   node = skip_Id(node);
2274   if (get_irn_op(node) == op_Proj) {
2275     pred = skip_Id(get_Proj_pred(node));
2276     op   = get_irn_op(pred);
2277
2278     /*
2279      * Looks strange but calls get_irn_op() only once
2280      * in most often cases.
2281      */
2282     if (op == op_Proj) { /* nested Tuple ? */
2283       pred = skip_Id(skip_Tuple(pred));
2284       op   = get_irn_op(pred);
2285
2286       if (op == op_Tuple) {
2287         node = get_Tuple_pred(pred, get_Proj_proj(node));
2288         goto restart;
2289       }
2290     }
2291     else if (op == op_Tuple) {
2292       node = get_Tuple_pred(pred, get_Proj_proj(node));
2293       goto restart;
2294     }
2295   }
2296   return node;
2297 }
2298
2299 /* returns operand of node if node is a Cast */
2300 ir_node *skip_Cast  (ir_node *node) {
2301   if (node && get_irn_op(node) == op_Cast)
2302     return get_Cast_op(node);
2303   return node;
2304 }
2305
2306 /* returns operand of node if node is a Confirm */
2307 ir_node *skip_Confirm  (ir_node *node) {
2308   if (node && get_irn_op(node) == op_Confirm)
2309     return get_Confirm_value(node);
2310   return node;
2311 }
2312
2313 /* skip all high-level ops */
2314 ir_node *skip_HighLevel(ir_node *node) {
2315   if (node && is_op_highlevel(get_irn_op(node)))
2316     return get_irn_n(node, 0);
2317   return node;
2318 }
2319
2320 #if 0
2321 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2322  * than any other approach, as Id chains are resolved and all point to the real node, or
2323  * all id's are self loops.
2324  *
2325  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2326  */
2327 ir_node *
2328 skip_Id (ir_node *node) {
2329   /* don't assert node !!! */
2330
2331   /* Don't use get_Id_pred:  We get into an endless loop for
2332      self-referencing Ids. */
2333   if (node && (node->op == op_Id) && (node != node->in[0+1])) {
2334     ir_node *rem_pred = node->in[0+1];
2335     ir_node *res;
2336
2337     assert (get_irn_arity (node) > 0);
2338
2339     node->in[0+1] = node;
2340     res = skip_Id(rem_pred);
2341     if (res->op == op_Id) /* self-loop */ return node;
2342
2343     node->in[0+1] = res;
2344     return res;
2345   } else {
2346     return node;
2347   }
2348 }
2349 #else
2350 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2351  * than any other approach, as Id chains are resolved and all point to the real node, or
2352  * all id's are self loops.
2353  *
2354  * Note: This function takes 10% of mostly ANY the compiler run, so it's
2355  * a little bit "hand optimized".
2356  *
2357  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2358  */
2359 ir_node *
2360 skip_Id (ir_node *node) {
2361   ir_node *pred;
2362   /* don't assert node !!! */
2363
2364   if (!node || (node->op != op_Id)) return node;
2365
2366   /* Don't use get_Id_pred():  We get into an endless loop for
2367      self-referencing Ids. */
2368   pred = node->in[0+1];
2369
2370   if (pred->op != op_Id) return pred;
2371
2372   if (node != pred) {  /* not a self referencing Id. Resolve Id chain. */
2373     ir_node *rem_pred, *res;
2374
2375     if (pred->op != op_Id) return pred; /* shortcut */
2376     rem_pred = pred;
2377
2378     assert (get_irn_arity (node) > 0);
2379
2380     node->in[0+1] = node;   /* turn us into a self referencing Id:  shorten Id cycles. */
2381     res = skip_Id(rem_pred);
2382     if (res->op == op_Id) /* self-loop */ return node;
2383
2384     node->in[0+1] = res;    /* Turn Id chain into Ids all referencing the chain end. */
2385     return res;
2386   } else {
2387     return node;
2388   }
2389 }
2390 #endif
2391
2392 void skip_Id_and_store(ir_node **node) {
2393   ir_node *n = *node;
2394
2395   if (!n || (n->op != op_Id)) return;
2396
2397   /* Don't use get_Id_pred():  We get into an endless loop for
2398      self-referencing Ids. */
2399   *node = skip_Id(n);
2400 }
2401
2402 int
2403 (is_Bad)(const ir_node *node) {
2404   return _is_Bad(node);
2405 }
2406
2407 int
2408 (is_Const)(const ir_node *node) {
2409         return _is_Const(node);
2410 }
2411
2412 int
2413 (is_no_Block)(const ir_node *node) {
2414   return _is_no_Block(node);
2415 }
2416
2417 int
2418 (is_Block)(const ir_node *node) {
2419   return _is_Block(node);
2420 }
2421
2422 /* returns true if node is an Unknown node. */
2423 int
2424 (is_Unknown)(const ir_node *node) {
2425   return _is_Unknown(node);
2426 }
2427
2428 /* returns true if node is a Return node. */
2429 int
2430 (is_Return)(const ir_node *node) {
2431   return _is_Return(node);
2432 }
2433
2434 /* returns true if node is a Call node. */
2435 int
2436 (is_Call)(const ir_node *node) {
2437   return _is_Call(node);
2438 }
2439
2440 /* returns true if node is a Sel node. */
2441 int
2442 (is_Sel)(const ir_node *node) {
2443   return _is_Sel(node);
2444 }
2445
2446 /* returns true if node is a Mux node or a Psi with only one condition. */
2447 int
2448 (is_Mux)(const ir_node *node) {
2449   return _is_Mux(node);
2450 }
2451
2452 /* returns true if node is a Load node. */
2453 int
2454 (is_Load)(const ir_node *node) {
2455   return _is_Load(node);
2456 }
2457
2458 /* returns true if node is a Sync node. */
2459 int
2460 (is_Sync)(const ir_node *node) {
2461   return _is_Sync(node);
2462 }
2463
2464 /* returns true if node is a Confirm node. */
2465 int
2466 (is_Confirm)(const ir_node *node) {
2467   return _is_Confirm(node);
2468 }
2469
2470 int
2471 is_Proj (const ir_node *node) {
2472   assert(node);
2473   return node->op == op_Proj
2474     || (!get_interprocedural_view() && node->op == op_Filter);
2475 }
2476
2477 /* Returns true if the operation manipulates control flow. */
2478 int
2479 is_cfop(const ir_node *node) {
2480   return is_cfopcode(get_irn_op(node));
2481 }
2482
2483 /* Returns true if the operation manipulates interprocedural control flow:
2484    CallBegin, EndReg, EndExcept */
2485 int is_ip_cfop(const ir_node *node) {
2486   return is_ip_cfopcode(get_irn_op(node));
2487 }
2488
2489 /* Returns true if the operation can change the control flow because
2490    of an exception. */
2491 int
2492 is_fragile_op(const ir_node *node) {
2493   return is_op_fragile(get_irn_op(node));
2494 }
2495
2496 /* Returns the memory operand of fragile operations. */
2497 ir_node *get_fragile_op_mem(ir_node *node) {
2498   assert(node && is_fragile_op(node));
2499
2500   switch (get_irn_opcode (node)) {
2501   case iro_Call  :
2502   case iro_Quot  :
2503   case iro_DivMod:
2504   case iro_Div   :
2505   case iro_Mod   :
2506   case iro_Load  :
2507   case iro_Store :
2508   case iro_Alloc :
2509     return get_irn_n(node, 0);
2510   case iro_Bad   :
2511   case iro_Unknown:
2512     return node;
2513   default: ;
2514     assert(0 && "should not be reached");
2515     return NULL;
2516   }
2517 }
2518
2519 /* Returns true if the operation is a forking control flow operation. */
2520 int (is_irn_forking)(const ir_node *node) {
2521   return _is_irn_forking(node);
2522 }
2523
2524 /* Return the type associated with the value produced by n
2525  * if the node remarks this type as it is the case for
2526  * Cast, Const, SymConst and some Proj nodes. */
2527 ir_type *(get_irn_type)(ir_node *node) {
2528   return _get_irn_type(node);
2529 }
2530
2531 /* Return the type attribute of a node n (SymConst, Call, Alloc, Free,
2532    Cast) or NULL.*/
2533 ir_type *(get_irn_type_attr)(ir_node *node) {
2534   return _get_irn_type_attr(node);
2535 }
2536
2537 /* Return the entity attribute of a node n (SymConst, Sel) or NULL. */
2538 entity *(get_irn_entity_attr)(ir_node *node) {
2539   return _get_irn_entity_attr(node);
2540 }
2541
2542 /* Returns non-zero for constant-like nodes. */
2543 int (is_irn_constlike)(const ir_node *node) {
2544   return _is_irn_constlike(node);
2545 }
2546
2547 /*
2548  * Returns non-zero for nodes that are allowed to have keep-alives and
2549  * are neither Block nor PhiM.
2550  */
2551 int (is_irn_keep)(const ir_node *node) {
2552   return _is_irn_keep(node);
2553 }
2554
2555 /* Returns non-zero for nodes that are machine operations. */
2556 int (is_irn_machine_op)(const ir_node *node) {
2557         return _is_irn_machine_op(node);
2558 }
2559
2560 /* Returns non-zero for nodes that are machine operands. */
2561 int (is_irn_machine_operand)(const ir_node *node) {
2562         return _is_irn_machine_operand(node);
2563 }
2564
2565 /* Returns non-zero for nodes that have the n'th user machine flag set. */
2566 int (is_irn_machine_user)(const ir_node *node, unsigned n) {
2567         return _is_irn_machine_user(node, n);
2568 }
2569
2570
2571 /* Gets the string representation of the jump prediction .*/
2572 const char *get_cond_jmp_predicate_name(cond_jmp_predicate pred)
2573 {
2574   switch (pred) {
2575   default:
2576   case COND_JMP_PRED_NONE:  return "no prediction";
2577   case COND_JMP_PRED_TRUE:  return "true taken";
2578   case COND_JMP_PRED_FALSE: return "false taken";
2579   }
2580 }
2581
2582 /* Returns the conditional jump prediction of a Cond node. */
2583 cond_jmp_predicate (get_Cond_jmp_pred)(ir_node *cond) {
2584   return _get_Cond_jmp_pred(cond);
2585 }
2586
2587 /* Sets a new conditional jump prediction. */
2588 void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) {
2589   _set_Cond_jmp_pred(cond, pred);
2590 }
2591
2592 /** the get_type operation must be always implemented and return a firm type */
2593 static ir_type *get_Default_type(ir_node *n) {
2594   return get_unknown_type();
2595 }
2596
2597 /* Sets the get_type operation for an ir_op_ops. */
2598 ir_op_ops *firm_set_default_get_type(opcode code, ir_op_ops *ops)
2599 {
2600   switch (code) {
2601   case iro_Const:    ops->get_type = get_Const_type; break;
2602   case iro_SymConst: ops->get_type = get_SymConst_value_type; break;
2603   case iro_Cast:     ops->get_type = get_Cast_type; break;
2604   case iro_Proj:     ops->get_type = get_Proj_type; break;
2605   default:
2606     /* not allowed to be NULL */
2607     if (! ops->get_type)
2608       ops->get_type = get_Default_type;
2609     break;
2610   }
2611   return ops;
2612 }
2613
2614 /** Return the attribute type of a SymConst node if exists */
2615 static ir_type *get_SymConst_attr_type(ir_node *self) {
2616   symconst_kind kind = get_SymConst_kind(self);
2617   if (SYMCONST_HAS_TYPE(kind))
2618     return get_SymConst_type(self);
2619   return NULL;
2620 }
2621
2622 /** Return the attribute entity of a SymConst node if exists */
2623 static entity *get_SymConst_attr_entity(ir_node *self) {
2624   symconst_kind kind = get_SymConst_kind(self);
2625   if (SYMCONST_HAS_ENT(kind))
2626     return get_SymConst_entity(self);
2627   return NULL;
2628 }
2629
2630 /** the get_type_attr operation must be always implemented */
2631 static ir_type *get_Null_type(ir_node *n) {
2632   return firm_unknown_type;
2633 }
2634
2635 /* Sets the get_type operation for an ir_op_ops. */
2636 ir_op_ops *firm_set_default_get_type_attr(opcode code, ir_op_ops *ops)
2637 {
2638   switch (code) {
2639   case iro_SymConst: ops->get_type_attr = get_SymConst_attr_type; break;
2640   case iro_Call:     ops->get_type_attr = get_Call_type; break;
2641   case iro_Alloc:    ops->get_type_attr = get_Alloc_type; break;
2642   case iro_Free:     ops->get_type_attr = get_Free_type; break;
2643   case iro_Cast:     ops->get_type_attr = get_Cast_type; break;
2644   default:
2645     /* not allowed to be NULL */
2646     if (! ops->get_type_attr)
2647       ops->get_type_attr = get_Null_type;
2648     break;
2649   }
2650   return ops;
2651 }
2652
2653 /** the get_entity_attr operation must be always implemented */
2654 static entity *get_Null_ent(ir_node *n) {
2655   return NULL;
2656 }
2657
2658 /* Sets the get_type operation for an ir_op_ops. */
2659 ir_op_ops *firm_set_default_get_entity_attr(opcode code, ir_op_ops *ops)
2660 {
2661   switch (code) {
2662   case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break;
2663   case iro_Sel:      ops->get_entity_attr = get_Sel_entity; break;
2664   default:
2665     /* not allowed to be NULL */
2666     if (! ops->get_entity_attr)
2667       ops->get_entity_attr = get_Null_ent;
2668     break;
2669   }
2670   return ops;
2671 }
2672
2673 #ifdef DEBUG_libfirm
2674 void dump_irn (ir_node *n) {
2675   int i, arity = get_irn_arity(n);
2676   printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n);
2677   if (!is_Block(n)) {
2678     ir_node *pred = get_irn_n(n, -1);
2679     printf("  block: %s%s: %ld (%p)\n", get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2680        get_irn_node_nr(pred), (void *)pred);
2681   }
2682   printf("  preds: \n");
2683   for (i = 0; i < arity; ++i) {
2684     ir_node *pred = get_irn_n(n, i);
2685     printf("    %d: %s%s: %ld (%p)\n", i, get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2686        get_irn_node_nr(pred), (void *)pred);
2687   }
2688 }
2689
2690 #else  /* DEBUG_libfirm */
2691 void dump_irn (ir_node *n) {}
2692 #endif /* DEBUG_libfirm */