7b29f206312d157cc09769b44161424c51b3ae1e
[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 (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_frame_base)) {
596     ir_node *start = get_Proj_pred(n);
597     if (get_irn_op(start) == op_Start) {
598       return get_irg_frame_type(get_irn_irg(start));
599     }
600   }
601   return NULL;
602 }
603
604 /* Test whether arbitrary node is globals pointer, i.e. Proj(pn_Start_P_globals)
605  * from Start.  If so returns global type, else Null. */
606 ir_type *is_globals_pointer(ir_node *n) {
607   if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_globals)) {
608     ir_node *start = get_Proj_pred(n);
609     if (get_irn_op(start) == op_Start) {
610       return get_glob_type();
611     }
612   }
613   return NULL;
614 }
615
616 /* Test whether arbitrary node is tls pointer, i.e. Proj(pn_Start_P_tls)
617  * from Start.  If so returns tls type, else Null. */
618 ir_type *is_tls_pointer(ir_node *n) {
619   if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_globals)) {
620       ir_node *start = get_Proj_pred(n);
621       if (get_irn_op(start) == op_Start) {
622         return get_tls_type();
623       }
624   }
625   return NULL;
626 }
627
628 /* Test whether arbitrary node is value arg base, i.e. Proj(pn_Start_P_value_arg_base)
629  * from Start.  If so returns 1, else 0. */
630 int is_value_arg_pointer(ir_node *n) {
631   if ((get_irn_op(n) == op_Proj) &&
632       (get_Proj_proj(n) == pn_Start_P_value_arg_base) &&
633       (get_irn_op(get_Proj_pred(n)) == op_Start))
634     return 1;
635   return 0;
636 }
637
638 /* Returns an array with the predecessors of the Block. Depending on
639    the implementation of the graph data structure this can be a copy of
640    the internal representation of predecessors as well as the internal
641    array itself. Therefore writing to this array might obstruct the ir. */
642 ir_node **
643 get_Block_cfgpred_arr (ir_node *node)
644 {
645   assert ((node->op == op_Block));
646   return (ir_node **)&(get_irn_in(node)[1]);
647 }
648
649 int
650 (get_Block_n_cfgpreds)(ir_node *node) {
651   return _get_Block_n_cfgpreds(node);
652 }
653
654 ir_node *
655 (get_Block_cfgpred)(ir_node *node, int pos) {
656   return _get_Block_cfgpred(node, pos);
657 }
658
659 void
660 set_Block_cfgpred (ir_node *node, int pos, ir_node *pred) {
661   assert (node->op == op_Block);
662   set_irn_n(node, pos, pred);
663 }
664
665 ir_node  *
666 (get_Block_cfgpred_block)(ir_node *node, int pos) {
667   return _get_Block_cfgpred_block(node, pos);
668 }
669
670 int
671 get_Block_matured (ir_node *node) {
672   assert (node->op == op_Block);
673   return (int)node->attr.block.matured;
674 }
675
676 void
677 set_Block_matured (ir_node *node, int matured) {
678   assert (node->op == op_Block);
679   node->attr.block.matured = matured;
680 }
681
682 unsigned long
683 (get_Block_block_visited)(ir_node *node) {
684   return _get_Block_block_visited(node);
685 }
686
687 void
688 (set_Block_block_visited)(ir_node *node, unsigned long visit) {
689   _set_Block_block_visited(node, visit);
690 }
691
692 /* For this current_ir_graph must be set. */
693 void
694 (mark_Block_block_visited)(ir_node *node) {
695   _mark_Block_block_visited(node);
696 }
697
698 int
699 (Block_not_block_visited)(ir_node *node) {
700   return _Block_not_block_visited(node);
701 }
702
703 ir_node *
704 get_Block_graph_arr (ir_node *node, int pos) {
705   assert (node->op == op_Block);
706   return node->attr.block.graph_arr[pos+1];
707 }
708
709 void
710 set_Block_graph_arr (ir_node *node, int pos, ir_node *value) {
711   assert (node->op == op_Block);
712   node->attr.block.graph_arr[pos+1] = value;
713 }
714
715 void set_Block_cg_cfgpred_arr(ir_node * node, int arity, ir_node ** in) {
716   assert(node->op == op_Block);
717   if (node->attr.block.in_cg == NULL || arity != ARR_LEN(node->attr.block.in_cg) - 1) {
718     node->attr.block.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
719     node->attr.block.in_cg[0] = NULL;
720     node->attr.block.cg_backedge = new_backedge_arr(current_ir_graph->obst, arity);
721     {
722       /* Fix backedge array.  fix_backedges() operates depending on
723      interprocedural_view. */
724       int ipv = get_interprocedural_view();
725       set_interprocedural_view(1);
726       fix_backedges(current_ir_graph->obst, node);
727       set_interprocedural_view(ipv);
728     }
729   }
730   memcpy(node->attr.block.in_cg + 1, in, sizeof(ir_node *) * arity);
731 }
732
733 void set_Block_cg_cfgpred(ir_node * node, int pos, ir_node * pred) {
734   assert(node->op == op_Block &&
735      node->attr.block.in_cg &&
736      0 <= pos && pos < ARR_LEN(node->attr.block.in_cg) - 1);
737   node->attr.block.in_cg[pos + 1] = pred;
738 }
739
740 ir_node ** get_Block_cg_cfgpred_arr(ir_node * node) {
741   assert(node->op == op_Block);
742   return node->attr.block.in_cg == NULL ? NULL : node->attr.block.in_cg  + 1;
743 }
744
745 int get_Block_cg_n_cfgpreds(ir_node * node) {
746   assert(node->op == op_Block);
747   return node->attr.block.in_cg == NULL ? 0 : ARR_LEN(node->attr.block.in_cg) - 1;
748 }
749
750 ir_node * get_Block_cg_cfgpred(ir_node * node, int pos) {
751   assert(node->op == op_Block && node->attr.block.in_cg);
752   return node->attr.block.in_cg[pos + 1];
753 }
754
755 void remove_Block_cg_cfgpred_arr(ir_node * node) {
756   assert(node->op == op_Block);
757   node->attr.block.in_cg = NULL;
758 }
759
760 ir_node *(set_Block_dead)(ir_node *block) {
761   return _set_Block_dead(block);
762 }
763
764 int (is_Block_dead)(const ir_node *block) {
765   return _is_Block_dead(block);
766 }
767
768 ir_extblk *get_Block_extbb(const ir_node *block) {
769         ir_extblk *res;
770   assert(is_Block(block));
771         res = block->attr.block.extblk;
772         assert(res == NULL || is_ir_extbb(res));
773   return res;
774 }
775
776 void set_Block_extbb(ir_node *block, ir_extblk *extblk) {
777   assert(is_Block(block));
778         assert(extblk == NULL || is_ir_extbb(extblk));
779   block->attr.block.extblk = extblk;
780 }
781
782 int
783 get_End_n_keepalives(ir_node *end) {
784   assert (end->op == op_End);
785   return (get_irn_arity(end) - END_KEEPALIVE_OFFSET);
786 }
787
788 ir_node *
789 get_End_keepalive(ir_node *end, int pos) {
790   assert (end->op == op_End);
791   return get_irn_n(end, pos + END_KEEPALIVE_OFFSET);
792 }
793
794 void
795 add_End_keepalive (ir_node *end, ir_node *ka) {
796   int l;
797   ir_graph *irg = get_irn_irg(end);
798
799   assert(end->op == op_End);
800   l = ARR_LEN(end->in);
801   ARR_APP1(ir_node *, end->in, ka);
802   edges_notify_edge(end, l - 1, end->in[l], NULL, irg);
803 }
804
805 void
806 set_End_keepalive(ir_node *end, int pos, ir_node *ka) {
807   assert (end->op == op_End);
808   set_irn_n(end, pos + END_KEEPALIVE_OFFSET, ka);
809 }
810
811 /* Set new keep-alives */
812 void set_End_keepalives(ir_node *end, int n, ir_node *in[]) {
813   int i;
814   ir_graph *irg = get_irn_irg(end);
815
816   /* notify that edges are deleted */
817   for (i = 1 + END_KEEPALIVE_OFFSET; i < ARR_LEN(end->in); ++i) {
818     edges_notify_edge(end, i, end->in[i], NULL, irg);
819   }
820   ARR_RESIZE(ir_node *, end->in, n + 1 + END_KEEPALIVE_OFFSET);
821
822   for (i = 0; i < n; ++i) {
823     end->in[1 + END_KEEPALIVE_OFFSET + i] = in[i];
824     edges_notify_edge(end, END_KEEPALIVE_OFFSET + i, NULL, end->in[1 + END_KEEPALIVE_OFFSET + i], irg);
825   }
826 }
827
828 void
829 free_End (ir_node *end) {
830   assert (end->op == op_End);
831   end->kind = k_BAD;
832   DEL_ARR_F(end->in);
833   end->in = NULL;   /* @@@ make sure we get an error if we use the
834                in array afterwards ... */
835 }
836
837 /* Return the target address of an IJmp */
838 ir_node *get_IJmp_target(ir_node *ijmp) {
839   assert(ijmp->op == op_IJmp);
840   return get_irn_n(ijmp, 0);
841 }
842
843 /** Sets the target address of an IJmp */
844 void set_IJmp_target(ir_node *ijmp, ir_node *tgt) {
845   assert(ijmp->op == op_IJmp);
846   set_irn_n(ijmp, 0, tgt);
847 }
848
849 /*
850 > Implementing the case construct (which is where the constant Proj node is
851 > important) involves far more than simply determining the constant values.
852 > We could argue that this is more properly a function of the translator from
853 > Firm to the target machine.  That could be done if there was some way of
854 > projecting "default" out of the Cond node.
855 I know it's complicated.
856 Basically there are two proglems:
857  - determining the gaps between the projs
858  - determining the biggest case constant to know the proj number for
859    the default node.
860 I see several solutions:
861 1. Introduce a ProjDefault node.  Solves both problems.
862    This means to extend all optimizations executed during construction.
863 2. Give the Cond node for switch two flavors:
864    a) there are no gaps in the projs  (existing flavor)
865    b) gaps may exist, default proj is still the Proj with the largest
866       projection number.  This covers also the gaps.
867 3. Fix the semantic of the Cond to that of 2b)
868
869 Solution 2 seems to be the best:
870 Computing the gaps in the Firm representation is not too hard, i.e.,
871 libFIRM can implement a routine that transforms between the two
872 flavours.  This is also possible for 1) but 2) does not require to
873 change any existing optimization.
874 Further it should be far simpler to determine the biggest constant than
875 to compute all gaps.
876 I don't want to choose 3) as 2a) seems to have advantages for
877 dataflow analysis and 3) does not allow to convert the representation to
878 2a).
879 */
880 ir_node *
881 get_Cond_selector (ir_node *node) {
882   assert (node->op == op_Cond);
883   return get_irn_n(node, 0);
884 }
885
886 void
887 set_Cond_selector (ir_node *node, ir_node *selector) {
888   assert (node->op == op_Cond);
889   set_irn_n(node, 0, selector);
890 }
891
892 cond_kind
893 get_Cond_kind (ir_node *node) {
894   assert (node->op == op_Cond);
895   return node->attr.c.kind;
896 }
897
898 void
899 set_Cond_kind (ir_node *node, cond_kind kind) {
900   assert (node->op == op_Cond);
901   node->attr.c.kind = kind;
902 }
903
904 long
905 get_Cond_defaultProj (ir_node *node) {
906   assert (node->op == op_Cond);
907   return node->attr.c.default_proj;
908 }
909
910 ir_node *
911 get_Return_mem (ir_node *node) {
912   assert (node->op == op_Return);
913   return get_irn_n(node, 0);
914 }
915
916 void
917 set_Return_mem (ir_node *node, ir_node *mem) {
918   assert (node->op == op_Return);
919   set_irn_n(node, 0, mem);
920 }
921
922 int
923 get_Return_n_ress (ir_node *node) {
924   assert (node->op == op_Return);
925   return (get_irn_arity(node) - RETURN_RESULT_OFFSET);
926 }
927
928 ir_node **
929 get_Return_res_arr (ir_node *node)
930 {
931   assert ((node->op == op_Return));
932   if (get_Return_n_ress(node) > 0)
933     return (ir_node **)&(get_irn_in(node)[1 + RETURN_RESULT_OFFSET]);
934   else
935     return NULL;
936 }
937
938 /*
939 void
940 set_Return_n_res (ir_node *node, int results) {
941   assert (node->op == op_Return);
942 }
943 */
944
945 ir_node *
946 get_Return_res (ir_node *node, int pos) {
947   assert (node->op == op_Return);
948   assert (get_Return_n_ress(node) > pos);
949   return get_irn_n(node, pos + RETURN_RESULT_OFFSET);
950 }
951
952 void
953 set_Return_res (ir_node *node, int pos, ir_node *res){
954   assert (node->op == op_Return);
955   set_irn_n(node, pos + RETURN_RESULT_OFFSET, res);
956 }
957
958 tarval *(get_Const_tarval)(ir_node *node) {
959         return _get_Const_tarval(node);
960 }
961
962 void
963 set_Const_tarval (ir_node *node, tarval *con) {
964   assert (node->op == op_Const);
965   node->attr.con.tv = con;
966 }
967
968 cnst_classify_t (classify_Const)(ir_node *node)
969 {
970         return _classify_Const(node);
971 }
972
973
974 /* The source language type.  Must be an atomic type.  Mode of type must
975    be mode of node. For tarvals from entities type must be pointer to
976    entity type. */
977 ir_type *
978 get_Const_type (ir_node *node) {
979   assert (node->op == op_Const);
980   return node->attr.con.tp;
981 }
982
983 void
984 set_Const_type (ir_node *node, ir_type *tp) {
985   assert (node->op == op_Const);
986   if (tp != firm_unknown_type) {
987     assert (is_atomic_type(tp));
988     assert (get_type_mode(tp) == get_irn_mode(node));
989   }
990   node->attr.con.tp = tp;
991 }
992
993
994 symconst_kind
995 get_SymConst_kind (const ir_node *node) {
996   assert (node->op == op_SymConst);
997   return node->attr.i.num;
998 }
999
1000 void
1001 set_SymConst_kind (ir_node *node, symconst_kind num) {
1002   assert (node->op == op_SymConst);
1003   node->attr.i.num = num;
1004 }
1005
1006 ir_type *
1007 get_SymConst_type (ir_node *node) {
1008   assert(   (node->op == op_SymConst)
1009          && (SYMCONST_HAS_TYPE(get_SymConst_kind(node))));
1010   return node->attr.i.sym.type_p = skip_tid(node->attr.i.sym.type_p);
1011 }
1012
1013 void
1014 set_SymConst_type (ir_node *node, ir_type *tp) {
1015   assert(   (node->op == op_SymConst)
1016          && (SYMCONST_HAS_TYPE(get_SymConst_kind(node))));
1017   node->attr.i.sym.type_p = tp;
1018 }
1019
1020 ident *
1021 get_SymConst_name (ir_node *node) {
1022   assert (   (node->op == op_SymConst)
1023           && (get_SymConst_kind(node) == symconst_addr_name));
1024   return node->attr.i.sym.ident_p;
1025 }
1026
1027 void
1028 set_SymConst_name (ir_node *node, ident *name) {
1029   assert (   (node->op == op_SymConst)
1030           && (get_SymConst_kind(node) == symconst_addr_name));
1031   node->attr.i.sym.ident_p = name;
1032 }
1033
1034
1035 /* Only to access SymConst of kind symconst_addr_ent.  Else assertion: */
1036 entity   *get_SymConst_entity (ir_node *node) {
1037   assert (   (node->op == op_SymConst)
1038           && (get_SymConst_kind (node) == symconst_addr_ent));
1039   return node->attr.i.sym.entity_p;
1040 }
1041
1042 void     set_SymConst_entity (ir_node *node, entity *ent) {
1043   assert (   (node->op == op_SymConst)
1044           && (get_SymConst_kind(node) == symconst_addr_ent));
1045   node->attr.i.sym.entity_p  = ent;
1046 }
1047
1048 union symconst_symbol
1049 get_SymConst_symbol (ir_node *node) {
1050   assert (node->op == op_SymConst);
1051   return node->attr.i.sym;
1052 }
1053
1054 void
1055 set_SymConst_symbol (ir_node *node, union symconst_symbol sym) {
1056   assert (node->op == op_SymConst);
1057   //memcpy (&(node->attr.i.sym), sym, sizeof(type_or_id));
1058   node->attr.i.sym = sym;
1059 }
1060
1061 ir_type *
1062 get_SymConst_value_type (ir_node *node) {
1063   assert (node->op == op_SymConst);
1064   if (node->attr.i.tp) node->attr.i.tp = skip_tid(node->attr.i.tp);
1065   return node->attr.i.tp;
1066 }
1067
1068 void
1069 set_SymConst_value_type (ir_node *node, ir_type *tp) {
1070   assert (node->op == op_SymConst);
1071   node->attr.i.tp = tp;
1072 }
1073
1074 ir_node *
1075 get_Sel_mem (ir_node *node) {
1076   assert (node->op == op_Sel);
1077   return get_irn_n(node, 0);
1078 }
1079
1080 void
1081 set_Sel_mem (ir_node *node, ir_node *mem) {
1082   assert (node->op == op_Sel);
1083   set_irn_n(node, 0, mem);
1084 }
1085
1086 ir_node *
1087 get_Sel_ptr (ir_node *node) {
1088   assert (node->op == op_Sel);
1089   return get_irn_n(node, 1);
1090 }
1091
1092 void
1093 set_Sel_ptr (ir_node *node, ir_node *ptr) {
1094   assert (node->op == op_Sel);
1095   set_irn_n(node, 1, ptr);
1096 }
1097
1098 int
1099 get_Sel_n_indexs (ir_node *node) {
1100   assert (node->op == op_Sel);
1101   return (get_irn_arity(node) - SEL_INDEX_OFFSET);
1102 }
1103
1104 ir_node **
1105 get_Sel_index_arr (ir_node *node)
1106 {
1107   assert ((node->op == op_Sel));
1108   if (get_Sel_n_indexs(node) > 0)
1109     return (ir_node **)& get_irn_in(node)[SEL_INDEX_OFFSET + 1];
1110   else
1111     return NULL;
1112 }
1113
1114 ir_node *
1115 get_Sel_index (ir_node *node, int pos) {
1116   assert (node->op == op_Sel);
1117   return get_irn_n(node, pos + SEL_INDEX_OFFSET);
1118 }
1119
1120 void
1121 set_Sel_index (ir_node *node, int pos, ir_node *index) {
1122   assert (node->op == op_Sel);
1123   set_irn_n(node, pos + SEL_INDEX_OFFSET, index);
1124 }
1125
1126 entity *
1127 get_Sel_entity (ir_node *node) {
1128   assert (node->op == op_Sel);
1129   return node->attr.s.ent;
1130 }
1131
1132 void
1133 set_Sel_entity (ir_node *node, entity *ent) {
1134   assert (node->op == op_Sel);
1135   node->attr.s.ent = ent;
1136 }
1137
1138
1139 /* For unary and binary arithmetic operations the access to the
1140    operands can be factored out.  Left is the first, right the
1141    second arithmetic value  as listed in tech report 0999-33.
1142    unops are: Minus, Abs, Not, Conv, Cast
1143    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
1144    Shr, Shrs, Rotate, Cmp */
1145
1146
1147 ir_node *
1148 get_Call_mem (ir_node *node) {
1149   assert (node->op == op_Call);
1150   return get_irn_n(node, 0);
1151 }
1152
1153 void
1154 set_Call_mem (ir_node *node, ir_node *mem) {
1155   assert (node->op == op_Call);
1156   set_irn_n(node, 0, mem);
1157 }
1158
1159 ir_node *
1160 get_Call_ptr (ir_node *node) {
1161   assert (node->op == op_Call);
1162   return get_irn_n(node, 1);
1163 }
1164
1165 void
1166 set_Call_ptr (ir_node *node, ir_node *ptr) {
1167   assert (node->op == op_Call);
1168   set_irn_n(node, 1, ptr);
1169 }
1170
1171 ir_node **
1172 get_Call_param_arr (ir_node *node) {
1173   assert (node->op == op_Call);
1174   return (ir_node **)&get_irn_in(node)[CALL_PARAM_OFFSET + 1];
1175 }
1176
1177 int
1178 get_Call_n_params (ir_node *node)  {
1179   assert (node->op == op_Call);
1180   return (get_irn_arity(node) - CALL_PARAM_OFFSET);
1181 }
1182
1183 int
1184 get_Call_arity (ir_node *node) {
1185   assert (node->op == op_Call);
1186   return get_Call_n_params(node);
1187 }
1188
1189 /* void
1190 set_Call_arity (ir_node *node, ir_node *arity) {
1191   assert (node->op == op_Call);
1192 }
1193 */
1194
1195 ir_node *
1196 get_Call_param (ir_node *node, int pos) {
1197   assert (node->op == op_Call);
1198   return get_irn_n(node, pos + CALL_PARAM_OFFSET);
1199 }
1200
1201 void
1202 set_Call_param (ir_node *node, int pos, ir_node *param) {
1203   assert (node->op == op_Call);
1204   set_irn_n(node, pos + CALL_PARAM_OFFSET, param);
1205 }
1206
1207 ir_type *
1208 get_Call_type (ir_node *node) {
1209   assert (node->op == op_Call);
1210   return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
1211 }
1212
1213 void
1214 set_Call_type (ir_node *node, ir_type *tp) {
1215   assert (node->op == op_Call);
1216   assert ((get_unknown_type() == tp) || is_Method_type(tp));
1217   node->attr.call.cld_tp = tp;
1218 }
1219
1220 int Call_has_callees(ir_node *node) {
1221   assert(node && node->op == op_Call);
1222   return ((get_irg_callee_info_state(get_irn_irg(node)) != irg_callee_info_none) &&
1223       (node->attr.call.callee_arr != NULL));
1224 }
1225
1226 int get_Call_n_callees(ir_node * node) {
1227   assert(node && node->op == op_Call && node->attr.call.callee_arr);
1228   return ARR_LEN(node->attr.call.callee_arr);
1229 }
1230
1231 entity * get_Call_callee(ir_node * node, int pos) {
1232   assert(pos >= 0 && pos < get_Call_n_callees(node));
1233   return node->attr.call.callee_arr[pos];
1234 }
1235
1236 void set_Call_callee_arr(ir_node * node, const int n, entity ** arr) {
1237   assert(node->op == op_Call);
1238   if (node->attr.call.callee_arr == NULL || get_Call_n_callees(node) != n) {
1239     node->attr.call.callee_arr = NEW_ARR_D(entity *, current_ir_graph->obst, n);
1240   }
1241   memcpy(node->attr.call.callee_arr, arr, n * sizeof(entity *));
1242 }
1243
1244 void remove_Call_callee_arr(ir_node * node) {
1245   assert(node->op == op_Call);
1246   node->attr.call.callee_arr = NULL;
1247 }
1248
1249 ir_node * get_CallBegin_ptr (ir_node *node) {
1250   assert(node->op == op_CallBegin);
1251   return get_irn_n(node, 0);
1252 }
1253 void set_CallBegin_ptr (ir_node *node, ir_node *ptr) {
1254   assert(node->op == op_CallBegin);
1255   set_irn_n(node, 0, ptr);
1256 }
1257 ir_node * get_CallBegin_call (ir_node *node) {
1258   assert(node->op == op_CallBegin);
1259   return node->attr.callbegin.call;
1260 }
1261 void  set_CallBegin_call (ir_node *node, ir_node *call) {
1262   assert(node->op == op_CallBegin);
1263   node->attr.callbegin.call = call;
1264 }
1265
1266
1267 #define BINOP(OP)                   \
1268 ir_node * get_##OP##_left(ir_node *node) {      \
1269   assert(node->op == op_##OP);              \
1270   return get_irn_n(node, node->op->op_index);       \
1271 }                           \
1272 void set_##OP##_left(ir_node *node, ir_node *left) {    \
1273   assert(node->op == op_##OP);              \
1274   set_irn_n(node, node->op->op_index, left);        \
1275 }                           \
1276 ir_node *get_##OP##_right(ir_node *node) {      \
1277   assert(node->op == op_##OP);              \
1278   return get_irn_n(node, node->op->op_index + 1);   \
1279 }                           \
1280 void set_##OP##_right(ir_node *node, ir_node *right) {  \
1281   assert(node->op == op_##OP);              \
1282   set_irn_n(node, node->op->op_index + 1, right);   \
1283 }
1284
1285 #define UNOP(OP)                    \
1286 ir_node *get_##OP##_op(ir_node *node) {         \
1287   assert(node->op == op_##OP);              \
1288   return get_irn_n(node, node->op->op_index);       \
1289 }                           \
1290 void set_##OP##_op (ir_node *node, ir_node *op) {   \
1291   assert(node->op == op_##OP);              \
1292   set_irn_n(node, node->op->op_index, op);      \
1293 }
1294
1295 BINOP(Add)
1296 BINOP(Sub)
1297 UNOP(Minus)
1298 BINOP(Mul)
1299 BINOP(Quot)
1300
1301 ir_node *
1302 get_Quot_mem (ir_node *node) {
1303   assert (node->op == op_Quot);
1304   return get_irn_n(node, 0);
1305 }
1306
1307 void
1308 set_Quot_mem (ir_node *node, ir_node *mem) {
1309   assert (node->op == op_Quot);
1310   set_irn_n(node, 0, mem);
1311 }
1312
1313 BINOP(DivMod)
1314
1315 ir_node *
1316 get_DivMod_mem (ir_node *node) {
1317   assert (node->op == op_DivMod);
1318   return get_irn_n(node, 0);
1319 }
1320
1321 void
1322 set_DivMod_mem (ir_node *node, ir_node *mem) {
1323   assert (node->op == op_DivMod);
1324   set_irn_n(node, 0, mem);
1325 }
1326
1327 BINOP(Div)
1328
1329 ir_node *
1330 get_Div_mem (ir_node *node) {
1331   assert (node->op == op_Div);
1332   return get_irn_n(node, 0);
1333 }
1334
1335 void
1336 set_Div_mem (ir_node *node, ir_node *mem) {
1337   assert (node->op == op_Div);
1338   set_irn_n(node, 0, mem);
1339 }
1340
1341 BINOP(Mod)
1342
1343 ir_node *
1344 get_Mod_mem (ir_node *node) {
1345   assert (node->op == op_Mod);
1346   return get_irn_n(node, 0);
1347 }
1348
1349 void
1350 set_Mod_mem (ir_node *node, ir_node *mem) {
1351   assert (node->op == op_Mod);
1352   set_irn_n(node, 0, mem);
1353 }
1354
1355 UNOP(Abs)
1356 BINOP(And)
1357 BINOP(Or)
1358 BINOP(Eor)
1359 UNOP(Not)
1360 BINOP(Shl)
1361 BINOP(Shr)
1362 BINOP(Shrs)
1363 BINOP(Rot)
1364 BINOP(Cmp)
1365 UNOP(Conv)
1366 UNOP(Cast)
1367
1368 ir_type *
1369 get_Cast_type (ir_node *node) {
1370   assert (node->op == op_Cast);
1371   return node->attr.cast.totype;
1372 }
1373
1374 void
1375 set_Cast_type (ir_node *node, ir_type *to_tp) {
1376   assert (node->op == op_Cast);
1377   node->attr.cast.totype = to_tp;
1378 }
1379
1380
1381 /* Checks for upcast.
1382  *
1383  * Returns true if the Cast node casts a class type to a super type.
1384  */
1385 int is_Cast_upcast(ir_node *node) {
1386   ir_type *totype   = get_Cast_type(node);
1387   ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1388   ir_graph *myirg = get_irn_irg(node);
1389
1390   assert(get_irg_typeinfo_state(myirg) == ir_typeinfo_consistent);
1391   assert(fromtype);
1392
1393   while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1394     totype   = get_pointer_points_to_type(totype);
1395     fromtype = get_pointer_points_to_type(fromtype);
1396   }
1397
1398   assert(fromtype);
1399
1400   if (!is_Class_type(totype)) return 0;
1401   return is_SubClass_of(fromtype, totype);
1402 }
1403
1404 /* Checks for downcast.
1405  *
1406  * Returns true if the Cast node casts a class type to a sub type.
1407  */
1408 int is_Cast_downcast(ir_node *node) {
1409   ir_type *totype   = get_Cast_type(node);
1410   ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1411
1412   assert(get_irg_typeinfo_state(get_irn_irg(node)) == ir_typeinfo_consistent);
1413   assert(fromtype);
1414
1415   while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1416     totype   = get_pointer_points_to_type(totype);
1417     fromtype = get_pointer_points_to_type(fromtype);
1418   }
1419
1420   assert(fromtype);
1421
1422   if (!is_Class_type(totype)) return 0;
1423   return is_SubClass_of(totype, fromtype);
1424 }
1425
1426 int
1427 (is_unop)(const ir_node *node) {
1428   return _is_unop(node);
1429 }
1430
1431 ir_node *
1432 get_unop_op (ir_node *node) {
1433   if (node->op->opar == oparity_unary)
1434     return get_irn_n(node, node->op->op_index);
1435
1436   assert(node->op->opar == oparity_unary);
1437   return NULL;
1438 }
1439
1440 void
1441 set_unop_op (ir_node *node, ir_node *op) {
1442   if (node->op->opar == oparity_unary)
1443     set_irn_n(node, node->op->op_index, op);
1444
1445   assert(node->op->opar == oparity_unary);
1446 }
1447
1448 int
1449 (is_binop)(const ir_node *node) {
1450   return _is_binop(node);
1451 }
1452
1453 ir_node *
1454 get_binop_left (ir_node *node) {
1455   if (node->op->opar == oparity_binary)
1456     return get_irn_n(node, node->op->op_index);
1457
1458   assert(node->op->opar == oparity_binary);
1459   return NULL;
1460 }
1461
1462 void
1463 set_binop_left (ir_node *node, ir_node *left) {
1464   if (node->op->opar == oparity_binary)
1465     set_irn_n(node, node->op->op_index, left);
1466
1467   assert (node->op->opar == oparity_binary);
1468 }
1469
1470 ir_node *
1471 get_binop_right (ir_node *node) {
1472   if (node->op->opar == oparity_binary)
1473     return get_irn_n(node, node->op->op_index + 1);
1474
1475   assert(node->op->opar == oparity_binary);
1476   return NULL;
1477 }
1478
1479 void
1480 set_binop_right (ir_node *node, ir_node *right) {
1481   if (node->op->opar == oparity_binary)
1482     set_irn_n(node, node->op->op_index + 1, right);
1483
1484   assert (node->op->opar == oparity_binary);
1485 }
1486
1487 int is_Phi (const ir_node *n) {
1488   ir_op *op;
1489
1490   assert(n);
1491   op = get_irn_op(n);
1492
1493   if (op == op_Filter) return get_interprocedural_view();
1494
1495   if (op == op_Phi)
1496     return  ((get_irg_phase_state(get_irn_irg(n)) !=  phase_building) ||
1497          (get_irn_arity(n) > 0));
1498
1499   return 0;
1500 }
1501
1502 int is_Phi0 (const ir_node *n) {
1503   assert(n);
1504
1505   return ((get_irn_op(n) == op_Phi) &&
1506       (get_irn_arity(n) == 0) &&
1507       (get_irg_phase_state(get_irn_irg(n)) ==  phase_building));
1508 }
1509
1510 ir_node **
1511 get_Phi_preds_arr (ir_node *node) {
1512   assert (node->op == op_Phi);
1513   return (ir_node **)&(get_irn_in(node)[1]);
1514 }
1515
1516 int
1517 get_Phi_n_preds (ir_node *node) {
1518   assert (is_Phi(node) || is_Phi0(node));
1519   return (get_irn_arity(node));
1520 }
1521
1522 /*
1523 void set_Phi_n_preds (ir_node *node, int n_preds) {
1524   assert (node->op == op_Phi);
1525 }
1526 */
1527
1528 ir_node *
1529 get_Phi_pred (ir_node *node, int pos) {
1530   assert (is_Phi(node) || is_Phi0(node));
1531   return get_irn_n(node, pos);
1532 }
1533
1534 void
1535 set_Phi_pred (ir_node *node, int pos, ir_node *pred) {
1536   assert (is_Phi(node) || is_Phi0(node));
1537   set_irn_n(node, pos, pred);
1538 }
1539
1540
1541 int is_memop(ir_node *node) {
1542   return ((get_irn_op(node) == op_Load) || (get_irn_op(node) == op_Store));
1543 }
1544
1545 ir_node *get_memop_mem (ir_node *node) {
1546   assert(is_memop(node));
1547   return get_irn_n(node, 0);
1548 }
1549
1550 void     set_memop_mem (ir_node *node, ir_node *mem) {
1551   assert(is_memop(node));
1552   set_irn_n(node, 0, mem);
1553 }
1554
1555 ir_node *get_memop_ptr (ir_node *node) {
1556   assert(is_memop(node));
1557   return get_irn_n(node, 1);
1558 }
1559
1560 void     set_memop_ptr (ir_node *node, ir_node *ptr) {
1561   assert(is_memop(node));
1562   set_irn_n(node, 1, ptr);
1563 }
1564
1565 ir_node *
1566 get_Load_mem (ir_node *node) {
1567   assert (node->op == op_Load);
1568   return get_irn_n(node, 0);
1569 }
1570
1571 void
1572 set_Load_mem (ir_node *node, ir_node *mem) {
1573   assert (node->op == op_Load);
1574   set_irn_n(node, 0, mem);
1575 }
1576
1577 ir_node *
1578 get_Load_ptr (ir_node *node) {
1579   assert (node->op == op_Load);
1580   return get_irn_n(node, 1);
1581 }
1582
1583 void
1584 set_Load_ptr (ir_node *node, ir_node *ptr) {
1585   assert (node->op == op_Load);
1586   set_irn_n(node, 1, ptr);
1587 }
1588
1589 ir_mode *
1590 get_Load_mode (ir_node *node) {
1591   assert (node->op == op_Load);
1592   return node->attr.load.load_mode;
1593 }
1594
1595 void
1596 set_Load_mode (ir_node *node, ir_mode *mode) {
1597   assert (node->op == op_Load);
1598   node->attr.load.load_mode = mode;
1599 }
1600
1601 ent_volatility
1602 get_Load_volatility (ir_node *node) {
1603   assert (node->op == op_Load);
1604   return node->attr.load.volatility;
1605 }
1606
1607 void
1608 set_Load_volatility (ir_node *node, ent_volatility volatility) {
1609   assert (node->op == op_Load);
1610   node->attr.load.volatility = volatility;
1611 }
1612
1613
1614 ir_node *
1615 get_Store_mem (ir_node *node) {
1616   assert (node->op == op_Store);
1617   return get_irn_n(node, 0);
1618 }
1619
1620 void
1621 set_Store_mem (ir_node *node, ir_node *mem) {
1622   assert (node->op == op_Store);
1623   set_irn_n(node, 0, mem);
1624 }
1625
1626 ir_node *
1627 get_Store_ptr (ir_node *node) {
1628   assert (node->op == op_Store);
1629   return get_irn_n(node, 1);
1630 }
1631
1632 void
1633 set_Store_ptr (ir_node *node, ir_node *ptr) {
1634   assert (node->op == op_Store);
1635   set_irn_n(node, 1, ptr);
1636 }
1637
1638 ir_node *
1639 get_Store_value (ir_node *node) {
1640   assert (node->op == op_Store);
1641   return get_irn_n(node, 2);
1642 }
1643
1644 void
1645 set_Store_value (ir_node *node, ir_node *value) {
1646   assert (node->op == op_Store);
1647   set_irn_n(node, 2, value);
1648 }
1649
1650 ent_volatility
1651 get_Store_volatility (ir_node *node) {
1652   assert (node->op == op_Store);
1653   return node->attr.store.volatility;
1654 }
1655
1656 void
1657 set_Store_volatility (ir_node *node, ent_volatility volatility) {
1658   assert (node->op == op_Store);
1659   node->attr.store.volatility = volatility;
1660 }
1661
1662
1663 ir_node *
1664 get_Alloc_mem (ir_node *node) {
1665   assert (node->op == op_Alloc);
1666   return get_irn_n(node, 0);
1667 }
1668
1669 void
1670 set_Alloc_mem (ir_node *node, ir_node *mem) {
1671   assert (node->op == op_Alloc);
1672   set_irn_n(node, 0, mem);
1673 }
1674
1675 ir_node *
1676 get_Alloc_size (ir_node *node) {
1677   assert (node->op == op_Alloc);
1678   return get_irn_n(node, 1);
1679 }
1680
1681 void
1682 set_Alloc_size (ir_node *node, ir_node *size) {
1683   assert (node->op == op_Alloc);
1684   set_irn_n(node, 1, size);
1685 }
1686
1687 ir_type  *
1688 get_Alloc_type (ir_node *node) {
1689   assert (node->op == op_Alloc);
1690   return node->attr.a.type = skip_tid(node->attr.a.type);
1691 }
1692
1693 void
1694 set_Alloc_type (ir_node *node, ir_type *tp) {
1695   assert (node->op == op_Alloc);
1696   node->attr.a.type = tp;
1697 }
1698
1699 where_alloc
1700 get_Alloc_where (ir_node *node) {
1701   assert (node->op == op_Alloc);
1702   return node->attr.a.where;
1703 }
1704
1705 void
1706 set_Alloc_where (ir_node *node, where_alloc where) {
1707   assert (node->op == op_Alloc);
1708   node->attr.a.where = where;
1709 }
1710
1711
1712 ir_node *
1713 get_Free_mem (ir_node *node) {
1714   assert (node->op == op_Free);
1715   return get_irn_n(node, 0);
1716 }
1717
1718 void
1719 set_Free_mem (ir_node *node, ir_node *mem) {
1720   assert (node->op == op_Free);
1721   set_irn_n(node, 0, mem);
1722 }
1723
1724 ir_node *
1725 get_Free_ptr (ir_node *node) {
1726   assert (node->op == op_Free);
1727   return get_irn_n(node, 1);
1728 }
1729
1730 void
1731 set_Free_ptr (ir_node *node, ir_node *ptr) {
1732   assert (node->op == op_Free);
1733   set_irn_n(node, 1, ptr);
1734 }
1735
1736 ir_node *
1737 get_Free_size (ir_node *node) {
1738   assert (node->op == op_Free);
1739   return get_irn_n(node, 2);
1740 }
1741
1742 void
1743 set_Free_size (ir_node *node, ir_node *size) {
1744   assert (node->op == op_Free);
1745   set_irn_n(node, 2, size);
1746 }
1747
1748 ir_type *
1749 get_Free_type (ir_node *node) {
1750   assert (node->op == op_Free);
1751   return node->attr.f.type = skip_tid(node->attr.f.type);
1752 }
1753
1754 void
1755 set_Free_type (ir_node *node, ir_type *tp) {
1756   assert (node->op == op_Free);
1757   node->attr.f.type = tp;
1758 }
1759
1760 where_alloc
1761 get_Free_where (ir_node *node) {
1762   assert (node->op == op_Free);
1763   return node->attr.f.where;
1764 }
1765
1766 void
1767 set_Free_where (ir_node *node, where_alloc where) {
1768   assert (node->op == op_Free);
1769   node->attr.f.where = where;
1770 }
1771
1772 ir_node **get_Sync_preds_arr (ir_node *node) {
1773   assert (node->op == op_Sync);
1774   return (ir_node **)&(get_irn_in(node)[1]);
1775 }
1776
1777 int get_Sync_n_preds (ir_node *node) {
1778   assert(node->op == op_Sync);
1779   return (get_irn_arity(node));
1780 }
1781
1782 /*
1783 void set_Sync_n_preds (ir_node *node, int n_preds) {
1784   assert (node->op == op_Sync);
1785 }
1786 */
1787
1788 ir_node *get_Sync_pred (ir_node *node, int pos) {
1789   assert(node->op == op_Sync);
1790   return get_irn_n(node, pos);
1791 }
1792
1793 void set_Sync_pred (ir_node *node, int pos, ir_node *pred) {
1794   assert(node->op == op_Sync);
1795   set_irn_n(node, pos, pred);
1796 }
1797
1798 /* Add a new Sync predecessor */
1799 void add_Sync_pred (ir_node *node, ir_node *pred) {
1800   int l;
1801   ir_graph *irg = get_irn_irg(node);
1802
1803   assert(node->op == op_Sync);
1804   l = ARR_LEN(node->in);
1805   ARR_APP1(ir_node *, node->in, pred);
1806   edges_notify_edge(node, l, node->in[l], NULL, irg);
1807 }
1808
1809 /* Returns the source language type of a Proj node. */
1810 ir_type *get_Proj_type(ir_node *n)
1811 {
1812   ir_type *tp   = firm_unknown_type;
1813   ir_node *pred = get_Proj_pred(n);
1814
1815   switch (get_irn_opcode(pred)) {
1816   case iro_Proj: {
1817     ir_node *pred_pred;
1818     /* Deal with Start / Call here: we need to know the Proj Nr. */
1819     assert(get_irn_mode(pred) == mode_T);
1820     pred_pred = get_Proj_pred(pred);
1821     if (get_irn_op(pred_pred) == op_Start)  {
1822       ir_type *mtp = get_entity_type(get_irg_entity(get_irn_irg(pred_pred)));
1823       tp = get_method_param_type(mtp, get_Proj_proj(n));
1824     } else if (get_irn_op(pred_pred) == op_Call) {
1825       ir_type *mtp = get_Call_type(pred_pred);
1826       tp = get_method_res_type(mtp, get_Proj_proj(n));
1827     }
1828   } break;
1829   case iro_Start: break;
1830   case iro_Call: break;
1831   case iro_Load: {
1832     ir_node *a = get_Load_ptr(pred);
1833     if (is_Sel(a))
1834       tp = get_entity_type(get_Sel_entity(a));
1835   } break;
1836   default:
1837     break;
1838   }
1839   return tp;
1840 }
1841
1842 ir_node *
1843 get_Proj_pred (const ir_node *node) {
1844   assert (is_Proj(node));
1845   return get_irn_n(node, 0);
1846 }
1847
1848 void
1849 set_Proj_pred (ir_node *node, ir_node *pred) {
1850   assert (is_Proj(node));
1851   set_irn_n(node, 0, pred);
1852 }
1853
1854 long
1855 get_Proj_proj (const ir_node *node) {
1856   assert (is_Proj(node));
1857   if (get_irn_opcode(node) == iro_Proj) {
1858     return node->attr.proj;
1859   } else {
1860     assert(get_irn_opcode(node) == iro_Filter);
1861     return node->attr.filter.proj;
1862   }
1863 }
1864
1865 void
1866 set_Proj_proj (ir_node *node, long proj) {
1867   assert (node->op == op_Proj);
1868   node->attr.proj = proj;
1869 }
1870
1871 ir_node **
1872 get_Tuple_preds_arr (ir_node *node) {
1873   assert (node->op == op_Tuple);
1874   return (ir_node **)&(get_irn_in(node)[1]);
1875 }
1876
1877 int
1878 get_Tuple_n_preds (ir_node *node) {
1879   assert (node->op == op_Tuple);
1880   return (get_irn_arity(node));
1881 }
1882
1883 /*
1884 void
1885 set_Tuple_n_preds (ir_node *node, int n_preds) {
1886   assert (node->op == op_Tuple);
1887 }
1888 */
1889
1890 ir_node *
1891 get_Tuple_pred (ir_node *node, int pos) {
1892   assert (node->op == op_Tuple);
1893   return get_irn_n(node, pos);
1894 }
1895
1896 void
1897 set_Tuple_pred (ir_node *node, int pos, ir_node *pred) {
1898   assert (node->op == op_Tuple);
1899   set_irn_n(node, pos, pred);
1900 }
1901
1902 ir_node *
1903 get_Id_pred (ir_node *node) {
1904   assert (node->op == op_Id);
1905   return get_irn_n(node, 0);
1906 }
1907
1908 void
1909 set_Id_pred (ir_node *node, ir_node *pred) {
1910   assert (node->op == op_Id);
1911   set_irn_n(node, 0, pred);
1912 }
1913
1914 ir_node *get_Confirm_value (ir_node *node) {
1915   assert (node->op == op_Confirm);
1916   return get_irn_n(node, 0);
1917 }
1918 void     set_Confirm_value (ir_node *node, ir_node *value) {
1919   assert (node->op == op_Confirm);
1920   set_irn_n(node, 0, value);
1921 }
1922 ir_node *get_Confirm_bound (ir_node *node) {
1923   assert (node->op == op_Confirm);
1924   return get_irn_n(node, 1);
1925 }
1926 void     set_Confirm_bound (ir_node *node, ir_node *bound) {
1927   assert (node->op == op_Confirm);
1928   set_irn_n(node, 0, bound);
1929 }
1930 pn_Cmp   get_Confirm_cmp   (ir_node *node) {
1931   assert (node->op == op_Confirm);
1932   return node->attr.confirm_cmp;
1933 }
1934 void     set_Confirm_cmp   (ir_node *node, pn_Cmp cmp) {
1935   assert (node->op == op_Confirm);
1936   node->attr.confirm_cmp = cmp;
1937 }
1938
1939
1940 ir_node *
1941 get_Filter_pred (ir_node *node) {
1942   assert(node->op == op_Filter);
1943   return node->in[1];
1944 }
1945 void
1946 set_Filter_pred (ir_node *node, ir_node *pred) {
1947   assert(node->op == op_Filter);
1948   node->in[1] = pred;
1949 }
1950 long
1951 get_Filter_proj(ir_node *node) {
1952   assert(node->op == op_Filter);
1953   return node->attr.filter.proj;
1954 }
1955 void
1956 set_Filter_proj (ir_node *node, long proj) {
1957   assert(node->op == op_Filter);
1958   node->attr.filter.proj = proj;
1959 }
1960
1961 /* Don't use get_irn_arity, get_irn_n in implementation as access
1962    shall work independent of view!!! */
1963 void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in) {
1964   assert(node->op == op_Filter);
1965   if (node->attr.filter.in_cg == NULL || arity != ARR_LEN(node->attr.filter.in_cg) - 1) {
1966     node->attr.filter.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
1967     node->attr.filter.backedge = NEW_ARR_D (int, current_ir_graph->obst, arity);
1968     memset(node->attr.filter.backedge, 0, sizeof(int) * arity);
1969     node->attr.filter.in_cg[0] = node->in[0];
1970   }
1971   memcpy(node->attr.filter.in_cg + 1, in, sizeof(ir_node *) * arity);
1972 }
1973
1974 void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred) {
1975   assert(node->op == op_Filter && node->attr.filter.in_cg &&
1976      0 <= pos && pos < ARR_LEN(node->attr.filter.in_cg) - 1);
1977   node->attr.filter.in_cg[pos + 1] = pred;
1978 }
1979 int get_Filter_n_cg_preds(ir_node *node) {
1980   assert(node->op == op_Filter && node->attr.filter.in_cg);
1981   return (ARR_LEN(node->attr.filter.in_cg) - 1);
1982 }
1983 ir_node *get_Filter_cg_pred(ir_node *node, int pos) {
1984   int arity;
1985   assert(node->op == op_Filter && node->attr.filter.in_cg &&
1986      0 <= pos);
1987   arity = ARR_LEN(node->attr.filter.in_cg);
1988   assert(pos <  arity - 1);
1989   return node->attr.filter.in_cg[pos + 1];
1990 }
1991
1992 /* Mux support */
1993 ir_node *get_Mux_sel   (ir_node *node) {
1994   if (node->op == op_Psi) {
1995     assert(get_irn_arity(node) == 3);
1996     return get_Psi_cond(node, 0);
1997   }
1998   assert(node->op == op_Mux);
1999   return node->in[1];
2000 }
2001 void     set_Mux_sel   (ir_node *node, ir_node *sel) {
2002   if (node->op == op_Psi) {
2003     assert(get_irn_arity(node) == 3);
2004     set_Psi_cond(node, 0, sel);
2005   }
2006   else {
2007     assert(node->op == op_Mux);
2008     node->in[1] = sel;
2009   }
2010 }
2011
2012 ir_node *get_Mux_false (ir_node *node) {
2013   if (node->op == op_Psi) {
2014     assert(get_irn_arity(node) == 3);
2015     return get_Psi_default(node);
2016   }
2017   assert(node->op == op_Mux);
2018   return node->in[2];
2019 }
2020 void     set_Mux_false (ir_node *node, ir_node *ir_false) {
2021   if (node->op == op_Psi) {
2022     assert(get_irn_arity(node) == 3);
2023     set_Psi_default(node, ir_false);
2024   }
2025   else {
2026     assert(node->op == op_Mux);
2027     node->in[2] = ir_false;
2028   }
2029 }
2030
2031 ir_node *get_Mux_true  (ir_node *node) {
2032   if (node->op == op_Psi) {
2033     assert(get_irn_arity(node) == 3);
2034     return get_Psi_val(node, 0);
2035   }
2036   assert(node->op == op_Mux);
2037   return node->in[3];
2038 }
2039 void     set_Mux_true  (ir_node *node, ir_node *ir_true) {
2040   if (node->op == op_Psi) {
2041     assert(get_irn_arity(node) == 3);
2042     set_Psi_val(node, 0, ir_true);
2043   }
2044   else {
2045     assert(node->op == op_Mux);
2046     node->in[3] = ir_true;
2047   }
2048 }
2049
2050 /* Psi support */
2051 ir_node *get_Psi_cond   (ir_node *node, int pos) {
2052   int num_conds = get_Psi_n_conds(node);
2053   assert(node->op == op_Psi);
2054   assert(pos < num_conds);
2055         return get_irn_n(node, 2 * pos);
2056 }
2057
2058 void     set_Psi_cond   (ir_node *node, int pos, ir_node *cond) {
2059   int num_conds = get_Psi_n_conds(node);
2060   assert(node->op == op_Psi);
2061   assert(pos < num_conds);
2062         set_irn_n(node, 2 * pos, cond);
2063 }
2064
2065 ir_node *get_Psi_val    (ir_node *node, int pos) {
2066   int num_vals = get_Psi_n_conds(node);
2067   assert(node->op == op_Psi);
2068   assert(pos < num_vals);
2069         return get_irn_n(node, 2 * pos + 1);
2070 }
2071
2072 void     set_Psi_val    (ir_node *node, int pos, ir_node *val) {
2073   int num_vals = get_Psi_n_conds(node);
2074   assert(node->op == op_Psi);
2075   assert(pos < num_vals);
2076         set_irn_n(node, 2 * pos + 1, val);
2077 }
2078
2079 ir_node *get_Psi_default(ir_node *node) {
2080   int def_pos = get_irn_arity(node) - 1;
2081   assert(node->op == op_Psi);
2082         return get_irn_n(node, def_pos);
2083 }
2084
2085 void     set_Psi_default(ir_node *node, ir_node *val) {
2086   int def_pos = get_irn_arity(node);
2087   assert(node->op == op_Psi);
2088         set_irn_n(node, def_pos, val);
2089 }
2090
2091 int (get_Psi_n_conds)(ir_node *node) {
2092   return _get_Psi_n_conds(node);
2093 }
2094
2095 /* CopyB support */
2096 ir_node *get_CopyB_mem (ir_node *node) {
2097   assert (node->op == op_CopyB);
2098   return get_irn_n(node, 0);
2099 }
2100
2101 void     set_CopyB_mem (ir_node *node, ir_node *mem) {
2102   assert (node->op == op_CopyB);
2103   set_irn_n(node, 0, mem);
2104 }
2105
2106 ir_node *get_CopyB_dst (ir_node *node) {
2107   assert (node->op == op_CopyB);
2108   return get_irn_n(node, 1);
2109 }
2110
2111 void     set_CopyB_dst (ir_node *node, ir_node *dst) {
2112   assert (node->op == op_CopyB);
2113   set_irn_n(node, 1, dst);
2114 }
2115
2116 ir_node *get_CopyB_src (ir_node *node) {
2117   assert (node->op == op_CopyB);
2118   return get_irn_n(node, 2);
2119 }
2120
2121 void     set_CopyB_src (ir_node *node, ir_node *src) {
2122   assert (node->op == op_CopyB);
2123   set_irn_n(node, 2, src);
2124 }
2125
2126 ir_type *get_CopyB_type(ir_node *node) {
2127   assert (node->op == op_CopyB);
2128   return node->attr.copyb.data_type;
2129 }
2130
2131 void     set_CopyB_type(ir_node *node, ir_type *data_type) {
2132   assert (node->op == op_CopyB && data_type);
2133   node->attr.copyb.data_type = data_type;
2134 }
2135
2136
2137 ir_type *
2138 get_InstOf_type (ir_node *node) {
2139   assert (node->op = op_InstOf);
2140   return node->attr.io.type;
2141 }
2142
2143 void
2144 set_InstOf_type (ir_node *node, ir_type *type) {
2145   assert (node->op = op_InstOf);
2146   node->attr.io.type = type;
2147 }
2148
2149 ir_node *
2150 get_InstOf_store (ir_node *node) {
2151   assert (node->op = op_InstOf);
2152   return get_irn_n(node, 0);
2153 }
2154
2155 void
2156 set_InstOf_store (ir_node *node, ir_node *obj) {
2157   assert (node->op = op_InstOf);
2158   set_irn_n(node, 0, obj);
2159 }
2160
2161 ir_node *
2162 get_InstOf_obj (ir_node *node) {
2163   assert (node->op = op_InstOf);
2164   return get_irn_n(node, 1);
2165 }
2166
2167 void
2168 set_InstOf_obj (ir_node *node, ir_node *obj) {
2169   assert (node->op = op_InstOf);
2170   set_irn_n(node, 1, obj);
2171 }
2172
2173 /* Returns the memory input of a Raise operation. */
2174 ir_node *
2175 get_Raise_mem (ir_node *node) {
2176   assert (node->op == op_Raise);
2177   return get_irn_n(node, 0);
2178 }
2179
2180 void
2181 set_Raise_mem (ir_node *node, ir_node *mem) {
2182   assert (node->op == op_Raise);
2183   set_irn_n(node, 0, mem);
2184 }
2185
2186 ir_node *
2187 get_Raise_exo_ptr (ir_node *node) {
2188   assert (node->op == op_Raise);
2189   return get_irn_n(node, 1);
2190 }
2191
2192 void
2193 set_Raise_exo_ptr (ir_node *node, ir_node *exo_ptr) {
2194   assert (node->op == op_Raise);
2195   set_irn_n(node, 1, exo_ptr);
2196 }
2197
2198 /* Bound support */
2199
2200 /* Returns the memory input of a Bound operation. */
2201 ir_node *get_Bound_mem(ir_node *bound) {
2202   assert (bound->op == op_Bound);
2203   return get_irn_n(bound, 0);
2204 }
2205
2206 void     set_Bound_mem (ir_node *bound, ir_node *mem) {
2207   assert (bound->op == op_Bound);
2208   set_irn_n(bound, 0, mem);
2209 }
2210
2211 /* Returns the index input of a Bound operation. */
2212 ir_node *get_Bound_index(ir_node *bound) {
2213   assert (bound->op == op_Bound);
2214   return get_irn_n(bound, 1);
2215 }
2216
2217 void     set_Bound_index(ir_node *bound, ir_node *idx) {
2218   assert (bound->op == op_Bound);
2219   set_irn_n(bound, 1, idx);
2220 }
2221
2222 /* Returns the lower bound input of a Bound operation. */
2223 ir_node *get_Bound_lower(ir_node *bound) {
2224   assert (bound->op == op_Bound);
2225   return get_irn_n(bound, 2);
2226 }
2227
2228 void     set_Bound_lower(ir_node *bound, ir_node *lower) {
2229   assert (bound->op == op_Bound);
2230   set_irn_n(bound, 2, lower);
2231 }
2232
2233 /* Returns the upper bound input of a Bound operation. */
2234 ir_node *get_Bound_upper(ir_node *bound) {
2235   assert (bound->op == op_Bound);
2236   return get_irn_n(bound, 3);
2237 }
2238
2239 void     set_Bound_upper(ir_node *bound, ir_node *upper) {
2240   assert (bound->op == op_Bound);
2241   set_irn_n(bound, 3, upper);
2242 }
2243
2244 /* returns the graph of a node */
2245 ir_graph *
2246 get_irn_irg(const ir_node *node) {
2247         /*
2248          * Do not use get_nodes_Block() here, because this
2249          * will check the pinned state.
2250          * However even a 'wrong' block is always in the proper
2251          * irg.
2252          */
2253   if (! is_Block(node))
2254     node = get_irn_n(node, -1);
2255   if (is_Bad(node))  /* sometimes bad is predecessor of nodes instead of block: in case of optimization */
2256     node = get_irn_n(node, -1);
2257   assert(get_irn_op(node) == op_Block);
2258   return node->attr.block.irg;
2259 }
2260
2261
2262 /*----------------------------------------------------------------*/
2263 /*  Auxiliary routines                                            */
2264 /*----------------------------------------------------------------*/
2265
2266 ir_node *
2267 skip_Proj (ir_node *node) {
2268   /* don't assert node !!! */
2269   if (node && is_Proj(node)) {
2270     return get_Proj_pred(node);
2271   } else {
2272     return node;
2273   }
2274 }
2275
2276 ir_node *
2277 skip_Tuple (ir_node *node) {
2278   ir_node *pred;
2279   ir_op   *op;
2280
2281   if (!get_opt_normalize()) return node;
2282
2283 restart:
2284   node = skip_Id(node);
2285   if (get_irn_op(node) == op_Proj) {
2286     pred = skip_Id(get_Proj_pred(node));
2287     op   = get_irn_op(pred);
2288
2289     /*
2290      * Looks strange but calls get_irn_op() only once
2291      * in most often cases.
2292      */
2293     if (op == op_Proj) { /* nested Tuple ? */
2294       pred = skip_Id(skip_Tuple(pred));
2295       op   = get_irn_op(pred);
2296
2297       if (op == op_Tuple) {
2298         node = get_Tuple_pred(pred, get_Proj_proj(node));
2299         goto restart;
2300       }
2301     }
2302     else if (op == op_Tuple) {
2303       node = get_Tuple_pred(pred, get_Proj_proj(node));
2304       goto restart;
2305     }
2306   }
2307   return node;
2308 }
2309
2310 /* returns operand of node if node is a Cast */
2311 ir_node *skip_Cast  (ir_node *node) {
2312   if (node && get_irn_op(node) == op_Cast)
2313     return get_Cast_op(node);
2314   return node;
2315 }
2316
2317 /* returns operand of node if node is a Confirm */
2318 ir_node *skip_Confirm  (ir_node *node) {
2319   if (node && get_irn_op(node) == op_Confirm)
2320     return get_Confirm_value(node);
2321   return node;
2322 }
2323
2324 /* skip all high-level ops */
2325 ir_node *skip_HighLevel(ir_node *node) {
2326   if (node && is_op_highlevel(get_irn_op(node)))
2327     return get_irn_n(node, 0);
2328   return node;
2329 }
2330
2331 #if 0
2332 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2333  * than any other approach, as Id chains are resolved and all point to the real node, or
2334  * all id's are self loops.
2335  *
2336  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2337  */
2338 ir_node *
2339 skip_Id (ir_node *node) {
2340   /* don't assert node !!! */
2341
2342   /* Don't use get_Id_pred:  We get into an endless loop for
2343      self-referencing Ids. */
2344   if (node && (node->op == op_Id) && (node != node->in[0+1])) {
2345     ir_node *rem_pred = node->in[0+1];
2346     ir_node *res;
2347
2348     assert (get_irn_arity (node) > 0);
2349
2350     node->in[0+1] = node;
2351     res = skip_Id(rem_pred);
2352     if (res->op == op_Id) /* self-loop */ return node;
2353
2354     node->in[0+1] = res;
2355     return res;
2356   } else {
2357     return node;
2358   }
2359 }
2360 #else
2361 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2362  * than any other approach, as Id chains are resolved and all point to the real node, or
2363  * all id's are self loops.
2364  *
2365  * Note: This function takes 10% of mostly ANY the compiler run, so it's
2366  * a little bit "hand optimized".
2367  *
2368  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2369  */
2370 ir_node *
2371 skip_Id (ir_node *node) {
2372   ir_node *pred;
2373   /* don't assert node !!! */
2374
2375   if (!node || (node->op != op_Id)) return node;
2376
2377   /* Don't use get_Id_pred():  We get into an endless loop for
2378      self-referencing Ids. */
2379   pred = node->in[0+1];
2380
2381   if (pred->op != op_Id) return pred;
2382
2383   if (node != pred) {  /* not a self referencing Id. Resolve Id chain. */
2384     ir_node *rem_pred, *res;
2385
2386     if (pred->op != op_Id) return pred; /* shortcut */
2387     rem_pred = pred;
2388
2389     assert (get_irn_arity (node) > 0);
2390
2391     node->in[0+1] = node;   /* turn us into a self referencing Id:  shorten Id cycles. */
2392     res = skip_Id(rem_pred);
2393     if (res->op == op_Id) /* self-loop */ return node;
2394
2395     node->in[0+1] = res;    /* Turn Id chain into Ids all referencing the chain end. */
2396     return res;
2397   } else {
2398     return node;
2399   }
2400 }
2401 #endif
2402
2403 void skip_Id_and_store(ir_node **node) {
2404   ir_node *n = *node;
2405
2406   if (!n || (n->op != op_Id)) return;
2407
2408   /* Don't use get_Id_pred():  We get into an endless loop for
2409      self-referencing Ids. */
2410   *node = skip_Id(n);
2411 }
2412
2413 int
2414 (is_Bad)(const ir_node *node) {
2415   return _is_Bad(node);
2416 }
2417
2418 int
2419 (is_Const)(const ir_node *node) {
2420         return _is_Const(node);
2421 }
2422
2423 int
2424 (is_no_Block)(const ir_node *node) {
2425   return _is_no_Block(node);
2426 }
2427
2428 int
2429 (is_Block)(const ir_node *node) {
2430   return _is_Block(node);
2431 }
2432
2433 /* returns true if node is an Unknown node. */
2434 int
2435 (is_Unknown)(const ir_node *node) {
2436   return _is_Unknown(node);
2437 }
2438
2439 /* returns true if node is a Return node. */
2440 int
2441 (is_Return)(const ir_node *node) {
2442   return _is_Return(node);
2443 }
2444
2445 /* returns true if node is a Call node. */
2446 int
2447 (is_Call)(const ir_node *node) {
2448   return _is_Call(node);
2449 }
2450
2451 /* returns true if node is a Sel node. */
2452 int
2453 (is_Sel)(const ir_node *node) {
2454   return _is_Sel(node);
2455 }
2456
2457 /* returns true if node is a Mux node or a Psi with only one condition. */
2458 int
2459 (is_Mux)(const ir_node *node) {
2460   return _is_Mux(node);
2461 }
2462
2463 /* returns true if node is a Load node. */
2464 int
2465 (is_Load)(const ir_node *node) {
2466   return _is_Load(node);
2467 }
2468
2469 /* returns true if node is a Sync node. */
2470 int
2471 (is_Sync)(const ir_node *node) {
2472   return _is_Sync(node);
2473 }
2474
2475 /* returns true if node is a Confirm node. */
2476 int
2477 (is_Confirm)(const ir_node *node) {
2478   return _is_Confirm(node);
2479 }
2480
2481 int
2482 is_Proj (const ir_node *node) {
2483   assert(node);
2484   return node->op == op_Proj
2485     || (!get_interprocedural_view() && node->op == op_Filter);
2486 }
2487
2488 /* Returns true if the operation manipulates control flow. */
2489 int
2490 is_cfop(const ir_node *node) {
2491   return is_cfopcode(get_irn_op(node));
2492 }
2493
2494 /* Returns true if the operation manipulates interprocedural control flow:
2495    CallBegin, EndReg, EndExcept */
2496 int is_ip_cfop(const ir_node *node) {
2497   return is_ip_cfopcode(get_irn_op(node));
2498 }
2499
2500 /* Returns true if the operation can change the control flow because
2501    of an exception. */
2502 int
2503 is_fragile_op(const ir_node *node) {
2504   return is_op_fragile(get_irn_op(node));
2505 }
2506
2507 /* Returns the memory operand of fragile operations. */
2508 ir_node *get_fragile_op_mem(ir_node *node) {
2509   assert(node && is_fragile_op(node));
2510
2511   switch (get_irn_opcode (node)) {
2512   case iro_Call  :
2513   case iro_Quot  :
2514   case iro_DivMod:
2515   case iro_Div   :
2516   case iro_Mod   :
2517   case iro_Load  :
2518   case iro_Store :
2519   case iro_Alloc :
2520     return get_irn_n(node, 0);
2521   case iro_Bad   :
2522   case iro_Unknown:
2523     return node;
2524   default: ;
2525     assert(0 && "should not be reached");
2526     return NULL;
2527   }
2528 }
2529
2530 /* Returns true if the operation is a forking control flow operation. */
2531 int (is_irn_forking)(const ir_node *node) {
2532   return _is_irn_forking(node);
2533 }
2534
2535 /* Return the type associated with the value produced by n
2536  * if the node remarks this type as it is the case for
2537  * Cast, Const, SymConst and some Proj nodes. */
2538 ir_type *(get_irn_type)(ir_node *node) {
2539   return _get_irn_type(node);
2540 }
2541
2542 /* Return the type attribute of a node n (SymConst, Call, Alloc, Free,
2543    Cast) or NULL.*/
2544 ir_type *(get_irn_type_attr)(ir_node *node) {
2545   return _get_irn_type_attr(node);
2546 }
2547
2548 /* Return the entity attribute of a node n (SymConst, Sel) or NULL. */
2549 entity *(get_irn_entity_attr)(ir_node *node) {
2550   return _get_irn_entity_attr(node);
2551 }
2552
2553 /* Returns non-zero for constant-like nodes. */
2554 int (is_irn_constlike)(const ir_node *node) {
2555   return _is_irn_constlike(node);
2556 }
2557
2558 /*
2559  * Returns non-zero for nodes that are allowed to have keep-alives and
2560  * are neither Block nor PhiM.
2561  */
2562 int (is_irn_keep)(const ir_node *node) {
2563   return _is_irn_keep(node);
2564 }
2565
2566 /* Returns non-zero for nodes that are machine operations. */
2567 int (is_irn_machine_op)(const ir_node *node) {
2568         return _is_irn_machine_op(node);
2569 }
2570
2571 /* Returns non-zero for nodes that are machine operands. */
2572 int (is_irn_machine_operand)(const ir_node *node) {
2573         return _is_irn_machine_operand(node);
2574 }
2575
2576 /* Returns non-zero for nodes that have the n'th user machine flag set. */
2577 int (is_irn_machine_user)(const ir_node *node, unsigned n) {
2578         return _is_irn_machine_user(node, n);
2579 }
2580
2581
2582 /* Gets the string representation of the jump prediction .*/
2583 const char *get_cond_jmp_predicate_name(cond_jmp_predicate pred)
2584 {
2585   switch (pred) {
2586   default:
2587   case COND_JMP_PRED_NONE:  return "no prediction";
2588   case COND_JMP_PRED_TRUE:  return "true taken";
2589   case COND_JMP_PRED_FALSE: return "false taken";
2590   }
2591 }
2592
2593 /* Returns the conditional jump prediction of a Cond node. */
2594 cond_jmp_predicate (get_Cond_jmp_pred)(ir_node *cond) {
2595   return _get_Cond_jmp_pred(cond);
2596 }
2597
2598 /* Sets a new conditional jump prediction. */
2599 void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) {
2600   _set_Cond_jmp_pred(cond, pred);
2601 }
2602
2603 /** the get_type operation must be always implemented and return a firm type */
2604 static ir_type *get_Default_type(ir_node *n) {
2605   return get_unknown_type();
2606 }
2607
2608 /* Sets the get_type operation for an ir_op_ops. */
2609 ir_op_ops *firm_set_default_get_type(opcode code, ir_op_ops *ops)
2610 {
2611   switch (code) {
2612   case iro_Const:    ops->get_type = get_Const_type; break;
2613   case iro_SymConst: ops->get_type = get_SymConst_value_type; break;
2614   case iro_Cast:     ops->get_type = get_Cast_type; break;
2615   case iro_Proj:     ops->get_type = get_Proj_type; break;
2616   default:
2617     /* not allowed to be NULL */
2618     if (! ops->get_type)
2619       ops->get_type = get_Default_type;
2620     break;
2621   }
2622   return ops;
2623 }
2624
2625 /** Return the attribute type of a SymConst node if exists */
2626 static ir_type *get_SymConst_attr_type(ir_node *self) {
2627   symconst_kind kind = get_SymConst_kind(self);
2628   if (SYMCONST_HAS_TYPE(kind))
2629     return get_SymConst_type(self);
2630   return NULL;
2631 }
2632
2633 /** Return the attribute entity of a SymConst node if exists */
2634 static entity *get_SymConst_attr_entity(ir_node *self) {
2635   symconst_kind kind = get_SymConst_kind(self);
2636   if (SYMCONST_HAS_ENT(kind))
2637     return get_SymConst_entity(self);
2638   return NULL;
2639 }
2640
2641 /** the get_type_attr operation must be always implemented */
2642 static ir_type *get_Null_type(ir_node *n) {
2643   return firm_unknown_type;
2644 }
2645
2646 /* Sets the get_type operation for an ir_op_ops. */
2647 ir_op_ops *firm_set_default_get_type_attr(opcode code, ir_op_ops *ops)
2648 {
2649   switch (code) {
2650   case iro_SymConst: ops->get_type_attr = get_SymConst_attr_type; break;
2651   case iro_Call:     ops->get_type_attr = get_Call_type; break;
2652   case iro_Alloc:    ops->get_type_attr = get_Alloc_type; break;
2653   case iro_Free:     ops->get_type_attr = get_Free_type; break;
2654   case iro_Cast:     ops->get_type_attr = get_Cast_type; break;
2655   default:
2656     /* not allowed to be NULL */
2657     if (! ops->get_type_attr)
2658       ops->get_type_attr = get_Null_type;
2659     break;
2660   }
2661   return ops;
2662 }
2663
2664 /** the get_entity_attr operation must be always implemented */
2665 static entity *get_Null_ent(ir_node *n) {
2666   return NULL;
2667 }
2668
2669 /* Sets the get_type operation for an ir_op_ops. */
2670 ir_op_ops *firm_set_default_get_entity_attr(opcode code, ir_op_ops *ops)
2671 {
2672   switch (code) {
2673   case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break;
2674   case iro_Sel:      ops->get_entity_attr = get_Sel_entity; break;
2675   default:
2676     /* not allowed to be NULL */
2677     if (! ops->get_entity_attr)
2678       ops->get_entity_attr = get_Null_ent;
2679     break;
2680   }
2681   return ops;
2682 }
2683
2684 #ifdef DEBUG_libfirm
2685 void dump_irn (ir_node *n) {
2686   int i, arity = get_irn_arity(n);
2687   printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n);
2688   if (!is_Block(n)) {
2689     ir_node *pred = get_irn_n(n, -1);
2690     printf("  block: %s%s: %ld (%p)\n", get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2691        get_irn_node_nr(pred), (void *)pred);
2692   }
2693   printf("  preds: \n");
2694   for (i = 0; i < arity; ++i) {
2695     ir_node *pred = get_irn_n(n, i);
2696     printf("    %d: %s%s: %ld (%p)\n", i, get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2697        get_irn_node_nr(pred), (void *)pred);
2698   }
2699 }
2700
2701 #else  /* DEBUG_libfirm */
2702 void dump_irn (ir_node *n) {}
2703 #endif /* DEBUG_libfirm */