add some is_*() functions
[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)(const 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 /* Return the operand of a Pin node. */
2266 ir_node *get_Pin_op(ir_node *pin) {
2267   assert(pin->op == op_Pin);
2268   return get_irn_n(pin, 0);
2269 }
2270
2271 void    set_Pin_op(ir_node *pin, ir_node *node) {
2272   assert(pin->op == op_Pin);
2273   set_irn_n(pin, 0, node);
2274 }
2275
2276
2277 /* returns the graph of a node */
2278 ir_graph *
2279 get_irn_irg(const ir_node *node) {
2280         /*
2281          * Do not use get_nodes_Block() here, because this
2282          * will check the pinned state.
2283          * However even a 'wrong' block is always in the proper
2284          * irg.
2285          */
2286   if (! is_Block(node))
2287     node = get_irn_n(node, -1);
2288   if (is_Bad(node))  /* sometimes bad is predecessor of nodes instead of block: in case of optimization */
2289     node = get_irn_n(node, -1);
2290   assert(get_irn_op(node) == op_Block);
2291   return node->attr.block.irg;
2292 }
2293
2294
2295 /*----------------------------------------------------------------*/
2296 /*  Auxiliary routines                                            */
2297 /*----------------------------------------------------------------*/
2298
2299 ir_node *
2300 skip_Proj (ir_node *node) {
2301   /* don't assert node !!! */
2302   if (node && is_Proj(node)) {
2303     return get_Proj_pred(node);
2304   } else {
2305     return node;
2306   }
2307 }
2308
2309 ir_node *
2310 skip_Tuple (ir_node *node) {
2311   ir_node *pred;
2312   ir_op   *op;
2313
2314   if (!get_opt_normalize()) return node;
2315
2316 restart:
2317   node = skip_Id(node);
2318   if (get_irn_op(node) == op_Proj) {
2319     pred = skip_Id(get_Proj_pred(node));
2320     op   = get_irn_op(pred);
2321
2322     /*
2323      * Looks strange but calls get_irn_op() only once
2324      * in most often cases.
2325      */
2326     if (op == op_Proj) { /* nested Tuple ? */
2327       pred = skip_Id(skip_Tuple(pred));
2328       op   = get_irn_op(pred);
2329
2330       if (op == op_Tuple) {
2331         node = get_Tuple_pred(pred, get_Proj_proj(node));
2332         goto restart;
2333       }
2334     }
2335     else if (op == op_Tuple) {
2336       node = get_Tuple_pred(pred, get_Proj_proj(node));
2337       goto restart;
2338     }
2339   }
2340   return node;
2341 }
2342
2343 /* returns operand of node if node is a Cast */
2344 ir_node *skip_Cast  (ir_node *node) {
2345   if (node && get_irn_op(node) == op_Cast)
2346     return get_Cast_op(node);
2347   return node;
2348 }
2349
2350 /* returns operand of node if node is a Confirm */
2351 ir_node *skip_Confirm  (ir_node *node) {
2352   if (node && get_irn_op(node) == op_Confirm)
2353     return get_Confirm_value(node);
2354   return node;
2355 }
2356
2357 /* skip all high-level ops */
2358 ir_node *skip_HighLevel(ir_node *node) {
2359   if (node && is_op_highlevel(get_irn_op(node)))
2360     return get_irn_n(node, 0);
2361   return node;
2362 }
2363
2364 #if 0
2365 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2366  * than any other approach, as Id chains are resolved and all point to the real node, or
2367  * all id's are self loops.
2368  *
2369  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2370  */
2371 ir_node *
2372 skip_Id (ir_node *node) {
2373   /* don't assert node !!! */
2374
2375   /* Don't use get_Id_pred:  We get into an endless loop for
2376      self-referencing Ids. */
2377   if (node && (node->op == op_Id) && (node != node->in[0+1])) {
2378     ir_node *rem_pred = node->in[0+1];
2379     ir_node *res;
2380
2381     assert(get_irn_arity (node) > 0);
2382
2383     node->in[0+1] = node;
2384     res = skip_Id(rem_pred);
2385     if (res->op == op_Id) /* self-loop */ return node;
2386
2387     node->in[0+1] = res;
2388     return res;
2389   } else {
2390     return node;
2391   }
2392 }
2393 #else
2394 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2395  * than any other approach, as Id chains are resolved and all point to the real node, or
2396  * all id's are self loops.
2397  *
2398  * Note: This function takes 10% of mostly ANY the compiler run, so it's
2399  * a little bit "hand optimized".
2400  *
2401  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2402  */
2403 ir_node *
2404 skip_Id (ir_node *node) {
2405   ir_node *pred;
2406   /* don't assert node !!! */
2407
2408   if (!node || (node->op != op_Id)) return node;
2409
2410   /* Don't use get_Id_pred():  We get into an endless loop for
2411      self-referencing Ids. */
2412   pred = node->in[0+1];
2413
2414   if (pred->op != op_Id) return pred;
2415
2416   if (node != pred) {  /* not a self referencing Id. Resolve Id chain. */
2417     ir_node *rem_pred, *res;
2418
2419     if (pred->op != op_Id) return pred; /* shortcut */
2420     rem_pred = pred;
2421
2422     assert(get_irn_arity (node) > 0);
2423
2424     node->in[0+1] = node;   /* turn us into a self referencing Id:  shorten Id cycles. */
2425     res = skip_Id(rem_pred);
2426     if (res->op == op_Id) /* self-loop */ return node;
2427
2428     node->in[0+1] = res;    /* Turn Id chain into Ids all referencing the chain end. */
2429     return res;
2430   } else {
2431     return node;
2432   }
2433 }
2434 #endif
2435
2436 void skip_Id_and_store(ir_node **node) {
2437   ir_node *n = *node;
2438
2439   if (!n || (n->op != op_Id)) return;
2440
2441   /* Don't use get_Id_pred():  We get into an endless loop for
2442      self-referencing Ids. */
2443   *node = skip_Id(n);
2444 }
2445
2446 int
2447 (is_Bad)(const ir_node *node) {
2448   return _is_Bad(node);
2449 }
2450
2451 int
2452 (is_Const)(const ir_node *node) {
2453         return _is_Const(node);
2454 }
2455
2456 int
2457 (is_no_Block)(const ir_node *node) {
2458   return _is_no_Block(node);
2459 }
2460
2461 int
2462 (is_Block)(const ir_node *node) {
2463   return _is_Block(node);
2464 }
2465
2466 /* returns true if node is an Unknown node. */
2467 int
2468 (is_Unknown)(const ir_node *node) {
2469   return _is_Unknown(node);
2470 }
2471
2472 /* returns true if node is a Return node. */
2473 int
2474 (is_Return)(const ir_node *node) {
2475   return _is_Return(node);
2476 }
2477
2478 /* returns true if node is a Call node. */
2479 int
2480 (is_Call)(const ir_node *node) {
2481   return _is_Call(node);
2482 }
2483
2484 /* returns true if node is a Sel node. */
2485 int
2486 (is_Sel)(const ir_node *node) {
2487   return _is_Sel(node);
2488 }
2489
2490 /* returns true if node is a Mux node or a Psi with only one condition. */
2491 int
2492 (is_Mux)(const ir_node *node) {
2493   return _is_Mux(node);
2494 }
2495
2496 /* returns true if node is a Load node. */
2497 int
2498 (is_Load)(const ir_node *node) {
2499   return _is_Load(node);
2500 }
2501
2502 /* returns true if node is a Sync node. */
2503 int
2504 (is_Sync)(const ir_node *node) {
2505   return _is_Sync(node);
2506 }
2507
2508 /* returns true if node is a Confirm node. */
2509 int
2510 (is_Confirm)(const ir_node *node) {
2511   return _is_Confirm(node);
2512 }
2513
2514 /* returns true if node is a SymConst node. */
2515 int
2516 (is_SymConst)(const ir_node *node) {
2517   return _is_SymConst(node);
2518 }
2519
2520 /* returns true if node is a Cond node. */
2521 int
2522 (is_Cond)(const ir_node *node) {
2523   return _is_Cond(node);
2524 }
2525
2526 /* returns true if node is a Cmp node. */
2527 int
2528 (is_Cmp)(const ir_node *node) {
2529   return _is_Cmp(node);
2530 }
2531
2532 int
2533 is_Proj (const ir_node *node) {
2534   assert(node);
2535   return node->op == op_Proj
2536     || (!get_interprocedural_view() && node->op == op_Filter);
2537 }
2538
2539 /* Returns true if the operation manipulates control flow. */
2540 int
2541 is_cfop(const ir_node *node) {
2542   return is_cfopcode(get_irn_op(node));
2543 }
2544
2545 /* Returns true if the operation manipulates interprocedural control flow:
2546    CallBegin, EndReg, EndExcept */
2547 int is_ip_cfop(const ir_node *node) {
2548   return is_ip_cfopcode(get_irn_op(node));
2549 }
2550
2551 /* Returns true if the operation can change the control flow because
2552    of an exception. */
2553 int
2554 is_fragile_op(const ir_node *node) {
2555   return is_op_fragile(get_irn_op(node));
2556 }
2557
2558 /* Returns the memory operand of fragile operations. */
2559 ir_node *get_fragile_op_mem(ir_node *node) {
2560   assert(node && is_fragile_op(node));
2561
2562   switch (get_irn_opcode (node)) {
2563   case iro_Call  :
2564   case iro_Quot  :
2565   case iro_DivMod:
2566   case iro_Div   :
2567   case iro_Mod   :
2568   case iro_Load  :
2569   case iro_Store :
2570   case iro_Alloc :
2571     return get_irn_n(node, 0);
2572   case iro_Bad   :
2573   case iro_Unknown:
2574     return node;
2575   default: ;
2576     assert(0 && "should not be reached");
2577     return NULL;
2578   }
2579 }
2580
2581 /* Returns true if the operation is a forking control flow operation. */
2582 int (is_irn_forking)(const ir_node *node) {
2583   return _is_irn_forking(node);
2584 }
2585
2586 /* Return the type associated with the value produced by n
2587  * if the node remarks this type as it is the case for
2588  * Cast, Const, SymConst and some Proj nodes. */
2589 ir_type *(get_irn_type)(ir_node *node) {
2590   return _get_irn_type(node);
2591 }
2592
2593 /* Return the type attribute of a node n (SymConst, Call, Alloc, Free,
2594    Cast) or NULL.*/
2595 ir_type *(get_irn_type_attr)(ir_node *node) {
2596   return _get_irn_type_attr(node);
2597 }
2598
2599 /* Return the entity attribute of a node n (SymConst, Sel) or NULL. */
2600 entity *(get_irn_entity_attr)(ir_node *node) {
2601   return _get_irn_entity_attr(node);
2602 }
2603
2604 /* Returns non-zero for constant-like nodes. */
2605 int (is_irn_constlike)(const ir_node *node) {
2606   return _is_irn_constlike(node);
2607 }
2608
2609 /*
2610  * Returns non-zero for nodes that are allowed to have keep-alives and
2611  * are neither Block nor PhiM.
2612  */
2613 int (is_irn_keep)(const ir_node *node) {
2614   return _is_irn_keep(node);
2615 }
2616
2617 /* Returns non-zero for nodes that are machine operations. */
2618 int (is_irn_machine_op)(const ir_node *node) {
2619         return _is_irn_machine_op(node);
2620 }
2621
2622 /* Returns non-zero for nodes that are machine operands. */
2623 int (is_irn_machine_operand)(const ir_node *node) {
2624         return _is_irn_machine_operand(node);
2625 }
2626
2627 /* Returns non-zero for nodes that have the n'th user machine flag set. */
2628 int (is_irn_machine_user)(const ir_node *node, unsigned n) {
2629         return _is_irn_machine_user(node, n);
2630 }
2631
2632
2633 /* Gets the string representation of the jump prediction .*/
2634 const char *get_cond_jmp_predicate_name(cond_jmp_predicate pred)
2635 {
2636   switch (pred) {
2637   default:
2638   case COND_JMP_PRED_NONE:  return "no prediction";
2639   case COND_JMP_PRED_TRUE:  return "true taken";
2640   case COND_JMP_PRED_FALSE: return "false taken";
2641   }
2642 }
2643
2644 /* Returns the conditional jump prediction of a Cond node. */
2645 cond_jmp_predicate (get_Cond_jmp_pred)(ir_node *cond) {
2646   return _get_Cond_jmp_pred(cond);
2647 }
2648
2649 /* Sets a new conditional jump prediction. */
2650 void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) {
2651   _set_Cond_jmp_pred(cond, pred);
2652 }
2653
2654 /** the get_type operation must be always implemented and return a firm type */
2655 static ir_type *get_Default_type(ir_node *n) {
2656   return get_unknown_type();
2657 }
2658
2659 /* Sets the get_type operation for an ir_op_ops. */
2660 ir_op_ops *firm_set_default_get_type(opcode code, ir_op_ops *ops)
2661 {
2662   switch (code) {
2663   case iro_Const:    ops->get_type = get_Const_type; break;
2664   case iro_SymConst: ops->get_type = get_SymConst_value_type; break;
2665   case iro_Cast:     ops->get_type = get_Cast_type; break;
2666   case iro_Proj:     ops->get_type = get_Proj_type; break;
2667   default:
2668     /* not allowed to be NULL */
2669     if (! ops->get_type)
2670       ops->get_type = get_Default_type;
2671     break;
2672   }
2673   return ops;
2674 }
2675
2676 /** Return the attribute type of a SymConst node if exists */
2677 static ir_type *get_SymConst_attr_type(ir_node *self) {
2678   symconst_kind kind = get_SymConst_kind(self);
2679   if (SYMCONST_HAS_TYPE(kind))
2680     return get_SymConst_type(self);
2681   return NULL;
2682 }
2683
2684 /** Return the attribute entity of a SymConst node if exists */
2685 static entity *get_SymConst_attr_entity(ir_node *self) {
2686   symconst_kind kind = get_SymConst_kind(self);
2687   if (SYMCONST_HAS_ENT(kind))
2688     return get_SymConst_entity(self);
2689   return NULL;
2690 }
2691
2692 /** the get_type_attr operation must be always implemented */
2693 static ir_type *get_Null_type(ir_node *n) {
2694   return firm_unknown_type;
2695 }
2696
2697 /* Sets the get_type operation for an ir_op_ops. */
2698 ir_op_ops *firm_set_default_get_type_attr(opcode code, ir_op_ops *ops)
2699 {
2700   switch (code) {
2701   case iro_SymConst: ops->get_type_attr = get_SymConst_attr_type; break;
2702   case iro_Call:     ops->get_type_attr = get_Call_type; break;
2703   case iro_Alloc:    ops->get_type_attr = get_Alloc_type; break;
2704   case iro_Free:     ops->get_type_attr = get_Free_type; break;
2705   case iro_Cast:     ops->get_type_attr = get_Cast_type; break;
2706   default:
2707     /* not allowed to be NULL */
2708     if (! ops->get_type_attr)
2709       ops->get_type_attr = get_Null_type;
2710     break;
2711   }
2712   return ops;
2713 }
2714
2715 /** the get_entity_attr operation must be always implemented */
2716 static entity *get_Null_ent(ir_node *n) {
2717   return NULL;
2718 }
2719
2720 /* Sets the get_type operation for an ir_op_ops. */
2721 ir_op_ops *firm_set_default_get_entity_attr(opcode code, ir_op_ops *ops)
2722 {
2723   switch (code) {
2724   case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break;
2725   case iro_Sel:      ops->get_entity_attr = get_Sel_entity; break;
2726   default:
2727     /* not allowed to be NULL */
2728     if (! ops->get_entity_attr)
2729       ops->get_entity_attr = get_Null_ent;
2730     break;
2731   }
2732   return ops;
2733 }
2734
2735 #ifdef DEBUG_libfirm
2736 void dump_irn (ir_node *n) {
2737   int i, arity = get_irn_arity(n);
2738   printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n);
2739   if (!is_Block(n)) {
2740     ir_node *pred = get_irn_n(n, -1);
2741     printf("  block: %s%s: %ld (%p)\n", get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2742        get_irn_node_nr(pred), (void *)pred);
2743   }
2744   printf("  preds: \n");
2745   for (i = 0; i < arity; ++i) {
2746     ir_node *pred = get_irn_n(n, i);
2747     printf("    %d: %s%s: %ld (%p)\n", i, get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2748        get_irn_node_nr(pred), (void *)pred);
2749   }
2750 }
2751
2752 #else  /* DEBUG_libfirm */
2753 void dump_irn (ir_node *n) {}
2754 #endif /* DEBUG_libfirm */