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