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