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