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