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