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