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