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