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