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