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