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