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