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