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