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