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