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