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