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