231d6a28c7e29066d7b929bb995ccfcbe7849163
[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
31 #include "irhooks.h"
32
33 /* some constants fixing the positions of nodes predecessors
34    in the in array */
35 #define CALL_PARAM_OFFSET     2
36 #define FUNCCALL_PARAM_OFFSET 1
37 #define SEL_INDEX_OFFSET      2
38 #define RETURN_RESULT_OFFSET  1  /* mem is not a result */
39 #define END_KEEPALIVE_OFFSET  0
40
41 static const char *pnc_name_arr [] = {
42   "False", "Eq", "Lt", "Le",
43   "Gt", "Ge", "Lg", "Leg", "Uo",
44   "Ue", "Ul", "Ule", "Ug", "Uge",
45   "Ne", "True"
46 };
47
48 /**
49  * returns the pnc name from an pnc constant
50  */
51 const char *get_pnc_string(int pnc) {
52   return pnc_name_arr[pnc];
53 }
54
55 /**
56  * Calculates the negated pnc condition.
57  */
58 int
59 get_negated_pnc(int pnc) {
60   switch (pnc) {
61   case False: return True;  break;
62   case Eq:    return Ne;    break;
63   case Lt:    return Uge;   break;
64   case Le:    return Ug;    break;
65   case Gt:    return Ule;   break;
66   case Ge:    return Ul;    break;
67   case Lg:    return Ue;    break;
68   case Leg:   return Uo;    break;
69   case Uo:    return Leg;   break;
70   case Ue:    return Lg;    break;
71   case Ul:    return Ge;    break;
72   case Ule:   return Gt;    break;
73   case Ug:    return Le;    break;
74   case Uge:   return Lt;    break;
75   case Ne:    return Eq;    break;
76   case True:  return False; break;
77   }
78   return 99; /* to shut up gcc */
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   res->in[0] = block;
151   set_irn_dbg_info(res, db);
152   res->out = NULL;
153
154 #ifdef DEBUG_libfirm
155   res->node_nr = get_irp_new_node_nr();
156 #endif
157
158   hook_new_node(res);
159
160   return res;
161 }
162
163 /*-- getting some parameters from ir_nodes --*/
164
165 int
166 (is_ir_node)(const void *thing) {
167   return _is_ir_node(thing);
168 }
169
170 int
171 (get_irn_intra_arity)(const ir_node *node) {
172   return _get_irn_intra_arity(node);
173 }
174
175 int
176 (get_irn_inter_arity)(const ir_node *node) {
177   return _get_irn_inter_arity(node);
178 }
179
180 int (*_get_irn_arity)(const ir_node *node) = _get_irn_intra_arity;
181
182 int
183 (get_irn_arity)(const ir_node *node) {
184   return _get_irn_arity(node);
185 }
186
187 /* Returns the array with ins. This array is shifted with respect to the
188    array accessed by get_irn_n: The block operand is at position 0 not -1.
189    (@@@ This should be changed.)
190    The order of the predecessors in this array is not guaranteed, except that
191    lists of operands as predecessors of Block or arguments of a Call are
192    consecutive. */
193 ir_node **
194 get_irn_in (const ir_node *node) {
195   assert(node);
196   if (get_interprocedural_view()) { /* handle Filter and Block specially */
197     if (get_irn_opcode(node) == iro_Filter) {
198       assert(node->attr.filter.in_cg);
199       return node->attr.filter.in_cg;
200     } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) {
201       return node->attr.block.in_cg;
202     }
203     /* else fall through */
204   }
205   return node->in;
206 }
207
208 void
209 set_irn_in (ir_node *node, int arity, ir_node **in) {
210   ir_node *** arr;
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       arr = &node->attr.filter.in_cg;
216     } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) {
217       arr = &node->attr.block.in_cg;
218     } else {
219       arr = &node->in;
220     }
221   } else {
222     arr = &node->in;
223   }
224   if (arity != ARR_LEN(*arr) - 1) {
225     ir_node * block = (*arr)[0];
226     *arr = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
227     (*arr)[0] = block;
228   }
229   fix_backedges(current_ir_graph->obst, node);
230   memcpy((*arr) + 1, in, sizeof(ir_node *) * arity);
231 }
232
233 ir_node *
234 (get_irn_intra_n)(const ir_node *node, int n) {
235   return _get_irn_intra_n (node, n);
236 }
237
238 ir_node *
239 (get_irn_inter_n)(const ir_node *node, int n) {
240   return _get_irn_inter_n (node, n);
241 }
242
243 ir_node *(*_get_irn_n)(const ir_node *node, int n) = _get_irn_intra_n;
244
245 ir_node *
246 (get_irn_n)(const ir_node *node, int n) {
247   return _get_irn_n(node, n);
248 }
249
250 void
251 set_irn_n (ir_node *node, int n, ir_node *in) {
252   assert(node && node->kind == k_ir_node && -1 <= n && n < get_irn_arity(node));
253   assert(in && in->kind == k_ir_node);
254
255   if ((n == -1) && (get_irn_opcode(node) == iro_Filter)) {
256     /* Change block pred in both views! */
257     node->in[n + 1] = in;
258     assert(node->attr.filter.in_cg);
259     node->attr.filter.in_cg[n + 1] = in;
260     return;
261   }
262   if (get_interprocedural_view()) { /* handle Filter and Block specially */
263     if (get_irn_opcode(node) == iro_Filter) {
264       assert(node->attr.filter.in_cg);
265       node->attr.filter.in_cg[n + 1] = in;
266       return;
267     } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) {
268       node->attr.block.in_cg[n + 1] = in;
269       return;
270     }
271     /* else fall through */
272   }
273   node->in[n + 1] = in;
274 }
275
276 ir_mode *
277 (get_irn_mode)(const ir_node *node) {
278   return _get_irn_mode(node);
279 }
280
281 void
282 (set_irn_mode)(ir_node *node, ir_mode *mode)
283 {
284   _set_irn_mode(node, mode);
285 }
286
287 modecode
288 get_irn_modecode (const ir_node *node)
289 {
290   assert (node);
291   return node->mode->code;
292 }
293
294 /** Gets the string representation of the mode .*/
295 const char *
296 get_irn_modename (const ir_node *node)
297 {
298   assert(node);
299   return get_mode_name(node->mode);
300 }
301
302 ident *
303 get_irn_modeident (const ir_node *node)
304 {
305   assert(node);
306   return get_mode_ident(node->mode);
307 }
308
309 ir_op *
310 (get_irn_op)(const ir_node *node)
311 {
312   return _get_irn_op(node);
313 }
314
315 /* should be private to the library: */
316 void
317 set_irn_op (ir_node *node, ir_op *op)
318 {
319   assert (node);
320   node->op = op;
321 }
322
323 opcode
324 (get_irn_opcode)(const ir_node *node)
325 {
326   return _get_irn_opcode(node);
327 }
328
329 const char *
330 get_irn_opname (const ir_node *node)
331 {
332   assert(node);
333   if ((get_irn_op((ir_node *)node) == op_Phi) &&
334       (get_irg_phase_state(get_irn_irg((ir_node *)node)) == phase_building) &&
335       (get_irn_arity((ir_node *)node) == 0)) return "Phi0";
336   return get_id_str(node->op->name);
337 }
338
339 ident *
340 get_irn_opident (const ir_node *node)
341 {
342   assert(node);
343   return node->op->name;
344 }
345
346 unsigned long
347 (get_irn_visited)(const ir_node *node)
348 {
349   return _get_irn_visited(node);
350 }
351
352 void
353 (set_irn_visited)(ir_node *node, unsigned long visited)
354 {
355   _set_irn_visited(node, visited);
356 }
357
358 void
359 (mark_irn_visited)(ir_node *node) {
360   _mark_irn_visited(node);
361 }
362
363 int
364 (irn_not_visited)(const ir_node *node) {
365   return _irn_not_visited(node);
366 }
367
368 int
369 (irn_visited)(const ir_node *node) {
370   return _irn_visited(node);
371 }
372
373 void
374 (set_irn_link)(ir_node *node, void *link) {
375   _set_irn_link(node, link);
376 }
377
378 void *
379 (get_irn_link)(const ir_node *node) {
380   return _get_irn_link(node);
381 }
382
383 op_pin_state
384 (get_irn_pinned)(const ir_node *node) {
385   return _get_irn_pinned(node);
386 }
387
388 void set_irn_pinned(ir_node *node, op_pin_state state) {
389   /* due to optimization an opt may be turned into a Tuple */
390   if (get_irn_op(node) == op_Tuple)
391     return;
392
393   assert(node && get_op_pinned(get_irn_op(node)) >= op_pin_state_exc_pinned);
394   assert(state == op_pin_state_pinned || state == op_pin_state_floats);
395
396   node->attr.except.pin_state = state;
397 }
398
399 #ifdef DO_HEAPANALYSIS
400 /* Access the abstract interpretation information of a node.
401    Returns NULL if no such information is available. */
402 struct abstval *get_irn_abst_value(ir_node *n) {
403   return n->av;
404 }
405 /* Set the abstract interpretation information of a node. */
406 void set_irn_abst_value(ir_node *n, struct abstval *os) {
407   n->av = os;
408 }
409 struct section *firm_get_irn_section(ir_node *n) {
410   return n->sec;
411 }
412 void firm_set_irn_section(ir_node *n, struct section *s) {
413   n->sec = s;
414 }
415 #else
416 /* Dummies needed for firmjni. */
417 struct abstval *get_irn_abst_value(ir_node *n) { return NULL; }
418 void set_irn_abst_value(ir_node *n, struct abstval *os) {}
419 struct section *firm_get_irn_section(ir_node *n) { return NULL; }
420 void firm_set_irn_section(ir_node *n, struct section *s) {}
421 #endif /* DO_HEAPANALYSIS */
422
423
424 /* Outputs a unique number for this node */
425 long
426 get_irn_node_nr(const ir_node *node) {
427   assert(node);
428 #ifdef DEBUG_libfirm
429   return node->node_nr;
430 #else
431   return (long)node;
432 #endif
433 }
434
435 const_attr
436 get_irn_const_attr (ir_node *node)
437 {
438   assert (node->op == op_Const);
439   return node->attr.con;
440 }
441
442 long
443 get_irn_proj_attr (ir_node *node)
444 {
445   assert (node->op == op_Proj);
446   return node->attr.proj;
447 }
448
449 alloc_attr
450 get_irn_alloc_attr (ir_node *node)
451 {
452   assert (node->op == op_Alloc);
453   return node->attr.a;
454 }
455
456 free_attr
457 get_irn_free_attr     (ir_node *node)
458 {
459   assert (node->op == op_Free);
460   return node->attr.f;
461 }
462
463 symconst_attr
464 get_irn_symconst_attr (ir_node *node)
465 {
466   assert (node->op == op_SymConst);
467   return node->attr.i;
468 }
469
470 type *
471 get_irn_call_attr (ir_node *node)
472 {
473   assert (node->op == op_Call);
474   return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
475 }
476
477 sel_attr
478 get_irn_sel_attr (ir_node *node)
479 {
480   assert (node->op == op_Sel);
481   return node->attr.s;
482 }
483
484 int
485 get_irn_phi_attr (ir_node *node)
486 {
487   assert (node->op == op_Phi);
488   return node->attr.phi0_pos;
489 }
490
491 block_attr
492 get_irn_block_attr (ir_node *node)
493 {
494   assert (node->op == op_Block);
495   return node->attr.block;
496 }
497
498 load_attr
499 get_irn_load_attr (ir_node *node)
500 {
501   assert (node->op == op_Load);
502   return node->attr.load;
503 }
504
505 store_attr
506 get_irn_store_attr (ir_node *node)
507 {
508   assert (node->op == op_Store);
509   return node->attr.store;
510 }
511
512 except_attr
513 get_irn_except_attr (ir_node *node)
514 {
515   assert (node->op == op_Div || node->op == op_Quot ||
516           node->op == op_DivMod || node->op == op_Mod || node->op == op_Call || node->op == op_Alloc);
517   return node->attr.except;
518 }
519
520 /** manipulate fields of individual nodes **/
521
522 /* this works for all except Block */
523 ir_node *
524 get_nodes_block (const ir_node *node) {
525   assert (!(node->op == op_Block));
526   return get_irn_n(node, -1);
527 }
528
529 void
530 set_nodes_block (ir_node *node, ir_node *block) {
531   assert (!(node->op == op_Block));
532   set_irn_n(node, -1, block);
533 }
534
535 /* Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
536  * from Start.  If so returns frame type, else Null. */
537 type *is_frame_pointer(ir_node *n) {
538   if ((get_irn_op(n) == op_Proj) &&
539       (get_Proj_proj(n) == pn_Start_P_frame_base)) {
540     ir_node *start = get_Proj_pred(n);
541     if (get_irn_op(start) == op_Start) {
542       return get_irg_frame_type(get_irn_irg(start));
543     }
544   }
545   return NULL;
546 }
547
548 /* Test whether arbitrary node is globals pointer, i.e. Proj(pn_Start_P_globals)
549  * from Start.  If so returns global type, else Null. */
550 type *is_globals_pointer(ir_node *n) {
551   if ((get_irn_op(n) == op_Proj) &&
552       (get_Proj_proj(n) == pn_Start_P_globals)) {
553     ir_node *start = get_Proj_pred(n);
554     if (get_irn_op(start) == op_Start) {
555       return get_glob_type();
556     }
557   }
558   return NULL;
559 }
560
561 /* Test whether arbitrary node is value arg base, i.e. Proj(pn_Start_P_value_arg_base)
562  * from Start.  If so returns 1, else 0. */
563 int is_value_arg_pointer(ir_node *n) {
564   if ((get_irn_op(n) == op_Proj) &&
565       (get_Proj_proj(n) == pn_Start_P_value_arg_base) &&
566       (get_irn_op(get_Proj_pred(n)) == op_Start))
567     return 1;
568   return 0;
569 }
570
571 /* Returns an array with the predecessors of the Block. Depending on
572    the implementation of the graph data structure this can be a copy of
573    the internal representation of predecessors as well as the internal
574    array itself. Therefore writing to this array might obstruct the ir. */
575 ir_node **
576 get_Block_cfgpred_arr (ir_node *node)
577 {
578   assert ((node->op == op_Block));
579   return (ir_node **)&(get_irn_in(node)[1]);
580 }
581
582
583 int
584 get_Block_n_cfgpreds (ir_node *node) {
585   assert ((node->op == op_Block));
586   return get_irn_arity(node);
587 }
588
589 ir_node *
590 get_Block_cfgpred (ir_node *node, int pos) {
591   assert(-1 <= pos && pos < get_irn_arity(node));
592   assert(node->op == op_Block);
593   return get_irn_n(node, pos);
594 }
595
596 void
597 set_Block_cfgpred (ir_node *node, int pos, ir_node *pred) {
598   assert (node->op == op_Block);
599   set_irn_n(node, pos, pred);
600 }
601
602 bool
603 get_Block_matured (ir_node *node) {
604   assert (node->op == op_Block);
605   return node->attr.block.matured;
606 }
607
608 void
609 set_Block_matured (ir_node *node, bool matured) {
610   assert (node->op == op_Block);
611   node->attr.block.matured = matured;
612 }
613 unsigned long
614 get_Block_block_visited (ir_node *node) {
615   assert (node->op == op_Block);
616   return node->attr.block.block_visited;
617 }
618
619 void
620 set_Block_block_visited (ir_node *node, unsigned long visit) {
621   assert (node->op == op_Block);
622   node->attr.block.block_visited = visit;
623 }
624
625 /* For this current_ir_graph must be set. */
626 void
627 mark_Block_block_visited (ir_node *node) {
628   assert (node->op == op_Block);
629   node->attr.block.block_visited = get_irg_block_visited(current_ir_graph);
630 }
631
632 int
633 Block_not_block_visited(ir_node *node) {
634   assert (node->op == op_Block);
635   return (node->attr.block.block_visited < get_irg_block_visited(current_ir_graph));
636 }
637
638 ir_node *
639 get_Block_graph_arr (ir_node *node, int pos) {
640   assert (node->op == op_Block);
641   return node->attr.block.graph_arr[pos+1];
642 }
643
644 void
645 set_Block_graph_arr (ir_node *node, int pos, ir_node *value) {
646   assert (node->op == op_Block);
647   node->attr.block.graph_arr[pos+1] = value;
648 }
649
650 void set_Block_cg_cfgpred_arr(ir_node * node, int arity, ir_node ** in) {
651   assert(node->op == op_Block);
652   if (node->attr.block.in_cg == NULL || arity != ARR_LEN(node->attr.block.in_cg) - 1) {
653     node->attr.block.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
654     node->attr.block.in_cg[0] = NULL;
655     node->attr.block.cg_backedge = new_backedge_arr(current_ir_graph->obst, arity);
656     {
657       /* Fix backedge array.  fix_backedges operates depending on
658      interprocedural_view. */
659       int ipv = get_interprocedural_view();
660       set_interprocedural_view(true);
661       fix_backedges(current_ir_graph->obst, node);
662       set_interprocedural_view(ipv);
663     }
664   }
665   memcpy(node->attr.block.in_cg + 1, in, sizeof(ir_node *) * arity);
666 }
667
668 void set_Block_cg_cfgpred(ir_node * node, int pos, ir_node * pred) {
669   assert(node->op == op_Block &&
670      node->attr.block.in_cg &&
671      0 <= pos && pos < ARR_LEN(node->attr.block.in_cg) - 1);
672   node->attr.block.in_cg[pos + 1] = pred;
673 }
674
675 ir_node ** get_Block_cg_cfgpred_arr(ir_node * node) {
676   assert(node->op == op_Block);
677   return node->attr.block.in_cg == NULL ? NULL : node->attr.block.in_cg  + 1;
678 }
679
680 int get_Block_cg_n_cfgpreds(ir_node * node) {
681   assert(node->op == op_Block);
682   return node->attr.block.in_cg == NULL ? 0 : ARR_LEN(node->attr.block.in_cg) - 1;
683 }
684
685 ir_node * get_Block_cg_cfgpred(ir_node * node, int pos) {
686   assert(node->op == op_Block && node->attr.block.in_cg);
687   return node->attr.block.in_cg[pos + 1];
688 }
689
690 void remove_Block_cg_cfgpred_arr(ir_node * node) {
691   assert(node->op == op_Block);
692   node->attr.block.in_cg = NULL;
693 }
694
695 ir_node *(set_Block_dead)(ir_node *block) {
696   return _set_Block_dead(block);
697 }
698
699 int (is_Block_dead)(const ir_node *block) {
700   return _is_Block_dead(block);
701 }
702
703 void
704 set_Start_irg(ir_node *node, ir_graph *irg) {
705   assert(node->op == op_Start);
706   assert(is_ir_graph(irg));
707   assert(0 && " Why set irg? -- use set_irn_irg");
708 }
709
710 int
711 get_End_n_keepalives(ir_node *end) {
712   assert (end->op == op_End);
713   return (get_irn_arity(end) - END_KEEPALIVE_OFFSET);
714 }
715
716 ir_node *
717 get_End_keepalive(ir_node *end, int pos) {
718   assert (end->op == op_End);
719   return get_irn_n(end, pos + END_KEEPALIVE_OFFSET);
720 }
721
722 void
723 add_End_keepalive (ir_node *end, ir_node *ka) {
724   assert (end->op == op_End);
725   ARR_APP1 (ir_node *, end->in, ka);
726 }
727
728 void
729 set_End_keepalive(ir_node *end, int pos, ir_node *ka) {
730   assert (end->op == op_End);
731   set_irn_n(end, pos + END_KEEPALIVE_OFFSET, ka);
732 }
733
734 void
735 free_End (ir_node *end) {
736   assert (end->op == op_End);
737   end->kind = k_BAD;
738   DEL_ARR_F(end->in);  /* GL @@@ tut nicht ! */
739   end->in = NULL;   /* @@@ make sure we get an error if we use the
740                in array afterwards ... */
741 }
742
743
744 /*
745 > Implementing the case construct (which is where the constant Proj node is
746 > important) involves far more than simply determining the constant values.
747 > We could argue that this is more properly a function of the translator from
748 > Firm to the target machine.  That could be done if there was some way of
749 > projecting "default" out of the Cond node.
750 I know it's complicated.
751 Basically there are two proglems:
752  - determining the gaps between the projs
753  - determining the biggest case constant to know the proj number for
754    the default node.
755 I see several solutions:
756 1. Introduce a ProjDefault node.  Solves both problems.
757    This means to extend all optimizations executed during construction.
758 2. Give the Cond node for switch two flavors:
759    a) there are no gaps in the projs  (existing flavor)
760    b) gaps may exist, default proj is still the Proj with the largest
761       projection number.  This covers also the gaps.
762 3. Fix the semantic of the Cond to that of 2b)
763
764 Solution 2 seems to be the best:
765 Computing the gaps in the Firm representation is not too hard, i.e.,
766 libFIRM can implement a routine that transforms between the two
767 flavours.  This is also possible for 1) but 2) does not require to
768 change any existing optimization.
769 Further it should be far simpler to determine the biggest constant than
770 to compute all gaps.
771 I don't want to choose 3) as 2a) seems to have advantages for
772 dataflow analysis and 3) does not allow to convert the representation to
773 2a).
774 */
775 ir_node *
776 get_Cond_selector (ir_node *node) {
777   assert (node->op == op_Cond);
778   return get_irn_n(node, 0);
779 }
780
781 void
782 set_Cond_selector (ir_node *node, ir_node *selector) {
783   assert (node->op == op_Cond);
784   set_irn_n(node, 0, selector);
785 }
786
787 cond_kind
788 get_Cond_kind (ir_node *node) {
789   assert (node->op == op_Cond);
790   return node->attr.c.kind;
791 }
792
793 void
794 set_Cond_kind (ir_node *node, cond_kind kind) {
795   assert (node->op == op_Cond);
796   node->attr.c.kind = kind;
797 }
798
799 long
800 get_Cond_defaultProj (ir_node *node) {
801   assert (node->op == op_Cond);
802   return node->attr.c.default_proj;
803 }
804
805 ir_node *
806 get_Return_mem (ir_node *node) {
807   assert (node->op == op_Return);
808   return get_irn_n(node, 0);
809 }
810
811 void
812 set_Return_mem (ir_node *node, ir_node *mem) {
813   assert (node->op == op_Return);
814   set_irn_n(node, 0, mem);
815 }
816
817 int
818 get_Return_n_ress (ir_node *node) {
819   assert (node->op == op_Return);
820   return (get_irn_arity(node) - RETURN_RESULT_OFFSET);
821 }
822
823 ir_node **
824 get_Return_res_arr (ir_node *node)
825 {
826   assert ((node->op == op_Return));
827   if (get_Return_n_ress(node) > 0)
828     return (ir_node **)&(get_irn_in(node)[1 + RETURN_RESULT_OFFSET]);
829   else
830     return NULL;
831 }
832
833 /*
834 void
835 set_Return_n_res (ir_node *node, int results) {
836   assert (node->op == op_Return);
837 }
838 */
839
840 ir_node *
841 get_Return_res (ir_node *node, int pos) {
842   assert (node->op == op_Return);
843   assert (get_Return_n_ress(node) > pos);
844   return get_irn_n(node, pos + RETURN_RESULT_OFFSET);
845 }
846
847 void
848 set_Return_res (ir_node *node, int pos, ir_node *res){
849   assert (node->op == op_Return);
850   set_irn_n(node, pos + RETURN_RESULT_OFFSET, res);
851 }
852
853 ir_node *
854 get_Raise_mem (ir_node *node) {
855   assert (node->op == op_Raise);
856   return get_irn_n(node, 0);
857 }
858
859 void
860 set_Raise_mem (ir_node *node, ir_node *mem) {
861   assert (node->op == op_Raise);
862   set_irn_n(node, 0, mem);
863 }
864
865 ir_node *
866 get_Raise_exo_ptr (ir_node *node) {
867   assert (node->op == op_Raise);
868   return get_irn_n(node, 1);
869 }
870
871 void
872 set_Raise_exo_ptr (ir_node *node, ir_node *exo_ptr) {
873   assert (node->op == op_Raise);
874   set_irn_n(node, 1, exo_ptr);
875 }
876
877 tarval *get_Const_tarval (ir_node *node) {
878   assert (node->op == op_Const);
879   return node->attr.con.tv;
880 }
881
882 void
883 set_Const_tarval (ir_node *node, tarval *con) {
884   assert (node->op == op_Const);
885   node->attr.con.tv = con;
886 }
887
888
889 /* The source language type.  Must be an atomic type.  Mode of type must
890    be mode of node. For tarvals from entities type must be pointer to
891    entity type. */
892 type *
893 get_Const_type (ir_node *node) {
894   assert (node->op == op_Const);
895   return node->attr.con.tp;
896 }
897
898 void
899 set_Const_type (ir_node *node, type *tp) {
900   assert (node->op == op_Const);
901   if (tp != firm_unknown_type) {
902     assert (is_atomic_type(tp));
903     assert (get_type_mode(tp) == get_irn_mode(node));
904   }
905   node->attr.con.tp = tp;
906 }
907
908
909 symconst_kind
910 get_SymConst_kind (const ir_node *node) {
911   assert (node->op == op_SymConst);
912   return node->attr.i.num;
913 }
914
915 void
916 set_SymConst_kind (ir_node *node, symconst_kind num) {
917   assert (node->op == op_SymConst);
918   node->attr.i.num = num;
919 }
920
921 type *
922 get_SymConst_type (ir_node *node) {
923   assert (   (node->op == op_SymConst)
924           && (   get_SymConst_kind(node) == symconst_type_tag
925               || get_SymConst_kind(node) == symconst_size));
926   return node->attr.i.sym.type_p = skip_tid(node->attr.i.sym.type_p);
927 }
928
929 void
930 set_SymConst_type (ir_node *node, type *tp) {
931   assert (   (node->op == op_SymConst)
932           && (   get_SymConst_kind(node) == symconst_type_tag
933               || get_SymConst_kind(node) == symconst_size));
934   node->attr.i.sym.type_p = tp;
935 }
936
937 ident *
938 get_SymConst_name (ir_node *node) {
939   assert (   (node->op == op_SymConst)
940           && (get_SymConst_kind(node) == symconst_addr_name));
941   return node->attr.i.sym.ident_p;
942 }
943
944 void
945 set_SymConst_name (ir_node *node, ident *name) {
946   assert (   (node->op == op_SymConst)
947           && (get_SymConst_kind(node) == symconst_addr_name));
948   node->attr.i.sym.ident_p = name;
949 }
950
951
952 /* Only to access SymConst of kind symconst_addr_ent.  Else assertion: */
953 entity   *get_SymConst_entity (ir_node *node) {
954   assert (   (node->op == op_SymConst)
955           && (get_SymConst_kind (node) == symconst_addr_ent));
956   return node->attr.i.sym.entity_p;
957 }
958
959 void     set_SymConst_entity (ir_node *node, entity *ent) {
960   assert (   (node->op == op_SymConst)
961           && (get_SymConst_kind(node) == symconst_addr_ent));
962   node->attr.i.sym.entity_p  = ent;
963 }
964
965 union symconst_symbol
966 get_SymConst_symbol (ir_node *node) {
967   assert (node->op == op_SymConst);
968   return node->attr.i.sym;
969 }
970
971 void
972 set_SymConst_symbol (ir_node *node, union symconst_symbol sym) {
973   assert (node->op == op_SymConst);
974   //memcpy (&(node->attr.i.sym), sym, sizeof(type_or_id));
975   node->attr.i.sym = sym;
976 }
977
978 type *
979 get_SymConst_value_type (ir_node *node) {
980   assert (node->op == op_SymConst);
981   if (node->attr.i.tp) node->attr.i.tp = skip_tid(node->attr.i.tp);
982   return node->attr.i.tp;
983 }
984
985 void
986 set_SymConst_value_type (ir_node *node, type *tp) {
987   assert (node->op == op_SymConst);
988   node->attr.i.tp = tp;
989 }
990
991 ir_node *
992 get_Sel_mem (ir_node *node) {
993   assert (node->op == op_Sel);
994   return get_irn_n(node, 0);
995 }
996
997 void
998 set_Sel_mem (ir_node *node, ir_node *mem) {
999   assert (node->op == op_Sel);
1000   set_irn_n(node, 0, mem);
1001 }
1002
1003 ir_node *
1004 get_Sel_ptr (ir_node *node) {
1005   assert (node->op == op_Sel);
1006   return get_irn_n(node, 1);
1007 }
1008
1009 void
1010 set_Sel_ptr (ir_node *node, ir_node *ptr) {
1011   assert (node->op == op_Sel);
1012   set_irn_n(node, 1, ptr);
1013 }
1014
1015 int
1016 get_Sel_n_indexs (ir_node *node) {
1017   assert (node->op == op_Sel);
1018   return (get_irn_arity(node) - SEL_INDEX_OFFSET);
1019 }
1020
1021 ir_node **
1022 get_Sel_index_arr (ir_node *node)
1023 {
1024   assert ((node->op == op_Sel));
1025   if (get_Sel_n_indexs(node) > 0)
1026     return (ir_node **)& get_irn_in(node)[SEL_INDEX_OFFSET + 1];
1027   else
1028     return NULL;
1029 }
1030
1031 ir_node *
1032 get_Sel_index (ir_node *node, int pos) {
1033   assert (node->op == op_Sel);
1034   return get_irn_n(node, pos + SEL_INDEX_OFFSET);
1035 }
1036
1037 void
1038 set_Sel_index (ir_node *node, int pos, ir_node *index) {
1039   assert (node->op == op_Sel);
1040   set_irn_n(node, pos + SEL_INDEX_OFFSET, index);
1041 }
1042
1043 entity *
1044 get_Sel_entity (ir_node *node) {
1045   assert (node->op == op_Sel);
1046   return node->attr.s.ent;
1047 }
1048
1049 void
1050 set_Sel_entity (ir_node *node, entity *ent) {
1051   assert (node->op == op_Sel);
1052   node->attr.s.ent = ent;
1053 }
1054
1055 type *
1056 get_InstOf_ent (ir_node *node) {
1057   assert (node->op = op_InstOf);
1058   return (node->attr.io.ent);
1059 }
1060
1061 void
1062 set_InstOf_ent (ir_node *node, type *ent) {
1063   assert (node->op = op_InstOf);
1064   node->attr.io.ent = ent;
1065 }
1066
1067 ir_node *
1068 get_InstOf_store (ir_node *node) {
1069   assert (node->op = op_InstOf);
1070   return (get_irn_n (node, 0));
1071 }
1072
1073 void
1074 set_InstOf_store (ir_node *node, ir_node *obj) {
1075   assert (node->op = op_InstOf);
1076   set_irn_n (node, 0, obj);
1077 }
1078
1079 ir_node *
1080 get_InstOf_obj (ir_node *node) {
1081   assert (node->op = op_InstOf);
1082   return (get_irn_n (node, 1));
1083 }
1084
1085 void
1086 set_InstOf_obj (ir_node *node, ir_node *obj) {
1087   assert (node->op = op_InstOf);
1088   set_irn_n (node, 1, obj);
1089 }
1090
1091
1092 /* For unary and binary arithmetic operations the access to the
1093    operands can be factored out.  Left is the first, right the
1094    second arithmetic value  as listed in tech report 0999-33.
1095    unops are: Minus, Abs, Not, Conv, Cast
1096    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
1097    Shr, Shrs, Rotate, Cmp */
1098
1099
1100 ir_node *
1101 get_Call_mem (ir_node *node) {
1102   assert (node->op == op_Call);
1103   return get_irn_n(node, 0);
1104 }
1105
1106 void
1107 set_Call_mem (ir_node *node, ir_node *mem) {
1108   assert (node->op == op_Call);
1109   set_irn_n(node, 0, mem);
1110 }
1111
1112 ir_node *
1113 get_Call_ptr (ir_node *node) {
1114   assert (node->op == op_Call);
1115   return get_irn_n(node, 1);
1116 }
1117
1118 void
1119 set_Call_ptr (ir_node *node, ir_node *ptr) {
1120   assert (node->op == op_Call);
1121   set_irn_n(node, 1, ptr);
1122 }
1123
1124 ir_node **
1125 get_Call_param_arr (ir_node *node) {
1126   assert (node->op == op_Call);
1127   return (ir_node **)&get_irn_in(node)[CALL_PARAM_OFFSET + 1];
1128 }
1129
1130 int
1131 get_Call_n_params (ir_node *node)  {
1132   assert (node->op == op_Call);
1133   return (get_irn_arity(node) - CALL_PARAM_OFFSET);
1134 }
1135
1136 int
1137 get_Call_arity (ir_node *node) {
1138   assert (node->op == op_Call);
1139   return get_Call_n_params(node);
1140 }
1141
1142 /* void
1143 set_Call_arity (ir_node *node, ir_node *arity) {
1144   assert (node->op == op_Call);
1145 }
1146 */
1147
1148 ir_node *
1149 get_Call_param (ir_node *node, int pos) {
1150   assert (node->op == op_Call);
1151   return get_irn_n(node, pos + CALL_PARAM_OFFSET);
1152 }
1153
1154 void
1155 set_Call_param (ir_node *node, int pos, ir_node *param) {
1156   assert (node->op == op_Call);
1157   set_irn_n(node, pos + CALL_PARAM_OFFSET, param);
1158 }
1159
1160 type *
1161 get_Call_type (ir_node *node) {
1162   assert (node->op == op_Call);
1163   return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
1164 }
1165
1166 void
1167 set_Call_type (ir_node *node, type *tp) {
1168   assert (node->op == op_Call);
1169   assert ((get_unknown_type() == tp) || is_Method_type(tp));
1170   node->attr.call.cld_tp = tp;
1171 }
1172
1173 int Call_has_callees(ir_node *node) {
1174   assert(node && node->op == op_Call);
1175   return ((get_irg_callee_info_state(get_irn_irg(node)) != irg_callee_info_none) &&
1176       (node->attr.call.callee_arr != NULL));
1177 }
1178
1179 int get_Call_n_callees(ir_node * node) {
1180   assert(node && node->op == op_Call && node->attr.call.callee_arr);
1181   return ARR_LEN(node->attr.call.callee_arr);
1182 }
1183
1184 entity * get_Call_callee(ir_node * node, int pos) {
1185   assert(pos >= 0 && pos < get_Call_n_callees(node));
1186   return node->attr.call.callee_arr[pos];
1187 }
1188
1189 void set_Call_callee_arr(ir_node * node, const int n, entity ** arr) {
1190   assert(node->op == op_Call);
1191   if (node->attr.call.callee_arr == NULL || get_Call_n_callees(node) != n) {
1192     node->attr.call.callee_arr = NEW_ARR_D(entity *, current_ir_graph->obst, n);
1193   }
1194   memcpy(node->attr.call.callee_arr, arr, n * sizeof(entity *));
1195 }
1196
1197 void remove_Call_callee_arr(ir_node * node) {
1198   assert(node->op == op_Call);
1199   node->attr.call.callee_arr = NULL;
1200 }
1201
1202 ir_node * get_CallBegin_ptr (ir_node *node) {
1203   assert(node->op == op_CallBegin);
1204   return get_irn_n(node, 0);
1205 }
1206 void set_CallBegin_ptr (ir_node *node, ir_node *ptr) {
1207   assert(node->op == op_CallBegin);
1208   set_irn_n(node, 0, ptr);
1209 }
1210 ir_node * get_CallBegin_call (ir_node *node) {
1211   assert(node->op == op_CallBegin);
1212   return node->attr.callbegin.call;
1213 }
1214 void  set_CallBegin_call (ir_node *node, ir_node *call) {
1215   assert(node->op == op_CallBegin);
1216   node->attr.callbegin.call = call;
1217 }
1218
1219
1220 #define BINOP(OP)                   \
1221 ir_node * get_##OP##_left(ir_node *node) {      \
1222   assert(node->op == op_##OP);              \
1223   return get_irn_n(node, node->op->op_index);       \
1224 }                           \
1225 void set_##OP##_left(ir_node *node, ir_node *left) {    \
1226   assert(node->op == op_##OP);              \
1227   set_irn_n(node, node->op->op_index, left);        \
1228 }                           \
1229 ir_node *get_##OP##_right(ir_node *node) {      \
1230   assert(node->op == op_##OP);              \
1231   return get_irn_n(node, node->op->op_index + 1);   \
1232 }                           \
1233 void set_##OP##_right(ir_node *node, ir_node *right) {  \
1234   assert(node->op == op_##OP);              \
1235   set_irn_n(node, node->op->op_index + 1, right);   \
1236 }
1237
1238 #define UNOP(OP)                    \
1239 ir_node *get_##OP##_op(ir_node *node) {         \
1240   assert(node->op == op_##OP);              \
1241   return get_irn_n(node, node->op->op_index);       \
1242 }                           \
1243 void set_##OP##_op (ir_node *node, ir_node *op) {   \
1244   assert(node->op == op_##OP);              \
1245   set_irn_n(node, node->op->op_index, op);      \
1246 }
1247
1248 BINOP(Add)
1249 BINOP(Sub)
1250 UNOP(Minus)
1251 BINOP(Mul)
1252 BINOP(Quot)
1253
1254 ir_node *
1255 get_Quot_mem (ir_node *node) {
1256   assert (node->op == op_Quot);
1257   return get_irn_n(node, 0);
1258 }
1259
1260 void
1261 set_Quot_mem (ir_node *node, ir_node *mem) {
1262   assert (node->op == op_Quot);
1263   set_irn_n(node, 0, mem);
1264 }
1265
1266 BINOP(DivMod)
1267
1268 ir_node *
1269 get_DivMod_mem (ir_node *node) {
1270   assert (node->op == op_DivMod);
1271   return get_irn_n(node, 0);
1272 }
1273
1274 void
1275 set_DivMod_mem (ir_node *node, ir_node *mem) {
1276   assert (node->op == op_DivMod);
1277   set_irn_n(node, 0, mem);
1278 }
1279
1280 BINOP(Div)
1281
1282 ir_node *
1283 get_Div_mem (ir_node *node) {
1284   assert (node->op == op_Div);
1285   return get_irn_n(node, 0);
1286 }
1287
1288 void
1289 set_Div_mem (ir_node *node, ir_node *mem) {
1290   assert (node->op == op_Div);
1291   set_irn_n(node, 0, mem);
1292 }
1293
1294 BINOP(Mod)
1295
1296 ir_node *
1297 get_Mod_mem (ir_node *node) {
1298   assert (node->op == op_Mod);
1299   return get_irn_n(node, 0);
1300 }
1301
1302 void
1303 set_Mod_mem (ir_node *node, ir_node *mem) {
1304   assert (node->op == op_Mod);
1305   set_irn_n(node, 0, mem);
1306 }
1307
1308 UNOP(Abs)
1309 BINOP(And)
1310 BINOP(Or)
1311 BINOP(Eor)
1312 UNOP(Not)
1313 BINOP(Shl)
1314 BINOP(Shr)
1315 BINOP(Shrs)
1316 BINOP(Rot)
1317 BINOP(Cmp)
1318 UNOP(Conv)
1319 UNOP(Cast)
1320
1321 type *
1322 get_Cast_type (ir_node *node) {
1323   assert (node->op == op_Cast);
1324   return node->attr.cast.totype;
1325 }
1326
1327 void
1328 set_Cast_type (ir_node *node, type *to_tp) {
1329   assert (node->op == op_Cast);
1330   node->attr.cast.totype = to_tp;
1331 }
1332
1333 int
1334 (is_unop)(const ir_node *node) {
1335   return _is_unop(node);
1336 }
1337
1338 ir_node *
1339 get_unop_op (ir_node *node) {
1340   if (node->op->opar == oparity_unary)
1341     return get_irn_n(node, node->op->op_index);
1342
1343   assert(node->op->opar == oparity_unary);
1344   return NULL;
1345 }
1346
1347 void
1348 set_unop_op (ir_node *node, ir_node *op) {
1349   if (node->op->opar == oparity_unary)
1350     set_irn_n(node, node->op->op_index, op);
1351
1352   assert(node->op->opar == oparity_unary);
1353 }
1354
1355 int
1356 (is_binop)(const ir_node *node) {
1357   return _is_binop(node);
1358 }
1359
1360 ir_node *
1361 get_binop_left (ir_node *node) {
1362   if (node->op->opar == oparity_binary)
1363     return get_irn_n(node, node->op->op_index);
1364
1365   assert(node->op->opar == oparity_binary);
1366   return NULL;
1367 }
1368
1369 void
1370 set_binop_left (ir_node *node, ir_node *left) {
1371   if (node->op->opar == oparity_binary)
1372     set_irn_n(node, node->op->op_index, left);
1373
1374   assert (node->op->opar == oparity_binary);
1375 }
1376
1377 ir_node *
1378 get_binop_right (ir_node *node) {
1379   if (node->op->opar == oparity_binary)
1380     return get_irn_n(node, node->op->op_index + 1);
1381
1382   assert(node->op->opar == oparity_binary);
1383   return NULL;
1384 }
1385
1386 void
1387 set_binop_right (ir_node *node, ir_node *right) {
1388   if (node->op->opar == oparity_binary)
1389     set_irn_n(node, node->op->op_index + 1, right);
1390
1391   assert (node->op->opar == oparity_binary);
1392 }
1393
1394 int is_Phi (const ir_node *n) {
1395   ir_op *op;
1396
1397   assert(n);
1398   op = get_irn_op(n);
1399
1400   if (op == op_Filter) return get_interprocedural_view();
1401
1402   if (op == op_Phi)
1403     return  ((get_irg_phase_state(get_irn_irg(n)) !=  phase_building) ||
1404          (get_irn_arity(n) > 0));
1405
1406   return 0;
1407 }
1408
1409 int is_Phi0 (const ir_node *n) {
1410   assert(n);
1411
1412   return ((get_irn_op(n) == op_Phi) &&
1413       (get_irn_arity(n) == 0) &&
1414       (get_irg_phase_state(get_irn_irg(n)) ==  phase_building));
1415 }
1416
1417 ir_node **
1418 get_Phi_preds_arr (ir_node *node) {
1419   assert (node->op == op_Phi);
1420   return (ir_node **)&(get_irn_in(node)[1]);
1421 }
1422
1423 int
1424 get_Phi_n_preds (ir_node *node) {
1425   assert (is_Phi(node) || is_Phi0(node));
1426   return (get_irn_arity(node));
1427 }
1428
1429 /*
1430 void set_Phi_n_preds (ir_node *node, int n_preds) {
1431   assert (node->op == op_Phi);
1432 }
1433 */
1434
1435 ir_node *
1436 get_Phi_pred (ir_node *node, int pos) {
1437   assert (is_Phi(node) || is_Phi0(node));
1438   return get_irn_n(node, pos);
1439 }
1440
1441 void
1442 set_Phi_pred (ir_node *node, int pos, ir_node *pred) {
1443   assert (is_Phi(node) || is_Phi0(node));
1444   set_irn_n(node, pos, pred);
1445 }
1446
1447
1448 int is_memop(ir_node *node) {
1449   return ((get_irn_op(node) == op_Load) || (get_irn_op(node) == op_Store));
1450 }
1451
1452 ir_node *get_memop_mem (ir_node *node) {
1453   assert(is_memop(node));
1454   return get_irn_n(node, 0);
1455 }
1456
1457 void     set_memop_mem (ir_node *node, ir_node *mem) {
1458   assert(is_memop(node));
1459   set_irn_n(node, 0, mem);
1460 }
1461
1462 ir_node *get_memop_ptr (ir_node *node) {
1463   assert(is_memop(node));
1464   return get_irn_n(node, 1);
1465 }
1466
1467 void     set_memop_ptr (ir_node *node, ir_node *ptr) {
1468   assert(is_memop(node));
1469   set_irn_n(node, 1, ptr);
1470 }
1471
1472 ir_node *
1473 get_Load_mem (ir_node *node) {
1474   assert (node->op == op_Load);
1475   return get_irn_n(node, 0);
1476 }
1477
1478 void
1479 set_Load_mem (ir_node *node, ir_node *mem) {
1480   assert (node->op == op_Load);
1481   set_irn_n(node, 0, mem);
1482 }
1483
1484 ir_node *
1485 get_Load_ptr (ir_node *node) {
1486   assert (node->op == op_Load);
1487   return get_irn_n(node, 1);
1488 }
1489
1490 void
1491 set_Load_ptr (ir_node *node, ir_node *ptr) {
1492   assert (node->op == op_Load);
1493   set_irn_n(node, 1, ptr);
1494 }
1495
1496 ir_mode *
1497 get_Load_mode (ir_node *node) {
1498   assert (node->op == op_Load);
1499   return node->attr.load.load_mode;
1500 }
1501
1502 void
1503 set_Load_mode (ir_node *node, ir_mode *mode) {
1504   assert (node->op == op_Load);
1505   node->attr.load.load_mode = mode;
1506 }
1507
1508 ent_volatility
1509 get_Load_volatility (ir_node *node) {
1510   assert (node->op == op_Load);
1511   return node->attr.load.volatility;
1512 }
1513
1514 void
1515 set_Load_volatility (ir_node *node, ent_volatility volatility) {
1516   assert (node->op == op_Load);
1517   node->attr.load.volatility = volatility;
1518 }
1519
1520
1521 ir_node *
1522 get_Store_mem (ir_node *node) {
1523   assert (node->op == op_Store);
1524   return get_irn_n(node, 0);
1525 }
1526
1527 void
1528 set_Store_mem (ir_node *node, ir_node *mem) {
1529   assert (node->op == op_Store);
1530   set_irn_n(node, 0, mem);
1531 }
1532
1533 ir_node *
1534 get_Store_ptr (ir_node *node) {
1535   assert (node->op == op_Store);
1536   return get_irn_n(node, 1);
1537 }
1538
1539 void
1540 set_Store_ptr (ir_node *node, ir_node *ptr) {
1541   assert (node->op == op_Store);
1542   set_irn_n(node, 1, ptr);
1543 }
1544
1545 ir_node *
1546 get_Store_value (ir_node *node) {
1547   assert (node->op == op_Store);
1548   return get_irn_n(node, 2);
1549 }
1550
1551 void
1552 set_Store_value (ir_node *node, ir_node *value) {
1553   assert (node->op == op_Store);
1554   set_irn_n(node, 2, value);
1555 }
1556
1557 ent_volatility
1558 get_Store_volatility (ir_node *node) {
1559   assert (node->op == op_Store);
1560   return node->attr.store.volatility;
1561 }
1562
1563 void
1564 set_Store_volatility (ir_node *node, ent_volatility volatility) {
1565   assert (node->op == op_Store);
1566   node->attr.store.volatility = volatility;
1567 }
1568
1569
1570 ir_node *
1571 get_Alloc_mem (ir_node *node) {
1572   assert (node->op == op_Alloc);
1573   return get_irn_n(node, 0);
1574 }
1575
1576 void
1577 set_Alloc_mem (ir_node *node, ir_node *mem) {
1578   assert (node->op == op_Alloc);
1579   set_irn_n(node, 0, mem);
1580 }
1581
1582 ir_node *
1583 get_Alloc_size (ir_node *node) {
1584   assert (node->op == op_Alloc);
1585   return get_irn_n(node, 1);
1586 }
1587
1588 void
1589 set_Alloc_size (ir_node *node, ir_node *size) {
1590   assert (node->op == op_Alloc);
1591   set_irn_n(node, 1, size);
1592 }
1593
1594 type  *
1595 get_Alloc_type (ir_node *node) {
1596   assert (node->op == op_Alloc);
1597   return node->attr.a.type = skip_tid(node->attr.a.type);
1598 }
1599
1600 void
1601 set_Alloc_type (ir_node *node, type *tp) {
1602   assert (node->op == op_Alloc);
1603   node->attr.a.type = tp;
1604 }
1605
1606 where_alloc
1607 get_Alloc_where (ir_node *node) {
1608   assert (node->op == op_Alloc);
1609   return node->attr.a.where;
1610 }
1611
1612 void
1613 set_Alloc_where (ir_node *node, where_alloc where) {
1614   assert (node->op == op_Alloc);
1615   node->attr.a.where = where;
1616 }
1617
1618
1619 ir_node *
1620 get_Free_mem (ir_node *node) {
1621   assert (node->op == op_Free);
1622   return get_irn_n(node, 0);
1623 }
1624
1625 void
1626 set_Free_mem (ir_node *node, ir_node *mem) {
1627   assert (node->op == op_Free);
1628   set_irn_n(node, 0, mem);
1629 }
1630
1631 ir_node *
1632 get_Free_ptr (ir_node *node) {
1633   assert (node->op == op_Free);
1634   return get_irn_n(node, 1);
1635 }
1636
1637 void
1638 set_Free_ptr (ir_node *node, ir_node *ptr) {
1639   assert (node->op == op_Free);
1640   set_irn_n(node, 1, ptr);
1641 }
1642
1643 ir_node *
1644 get_Free_size (ir_node *node) {
1645   assert (node->op == op_Free);
1646   return get_irn_n(node, 2);
1647 }
1648
1649 void
1650 set_Free_size (ir_node *node, ir_node *size) {
1651   assert (node->op == op_Free);
1652   set_irn_n(node, 2, size);
1653 }
1654
1655 type  *
1656 get_Free_type (ir_node *node) {
1657   assert (node->op == op_Free);
1658   return node->attr.f.type = skip_tid(node->attr.f.type);
1659 }
1660
1661 void
1662 set_Free_type (ir_node *node, type *tp) {
1663   assert (node->op == op_Free);
1664   node->attr.f.type = tp;
1665 }
1666
1667 where_alloc
1668 get_Free_where (ir_node *node) {
1669   assert (node->op == op_Free);
1670   return node->attr.f.where;
1671 }
1672
1673 void
1674 set_Free_where (ir_node *node, where_alloc where) {
1675   assert (node->op == op_Free);
1676   node->attr.f.where = where;
1677 }
1678
1679 ir_node **
1680 get_Sync_preds_arr (ir_node *node) {
1681   assert (node->op == op_Sync);
1682   return (ir_node **)&(get_irn_in(node)[1]);
1683 }
1684
1685 int
1686 get_Sync_n_preds (ir_node *node) {
1687   assert (node->op == op_Sync);
1688   return (get_irn_arity(node));
1689 }
1690
1691 /*
1692 void
1693 set_Sync_n_preds (ir_node *node, int n_preds) {
1694   assert (node->op == op_Sync);
1695 }
1696 */
1697
1698 ir_node *
1699 get_Sync_pred (ir_node *node, int pos) {
1700   assert (node->op == op_Sync);
1701   return get_irn_n(node, pos);
1702 }
1703
1704 void
1705 set_Sync_pred (ir_node *node, int pos, ir_node *pred) {
1706   assert (node->op == op_Sync);
1707   set_irn_n(node, pos, pred);
1708 }
1709
1710 ir_node *
1711 get_Proj_pred (ir_node *node) {
1712   assert (is_Proj(node));
1713   return get_irn_n(node, 0);
1714 }
1715
1716 void
1717 set_Proj_pred (ir_node *node, ir_node *pred) {
1718   assert (is_Proj(node));
1719   set_irn_n(node, 0, pred);
1720 }
1721
1722 long
1723 get_Proj_proj (ir_node *node) {
1724   assert (is_Proj(node));
1725   if (get_irn_opcode(node) == iro_Proj) {
1726     return node->attr.proj;
1727   } else {
1728     assert(get_irn_opcode(node) == iro_Filter);
1729     return node->attr.filter.proj;
1730   }
1731 }
1732
1733 void
1734 set_Proj_proj (ir_node *node, long proj) {
1735   assert (node->op == op_Proj);
1736   node->attr.proj = proj;
1737 }
1738
1739 ir_node **
1740 get_Tuple_preds_arr (ir_node *node) {
1741   assert (node->op == op_Tuple);
1742   return (ir_node **)&(get_irn_in(node)[1]);
1743 }
1744
1745 int
1746 get_Tuple_n_preds (ir_node *node) {
1747   assert (node->op == op_Tuple);
1748   return (get_irn_arity(node));
1749 }
1750
1751 /*
1752 void
1753 set_Tuple_n_preds (ir_node *node, int n_preds) {
1754   assert (node->op == op_Tuple);
1755 }
1756 */
1757
1758 ir_node *
1759 get_Tuple_pred (ir_node *node, int pos) {
1760   assert (node->op == op_Tuple);
1761   return get_irn_n(node, pos);
1762 }
1763
1764 void
1765 set_Tuple_pred (ir_node *node, int pos, ir_node *pred) {
1766   assert (node->op == op_Tuple);
1767   set_irn_n(node, pos, pred);
1768 }
1769
1770 ir_node *
1771 get_Id_pred (ir_node *node) {
1772   assert (node->op == op_Id);
1773   return get_irn_n(node, 0);
1774 }
1775
1776 void
1777 set_Id_pred (ir_node *node, ir_node *pred) {
1778   assert (node->op == op_Id);
1779   set_irn_n(node, 0, pred);
1780 }
1781
1782 ir_node *get_Confirm_value (ir_node *node) {
1783   assert (node->op == op_Confirm);
1784   return get_irn_n(node, 0);
1785 }
1786 void     set_Confirm_value (ir_node *node, ir_node *value) {
1787   assert (node->op == op_Confirm);
1788   set_irn_n(node, 0, value);
1789 }
1790 ir_node *get_Confirm_bound (ir_node *node) {
1791   assert (node->op == op_Confirm);
1792   return get_irn_n(node, 1);
1793 }
1794 void     set_Confirm_bound (ir_node *node, ir_node *bound) {
1795   assert (node->op == op_Confirm);
1796   set_irn_n(node, 0, bound);
1797 }
1798 pn_Cmp   get_Confirm_cmp   (ir_node *node) {
1799   assert (node->op == op_Confirm);
1800   return node->attr.confirm_cmp;
1801 }
1802 void     set_Confirm_cmp   (ir_node *node, pn_Cmp cmp) {
1803   assert (node->op == op_Confirm);
1804   node->attr.confirm_cmp = cmp;
1805 }
1806
1807
1808 ir_node *
1809 get_Filter_pred (ir_node *node) {
1810   assert(node->op == op_Filter);
1811   return node->in[1];
1812 }
1813 void
1814 set_Filter_pred (ir_node *node, ir_node *pred) {
1815   assert(node->op == op_Filter);
1816   node->in[1] = pred;
1817 }
1818 long
1819 get_Filter_proj(ir_node *node) {
1820   assert(node->op == op_Filter);
1821   return node->attr.filter.proj;
1822 }
1823 void
1824 set_Filter_proj (ir_node *node, long proj) {
1825   assert(node->op == op_Filter);
1826   node->attr.filter.proj = proj;
1827 }
1828
1829 /* Don't use get_irn_arity, get_irn_n in implementation as access
1830    shall work independent of view!!! */
1831 void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in) {
1832   assert(node->op == op_Filter);
1833   if (node->attr.filter.in_cg == NULL || arity != ARR_LEN(node->attr.filter.in_cg) - 1) {
1834     node->attr.filter.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
1835     node->attr.filter.backedge = NEW_ARR_D (int, current_ir_graph->obst, arity);
1836     memset(node->attr.filter.backedge, 0, sizeof(int) * arity);
1837     node->attr.filter.in_cg[0] = node->in[0];
1838   }
1839   memcpy(node->attr.filter.in_cg + 1, in, sizeof(ir_node *) * arity);
1840 }
1841
1842 void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred) {
1843   assert(node->op == op_Filter && node->attr.filter.in_cg &&
1844      0 <= pos && pos < ARR_LEN(node->attr.filter.in_cg) - 1);
1845   node->attr.filter.in_cg[pos + 1] = pred;
1846 }
1847 int get_Filter_n_cg_preds(ir_node *node) {
1848   assert(node->op == op_Filter && node->attr.filter.in_cg);
1849   return (ARR_LEN(node->attr.filter.in_cg) - 1);
1850 }
1851 ir_node *get_Filter_cg_pred(ir_node *node, int pos) {
1852   int arity;
1853   assert(node->op == op_Filter && node->attr.filter.in_cg &&
1854      0 <= pos);
1855   arity = ARR_LEN(node->attr.filter.in_cg);
1856   assert(pos <  arity - 1);
1857   return node->attr.filter.in_cg[pos + 1];
1858 }
1859
1860 /* Mux support */
1861 ir_node *get_Mux_sel   (ir_node *node) {
1862   assert(node->op == op_Mux);
1863   return node->in[1];
1864 }
1865 void     set_Mux_sel   (ir_node *node, ir_node *sel) {
1866   assert(node->op == op_Mux);
1867   node->in[1] = sel;
1868 }
1869
1870 ir_node *get_Mux_false (ir_node *node) {
1871   assert(node->op == op_Mux);
1872   return node->in[2];
1873 }
1874 void     set_Mux_false (ir_node *node, ir_node *ir_false) {
1875   assert(node->op == op_Mux);
1876   node->in[2] = ir_false;
1877 }
1878
1879 ir_node *get_Mux_true  (ir_node *node) {
1880   assert(node->op == op_Mux);
1881   return node->in[3];
1882 }
1883 void     set_Mux_true  (ir_node *node, ir_node *ir_true) {
1884   assert(node->op == op_Mux);
1885   node->in[3] = ir_true;
1886 }
1887
1888
1889 ir_graph *
1890 get_irn_irg(const ir_node *node) {
1891   if (! is_Block(node))
1892     node = get_nodes_block(node);
1893   if (is_Bad(node))  /* sometimes bad is predecessor of nodes instead of block: in case of optimization */
1894     node = get_nodes_block(node);
1895   assert(get_irn_op(node) == op_Block);
1896   return node->attr.block.irg;
1897 }
1898
1899
1900 /*----------------------------------------------------------------*/
1901 /*  Auxiliary routines                                            */
1902 /*----------------------------------------------------------------*/
1903
1904 ir_node *
1905 skip_Proj (ir_node *node) {
1906   /* don't assert node !!! */
1907   if (node && is_Proj(node)) {
1908     return get_Proj_pred(node);
1909   } else {
1910     return node;
1911   }
1912 }
1913
1914 ir_node *
1915 skip_Tuple (ir_node *node) {
1916   ir_node *pred;
1917
1918   if (!get_opt_normalize()) return node;
1919
1920   node = skip_Id(node);
1921   if (get_irn_op(node) == op_Proj) {
1922     pred = skip_Id(get_Proj_pred(node));
1923     if (get_irn_op(pred) == op_Proj) /* nested Tuple ? */
1924       pred = skip_Id(skip_Tuple(pred));
1925     if (get_irn_op(pred) == op_Tuple)
1926       return get_Tuple_pred(pred, get_Proj_proj(node));
1927   }
1928   return node;
1929 }
1930
1931 /** returns operand of node if node is a Cast */
1932 ir_node *skip_Cast  (ir_node *node) {
1933   if (node && get_irn_op(node) == op_Cast) {
1934     return skip_Id(get_irn_n(node, 0));
1935   } else {
1936     return node;
1937   }
1938 }
1939
1940 #if 0
1941 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
1942    than any other approach, as Id chains are resolved and all point to the real node, or
1943    all id's are self loops. */
1944 ir_node *
1945 skip_Id (ir_node *node) {
1946   /* don't assert node !!! */
1947
1948   if (!get_opt_normalize()) return node;
1949
1950   /* Don't use get_Id_pred:  We get into an endless loop for
1951      self-referencing Ids. */
1952   if (node && (node->op == op_Id) && (node != node->in[0+1])) {
1953     ir_node *rem_pred = node->in[0+1];
1954     ir_node *res;
1955
1956     assert (get_irn_arity (node) > 0);
1957
1958     node->in[0+1] = node;
1959     res = skip_Id(rem_pred);
1960     if (res->op == op_Id) /* self-loop */ return node;
1961
1962     node->in[0+1] = res;
1963     return res;
1964   } else {
1965     return node;
1966   }
1967 }
1968 #else
1969 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
1970    than any other approach, as Id chains are resolved and all point to the real node, or
1971    all id's are self loops. */
1972 ir_node *
1973 skip_Id (ir_node *node) {
1974   ir_node *pred;
1975   /* don't assert node !!! */
1976
1977   if (!node || (node->op != op_Id)) return node;
1978
1979   if (!get_opt_normalize()) return node;
1980
1981   /* Don't use get_Id_pred:  We get into an endless loop for
1982      self-referencing Ids. */
1983   pred = node->in[0+1];
1984
1985   if (pred->op != op_Id) return pred;
1986
1987   if (node != pred) {  /* not a self referencing Id. Resolve Id chain. */
1988     ir_node *rem_pred, *res;
1989
1990     if (pred->op != op_Id) return pred; /* shortcut */
1991     rem_pred = pred;
1992
1993     assert (get_irn_arity (node) > 0);
1994
1995     node->in[0+1] = node;   /* turn us into a self referencing Id:  shorten Id cycles. */
1996     res = skip_Id(rem_pred);
1997     if (res->op == op_Id) /* self-loop */ return node;
1998
1999     node->in[0+1] = res;    /* Turn Id chain into Ids all referencing the chain end. */
2000     return res;
2001   } else {
2002     return node;
2003   }
2004 }
2005 #endif
2006
2007 int
2008 (is_Bad)(const ir_node *node) {
2009   return _is_Bad(node);
2010 }
2011
2012 int
2013 (is_no_Block)(const ir_node *node) {
2014   return _is_no_Block(node);
2015 }
2016
2017 int
2018 (is_Block)(const ir_node *node) {
2019   return _is_Block(node);
2020 }
2021
2022 /* returns true if node is a Unknown node. */
2023 int
2024 is_Unknown (const ir_node *node) {
2025   assert(node);
2026   return (get_irn_op(node) == op_Unknown);
2027 }
2028
2029 int
2030 is_Proj (const ir_node *node) {
2031   assert(node);
2032   return node->op == op_Proj
2033     || (!get_interprocedural_view() && node->op == op_Filter);
2034 }
2035
2036 /* Returns true if the operation manipulates control flow. */
2037 int
2038 is_cfop(const ir_node *node) {
2039   return is_cfopcode(get_irn_op(node));
2040 }
2041
2042 /* Returns true if the operation manipulates interprocedural control flow:
2043    CallBegin, EndReg, EndExcept */
2044 int is_ip_cfop(const ir_node *node) {
2045   return is_ip_cfopcode(get_irn_op(node));
2046 }
2047
2048 /* Returns true if the operation can change the control flow because
2049    of an exception. */
2050 int
2051 is_fragile_op(const ir_node *node) {
2052   return is_op_fragile(get_irn_op(node));
2053 }
2054
2055 /* Returns the memory operand of fragile operations. */
2056 ir_node *get_fragile_op_mem(ir_node *node) {
2057   assert(node && is_fragile_op(node));
2058
2059   switch (get_irn_opcode (node)) {
2060   case iro_Call  :
2061   case iro_Quot  :
2062   case iro_DivMod:
2063   case iro_Div   :
2064   case iro_Mod   :
2065   case iro_Load  :
2066   case iro_Store :
2067   case iro_Alloc :
2068     return get_irn_n(node, 0);
2069   case iro_Bad   :
2070   case iro_Unknown:
2071     return node;
2072   default: ;
2073     assert(0 && "should not be reached");
2074     return NULL;
2075   }
2076 }
2077
2078 /* Returns true if the operation is a forking control flow operation. */
2079 int
2080 is_forking_op(const ir_node *node) {
2081   return is_op_forking(get_irn_op(node));
2082 }
2083
2084
2085 #ifdef DEBUG_libfirm
2086 void dump_irn (ir_node *n) {
2087   int i, arity = get_irn_arity(n);
2088   printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n);
2089   if (!is_Block(n)) {
2090     ir_node *pred = get_irn_n(n, -1);
2091     printf("  block: %s%s: %ld (%p)\n", get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2092        get_irn_node_nr(pred), (void *)pred);
2093   }
2094   printf("  preds: \n");
2095   for (i = 0; i < arity; ++i) {
2096     ir_node *pred = get_irn_n(n, i);
2097     printf("    %d: %s%s: %ld (%p)\n", i, get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2098        get_irn_node_nr(pred), (void *)pred);
2099   }
2100 }
2101
2102 #else  /* DEBUG_libfirm */
2103 void dump_irn (ir_node *n) {}
2104 #endif /* DEBUG_libfirm */