autoconf stuff
[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_class_ident((type_class *)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_method *
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_method *
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_method *type) {
752   assert (node->op == op_Call);
753   node->attr.call = type;
754 }
755
756 /* For unary and binary arithmetic operations the access to the
757    operands can be factored out.  Left is the first, right the
758    second arithmetic value  as listed in tech report 0999-33.
759    unops are: Minus, Abs, Not, Conv
760    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
761    Shr, Shrs, Rotate, Cmp */
762
763 int
764 is_unop (ir_node *node) {
765   return ( node->op == op_Minus ||
766            node->op == op_Abs  ||
767            node->op == op_Not  ||
768            node->op == op_Conv );
769 }
770
771 inline ir_node *
772 get_unop_op (ir_node *node) {
773   assert ( node->op == op_Minus ||
774            node->op == op_Abs  ||
775             node->op == op_Not  ||
776            node->op == op_Conv );
777   switch (get_irn_opcode (node)) {
778     case iro_Minus: return get_Minus_op(node); break;
779     case iro_Abs:   return get_Abs_op(node);   break;
780     case iro_Not:   return get_Not_op(node);   break;
781     case iro_Conv:  return get_Conv_op(node);  break;
782     default: return NULL;
783   }
784 }
785
786 inline void
787 set_unop_op (ir_node *node, ir_node *op) {
788     assert (node->op == op_Minus ||
789             node->op == op_Abs   ||
790             node->op == op_Not   ||
791             node->op == op_Conv    );
792     switch (get_irn_opcode (node)) {
793     case iro_Minus:   set_Minus_op(node, op); break;
794     case iro_Abs:     set_Abs_op(node, op);   break;
795     case iro_Not:     set_Not_op(node, op);   break;
796     case iro_Conv:    set_Conv_op(node, op);  break;
797     default:  ;
798     }
799
800 }
801
802 int
803 is_binop (ir_node *node) {
804   return (node->op == op_Add    ||
805           node->op == op_Sub    ||
806           node->op == op_Mul    ||
807           node->op == op_Quot   ||
808           node->op == op_DivMod ||
809           node->op == op_Div    ||
810           node->op == op_Mod    ||
811           node->op == op_And    ||
812           node->op == op_Or     ||
813           node->op == op_Eor    ||
814           node->op == op_Shl    ||
815           node->op == op_Shr    ||
816           node->op == op_Shrs   ||
817           node->op == op_Rot    ||
818           node->op == op_Cmp      );
819 }
820
821 inline ir_node *
822 get_binop_left (ir_node *node) {
823   assert (node->op == op_Add    ||
824           node->op == op_Sub    ||
825           node->op == op_Mul    ||
826           node->op == op_Quot   ||
827           node->op == op_DivMod ||
828           node->op == op_Div    ||
829           node->op == op_Mod    ||
830           node->op == op_And    ||
831           node->op == op_Or     ||
832           node->op == op_Eor    ||
833           node->op == op_Shl    ||
834           node->op == op_Shr    ||
835           node->op == op_Shrs   ||
836           node->op == op_Rot    ||
837           node->op == op_Cmp      );
838
839     switch (get_irn_opcode (node)) {
840       case iro_Add   :     return get_Add_left(node);  break;
841       case iro_Sub   :     return get_Sub_left(node);  break;
842       case iro_Mul   :     return get_Mul_left(node);  break;
843       case iro_Quot  :     return get_Quot_left(node); break;
844       case iro_DivMod:     return get_DivMod_left(node);  break;
845       case iro_Div   :     return get_Div_left(node);  break;
846       case iro_Mod   :     return get_Mod_left(node);  break;
847       case iro_And   :     return get_And_left(node);  break;
848       case iro_Or    :     return get_Or_left(node);   break;
849       case iro_Eor   :     return get_Eor_left(node);  break;
850       case iro_Shl   :     return get_Shl_left(node);  break;
851       case iro_Shr   :     return get_Shr_left(node);  break;
852       case iro_Shrs  :     return get_Shrs_left(node); break;
853       case iro_Rot   :     return get_Rot_left(node);  break;
854       case iro_Cmp   :     return get_Cmp_left(node);  break;
855     default:  return NULL;
856   };
857 }
858
859 inline void
860 set_binop_left (ir_node *node, ir_node *left) {
861   assert (node->op == op_Add    ||
862           node->op == op_Sub    ||
863           node->op == op_Mul    ||
864           node->op == op_Quot   ||
865           node->op == op_DivMod ||
866           node->op == op_Div    ||
867           node->op == op_Mod    ||
868           node->op == op_And    ||
869           node->op == op_Or     ||
870           node->op == op_Eor    ||
871           node->op == op_Shl    ||
872           node->op == op_Shr    ||
873           node->op == op_Shrs   ||
874           node->op == op_Rot    ||
875           node->op == op_Cmp      );
876
877     switch (get_irn_opcode (node)) {
878       case iro_Add   :     set_Add_left(node, left);  break;
879       case iro_Sub   :     set_Sub_left(node, left);  break;
880       case iro_Mul   :     set_Mul_left(node, left);  break;
881       case iro_Quot  :     set_Quot_left(node, left); break;
882       case iro_DivMod:     set_DivMod_left(node, left);  break;
883       case iro_Div   :     set_Div_left(node, left);  break;
884       case iro_Mod   :     set_Mod_left(node, left);  break;
885       case iro_And   :     set_And_left(node, left);  break;
886       case iro_Or    :     set_Or_left(node, left);   break;
887       case iro_Eor   :     set_Eor_left(node, left);  break;
888       case iro_Shl   :     set_Shl_left(node, left);  break;
889       case iro_Shr   :     set_Shr_left(node, left);  break;
890       case iro_Shrs  :     set_Shrs_left(node, left); break;
891       case iro_Rot   :     set_Rot_left(node, left);  break;
892       case iro_Cmp   :     set_Cmp_left(node, left);  break;
893     default:  ;
894   };
895 }
896
897 inline ir_node *
898 get_binop_right (ir_node *node) {
899   assert (node->op == op_Add    ||
900           node->op == op_Sub    ||
901           node->op == op_Mul    ||
902           node->op == op_Quot   ||
903           node->op == op_DivMod ||
904           node->op == op_Div    ||
905           node->op == op_Mod    ||
906           node->op == op_And    ||
907           node->op == op_Or     ||
908           node->op == op_Eor    ||
909           node->op == op_Shl    ||
910           node->op == op_Shr    ||
911           node->op == op_Shrs   ||
912           node->op == op_Rot    ||
913           node->op == op_Cmp      );
914
915     switch (get_irn_opcode (node)) {
916       case iro_Add   :     return get_Add_right(node);  break;
917       case iro_Sub   :     return get_Sub_right(node);  break;
918       case iro_Mul   :     return get_Mul_right(node);  break;
919       case iro_Quot  :     return get_Quot_right(node); break;
920       case iro_DivMod:     return get_DivMod_right(node);  break;
921       case iro_Div   :     return get_Div_right(node);  break;
922       case iro_Mod   :     return get_Mod_right(node);  break;
923       case iro_And   :     return get_And_right(node);  break;
924       case iro_Or    :     return get_Or_right(node);   break;
925       case iro_Eor   :     return get_Eor_right(node);  break;
926       case iro_Shl   :     return get_Shl_right(node);  break;
927       case iro_Shr   :     return get_Shr_right(node);  break;
928       case iro_Shrs  :     return get_Shrs_right(node); break;
929       case iro_Rot   :     return get_Rot_right(node);  break;
930       case iro_Cmp   :     return get_Cmp_right(node);  break;
931     default:  return NULL;
932   };
933 }
934
935 inline void
936 set_binop_right (ir_node *node, ir_node *right) {
937   assert (node->op == op_Add    ||
938           node->op == op_Sub    ||
939           node->op == op_Mul    ||
940           node->op == op_Quot   ||
941           node->op == op_DivMod ||
942           node->op == op_Div    ||
943           node->op == op_Mod    ||
944           node->op == op_And    ||
945           node->op == op_Or     ||
946           node->op == op_Eor    ||
947           node->op == op_Shl    ||
948           node->op == op_Shr    ||
949           node->op == op_Shrs   ||
950           node->op == op_Rot    ||
951           node->op == op_Cmp      );
952
953     switch (get_irn_opcode (node)) {
954       case iro_Add   :     set_Add_right(node, right);  break;
955       case iro_Sub   :     set_Sub_right(node, right);  break;
956       case iro_Mul   :     set_Mul_right(node, right);  break;
957       case iro_Quot  :     set_Quot_right(node, right); break;
958       case iro_DivMod:     set_DivMod_right(node, right);  break;
959       case iro_Div   :     set_Div_right(node, right);  break;
960       case iro_Mod   :     set_Mod_right(node, right);  break;
961       case iro_And   :     set_And_right(node, right);  break;
962       case iro_Or    :     set_Or_right(node, right);   break;
963       case iro_Eor   :     set_Eor_right(node, right);  break;
964       case iro_Shl   :     set_Shl_right(node, right);  break;
965       case iro_Shr   :     set_Shr_right(node, right);  break;
966       case iro_Shrs  :     set_Shrs_right(node, right); break;
967       case iro_Rot   :     set_Rot_right(node, right);  break;
968       case iro_Cmp   :     set_Cmp_right(node, right);  break;
969     default: ;
970   };
971 }
972
973 inline ir_node *
974 get_Add_left (ir_node *node) {
975   assert (node->op == op_Add);
976   return get_irn_n(node, 0);
977 }
978
979 inline void
980 set_Add_left (ir_node *node, ir_node *left) {
981   assert (node->op == op_Add);
982   set_irn_n(node, 0, left);
983 }
984
985 inline ir_node *
986 get_Add_right (ir_node *node) {
987   assert (node->op == op_Add);
988   return get_irn_n(node, 1);
989 }
990
991 inline void
992 set_Add_right (ir_node *node, ir_node *right) {
993   assert (node->op == op_Add);
994   set_irn_n(node, 1, right);
995 }
996
997 inline ir_node *
998 get_Sub_left (ir_node *node) {
999   assert (node->op == op_Sub);
1000   return get_irn_n(node, 0);
1001 }
1002
1003 inline void
1004 set_Sub_left (ir_node *node, ir_node *left) {
1005   assert (node->op == op_Sub);
1006   set_irn_n(node, 0, left);
1007 }
1008
1009 inline ir_node *
1010 get_Sub_right (ir_node *node) {
1011   assert (node->op == op_Sub);
1012   return get_irn_n(node, 1);
1013 }
1014
1015 inline void
1016 set_Sub_right (ir_node *node, ir_node *right) {
1017   assert (node->op == op_Sub);
1018   set_irn_n(node, 1, right);
1019 }
1020
1021
1022 inline ir_node *
1023 get_Minus_op (ir_node *node) {
1024   assert (node->op == op_Minus);
1025   return get_irn_n(node, 0);
1026 }
1027
1028 inline void
1029 set_Minus_op (ir_node *node, ir_node *op) {
1030   assert (node->op == op_Minus);
1031   set_irn_n(node, 0, op);
1032 }
1033
1034
1035 inline ir_node *
1036 get_Mul_left (ir_node *node) {
1037   assert (node->op == op_Mul);
1038   return get_irn_n(node, 0);
1039 }
1040
1041 inline void
1042 set_Mul_left (ir_node *node, ir_node *left) {
1043   assert (node->op == op_Mul);
1044   set_irn_n(node, 0, left);
1045 }
1046
1047 inline ir_node *
1048 get_Mul_right (ir_node *node) {
1049   assert (node->op == op_Mul);
1050   return get_irn_n(node, 1);
1051 }
1052
1053 inline void
1054 set_Mul_right (ir_node *node, ir_node *right) {
1055   assert (node->op == op_Mul);
1056   set_irn_n(node, 1, right);
1057 }
1058
1059 inline ir_node *
1060 get_Quot_left (ir_node *node) {
1061   assert (node->op == op_Quot);
1062   return get_irn_n(node, 1);
1063 }
1064
1065 inline void
1066 set_Quot_left (ir_node *node, ir_node *left) {
1067   assert (node->op == op_Quot);
1068   set_irn_n(node, 1, left);
1069 }
1070
1071 inline ir_node *
1072 get_Quot_right (ir_node *node) {
1073   assert (node->op == op_Quot);
1074   return get_irn_n(node, 2);
1075 }
1076
1077 inline void
1078 set_Quot_right (ir_node *node, ir_node *right) {
1079   assert (node->op == op_Quot);
1080   set_irn_n(node, 2, right);
1081 }
1082
1083 inline ir_node *
1084 get_Quot_mem (ir_node *node) {
1085   assert (node->op == op_Quot);
1086   return get_irn_n(node, 0);
1087 }
1088
1089 inline void
1090 set_Quot_mem (ir_node *node, ir_node *mem) {
1091   assert (node->op == op_Quot);
1092   set_irn_n(node, 0, mem);
1093 }
1094
1095 inline ir_node *
1096 get_DivMod_left (ir_node *node) {
1097   assert (node->op == op_DivMod);
1098   return get_irn_n(node, 1);
1099 }
1100
1101 inline void
1102 set_DivMod_left (ir_node *node, ir_node *left) {
1103   assert (node->op == op_DivMod);
1104   set_irn_n(node, 1, left);
1105 }
1106
1107 inline ir_node *
1108 get_DivMod_right (ir_node *node) {
1109   assert (node->op == op_DivMod);
1110   return get_irn_n(node, 2);
1111 }
1112
1113 inline void
1114 set_DivMod_right (ir_node *node, ir_node *right) {
1115   assert (node->op == op_DivMod);
1116   set_irn_n(node, 2, right);
1117 }
1118
1119 inline ir_node *
1120 get_DivMod_mem (ir_node *node) {
1121   assert (node->op == op_DivMod);
1122   return get_irn_n(node, 0);
1123 }
1124
1125 inline void
1126 set_DivMod_mem (ir_node *node, ir_node *mem) {
1127   assert (node->op == op_DivMod);
1128   set_irn_n(node, 0, mem);
1129 }
1130
1131 inline ir_node *
1132 get_Div_left (ir_node *node) {
1133   assert (node->op == op_Div);
1134   return get_irn_n(node, 1);
1135 }
1136
1137 inline void
1138 set_Div_left (ir_node *node, ir_node *left) {
1139   assert (node->op == op_Div);
1140   set_irn_n(node, 1, left);
1141 }
1142
1143 inline ir_node *
1144 get_Div_right (ir_node *node) {
1145   assert (node->op == op_Div);
1146   return get_irn_n(node, 2);
1147 }
1148
1149 inline void
1150 set_Div_right (ir_node *node, ir_node *right) {
1151   assert (node->op == op_Div);
1152   set_irn_n(node, 2, right);
1153 }
1154
1155 inline ir_node *
1156 get_Div_mem (ir_node *node) {
1157   assert (node->op == op_Div);
1158   return get_irn_n(node, 0);
1159 }
1160
1161 inline void
1162 set_Div_mem (ir_node *node, ir_node *mem) {
1163   assert (node->op == op_Div);
1164   set_irn_n(node, 0, mem);
1165 }
1166
1167 inline ir_node *
1168 get_Mod_left (ir_node *node) {
1169   assert (node->op == op_Mod);
1170   return get_irn_n(node, 1);
1171 }
1172
1173 inline void
1174 set_Mod_left (ir_node *node, ir_node *left) {
1175   assert (node->op == op_Mod);
1176   set_irn_n(node, 1, left);
1177 }
1178
1179 inline ir_node *
1180 get_Mod_right (ir_node *node) {
1181   assert (node->op == op_Mod);
1182   return get_irn_n(node, 2);
1183 }
1184
1185 inline void
1186 set_Mod_right (ir_node *node, ir_node *right) {
1187   assert (node->op == op_Mod);
1188   set_irn_n(node, 2, right);
1189 }
1190
1191 inline ir_node *
1192 get_Mod_mem (ir_node *node) {
1193   assert (node->op == op_Mod);
1194   return get_irn_n(node, 0);
1195 }
1196
1197 inline void
1198 set_Mod_mem (ir_node *node, ir_node *mem) {
1199   assert (node->op == op_Mod);
1200   set_irn_n(node, 0, mem);
1201 }
1202
1203 inline ir_node *
1204 get_Abs_op (ir_node *node) {
1205   assert (node->op == op_Abs);
1206   return get_irn_n(node, 0);
1207 }
1208
1209 inline void
1210 set_Abs_op (ir_node *node, ir_node *op) {
1211   assert (node->op == op_Abs);
1212   set_irn_n(node, 0, op);
1213 }
1214
1215 inline ir_node *
1216 get_And_left (ir_node *node) {
1217   assert (node->op == op_And);
1218   return get_irn_n(node, 0);
1219 }
1220
1221 inline void
1222 set_And_left (ir_node *node, ir_node *left) {
1223   assert (node->op == op_And);
1224   set_irn_n(node, 0, left);
1225 }
1226
1227 inline ir_node *
1228 get_And_right (ir_node *node) {
1229   assert (node->op == op_And);
1230   return get_irn_n(node, 1);
1231 }
1232
1233 inline void
1234 set_And_right (ir_node *node, ir_node *right) {
1235   assert (node->op == op_And);
1236   set_irn_n(node, 1, right);
1237 }
1238
1239 inline ir_node *
1240 get_Or_left (ir_node *node) {
1241   assert (node->op == op_Or);
1242   return get_irn_n(node, 0);
1243 }
1244
1245 inline void
1246 set_Or_left (ir_node *node, ir_node *left) {
1247   assert (node->op == op_Or);
1248   set_irn_n(node, 0, left);
1249 }
1250
1251 inline ir_node *
1252 get_Or_right (ir_node *node) {
1253   assert (node->op == op_Or);
1254   return get_irn_n(node, 1);
1255 }
1256
1257 inline void
1258 set_Or_right (ir_node *node, ir_node *right) {
1259   assert (node->op == op_Or);
1260   set_irn_n(node, 1, right);
1261 }
1262
1263 inline ir_node *
1264 get_Eor_left (ir_node *node) {
1265   assert (node->op == op_Eor);
1266   return get_irn_n(node, 0);
1267 }
1268
1269 inline void
1270 set_Eor_left (ir_node *node, ir_node *left) {
1271   assert (node->op == op_Eor);
1272   set_irn_n(node, 0, left);
1273 }
1274
1275 inline ir_node *
1276 get_Eor_right (ir_node *node) {
1277   assert (node->op == op_Eor);
1278   return get_irn_n(node, 1);
1279 }
1280
1281 inline void
1282 set_Eor_right (ir_node *node, ir_node *right) {
1283   assert (node->op == op_Eor);
1284   set_irn_n(node, 1, right);
1285 }
1286
1287
1288 inline ir_node *
1289 get_Not_op (ir_node *node) {
1290   assert (node->op == op_Not);
1291   return get_irn_n(node, 0);
1292 }
1293
1294 inline void
1295 set_Not_op (ir_node *node, ir_node *op) {
1296   assert (node->op == op_Not);
1297   set_irn_n(node, 0, op);
1298 }
1299
1300
1301 inline ir_node *
1302 get_Shl_left (ir_node *node) {
1303   assert (node->op == op_Shl);
1304   return get_irn_n(node, 0);
1305 }
1306
1307 inline void
1308 set_Shl_left (ir_node *node, ir_node *left) {
1309   assert (node->op == op_Shl);
1310   set_irn_n(node, 0, left);
1311 }
1312
1313 inline ir_node *
1314 get_Shl_right (ir_node *node) {
1315   assert (node->op == op_Shl);
1316   return get_irn_n(node, 1);
1317 }
1318
1319 inline void
1320 set_Shl_right (ir_node *node, ir_node *right) {
1321   assert (node->op == op_Shl);
1322   set_irn_n(node, 1, right);
1323 }
1324
1325 inline ir_node *
1326 get_Shr_left (ir_node *node) {
1327   assert (node->op == op_Shr);
1328   return get_irn_n(node, 0);
1329 }
1330
1331 inline void
1332 set_Shr_left (ir_node *node, ir_node *left) {
1333   assert (node->op == op_Shr);
1334   set_irn_n(node, 0, left);
1335 }
1336
1337 inline ir_node *
1338 get_Shr_right (ir_node *node) {
1339   assert (node->op == op_Shr);
1340   return get_irn_n(node, 1);
1341 }
1342
1343 inline void
1344 set_Shr_right (ir_node *node, ir_node *right) {
1345   assert (node->op == op_Shr);
1346   set_irn_n(node, 1, right);
1347 }
1348
1349 inline ir_node *
1350 get_Shrs_left (ir_node *node) {
1351   assert (node->op == op_Shrs);
1352   return get_irn_n(node, 0);
1353 }
1354
1355 inline void
1356 set_Shrs_left (ir_node *node, ir_node *left) {
1357   assert (node->op == op_Shrs);
1358   set_irn_n(node, 0, left);
1359 }
1360
1361 inline ir_node *
1362 get_Shrs_right (ir_node *node) {
1363   assert (node->op == op_Shrs);
1364   return get_irn_n(node, 1);
1365 }
1366
1367 inline void
1368 set_Shrs_right (ir_node *node, ir_node *right) {
1369   assert (node->op == op_Shrs);
1370   set_irn_n(node, 1, right);
1371 }
1372
1373 inline ir_node *
1374 get_Rot_left (ir_node *node) {
1375   assert (node->op == op_Rot);
1376   return get_irn_n(node, 0);
1377 }
1378
1379 inline void
1380 set_Rot_left (ir_node *node, ir_node *left) {
1381   assert (node->op == op_Rot);
1382   set_irn_n(node, 0, left);
1383 }
1384
1385 inline ir_node *
1386 get_Rot_right (ir_node *node) {
1387   assert (node->op == op_Rot);
1388   return get_irn_n(node, 1);
1389 }
1390
1391 inline void
1392 set_Rot_right (ir_node *node, ir_node *right) {
1393   assert (node->op == op_Rot);
1394   set_irn_n(node, 1, right);
1395 }
1396
1397 inline ir_node *
1398 get_Cmp_left (ir_node *node) {
1399   assert (node->op == op_Cmp);
1400   return get_irn_n(node, 0);
1401 }
1402
1403 inline void
1404 set_Cmp_left (ir_node *node, ir_node *left) {
1405   assert (node->op == op_Cmp);
1406   set_irn_n(node, 0, left);
1407 }
1408
1409 inline ir_node *
1410 get_Cmp_right (ir_node *node) {
1411   assert (node->op == op_Cmp);
1412   return get_irn_n(node, 1);
1413 }
1414
1415 inline void
1416 set_Cmp_right (ir_node *node, ir_node *right) {
1417   assert (node->op == op_Cmp);
1418   set_irn_n(node, 1, right);
1419 }
1420
1421 inline ir_node *
1422 get_Conv_op (ir_node *node) {
1423   assert (node->op == op_Conv);
1424   return get_irn_n(node, 0);
1425 }
1426
1427 inline void
1428 set_Conv_op (ir_node *node, ir_node *op) {
1429   assert (node->op == op_Conv);
1430   set_irn_n(node, 0, op);
1431 }
1432
1433 inline ir_node **
1434 get_Phi_preds_arr (ir_node *node) {
1435   assert (node->op == op_Phi);
1436   return (ir_node **)&(get_irn_in(node)[1]);
1437 }
1438
1439 inline int
1440 get_Phi_n_preds (ir_node *node) {
1441   assert (node->op == op_Phi);
1442   return (get_irn_arity(node));
1443 }
1444
1445 /*
1446 inline void set_Phi_n_preds (ir_node *node, int n_preds) {
1447   assert (node->op == op_Phi);
1448 }
1449 */
1450
1451 inline ir_node *
1452 get_Phi_pred (ir_node *node, int pos) {
1453   assert (node->op == op_Phi);
1454   return get_irn_n(node, pos);
1455 }
1456
1457 inline void
1458 set_Phi_pred (ir_node *node, int pos, ir_node *pred) {
1459   assert (node->op == op_Phi);
1460   set_irn_n(node, pos, pred);
1461 }
1462
1463 inline ir_node *
1464 get_Load_mem (ir_node *node) {
1465   assert (node->op == op_Load);
1466   return get_irn_n(node, 0);
1467 }
1468
1469 inline void
1470 set_Load_mem (ir_node *node, ir_node *mem) {
1471   assert (node->op == op_Load);
1472   set_irn_n(node, 0, mem);
1473 }
1474
1475 inline ir_node *
1476 get_Load_ptr (ir_node *node) {
1477   assert (node->op == op_Load);
1478   return get_irn_n(node, 1);
1479 }
1480
1481 inline void
1482 set_Load_ptr (ir_node *node, ir_node *ptr) {
1483   assert (node->op == op_Load);
1484   set_irn_n(node, 1, ptr);
1485 }
1486
1487 inline
1488 ir_node *
1489 get_Store_mem (ir_node *node) {
1490   assert (node->op == op_Store);
1491   return get_irn_n(node, 0);
1492 }
1493
1494 inline void
1495 set_Store_mem (ir_node *node, ir_node *mem) {
1496   assert (node->op == op_Store);
1497   set_irn_n(node, 0, mem);
1498 }
1499
1500 inline ir_node *
1501 get_Store_ptr (ir_node *node) {
1502   assert (node->op == op_Store);
1503   return get_irn_n(node, 1);
1504 }
1505
1506 inline void
1507 set_Store_ptr (ir_node *node, ir_node *ptr) {
1508   assert (node->op == op_Store);
1509   set_irn_n(node, 1, ptr);
1510 }
1511
1512 inline ir_node *
1513 get_Store_value (ir_node *node) {
1514   assert (node->op == op_Store);
1515   return get_irn_n(node, 2);
1516 }
1517
1518 inline void
1519 set_Store_value (ir_node *node, ir_node *value) {
1520   assert (node->op == op_Store);
1521   set_irn_n(node, 2, value);
1522 }
1523
1524 inline ir_node *
1525 get_Alloc_mem (ir_node *node) {
1526   assert (node->op == op_Alloc);
1527   return get_irn_n(node, 0);
1528 }
1529
1530 inline void
1531 set_Alloc_mem (ir_node *node, ir_node *mem) {
1532   assert (node->op == op_Alloc);
1533   set_irn_n(node, 0, mem);
1534 }
1535
1536 inline ir_node *
1537 get_Alloc_size (ir_node *node) {
1538   assert (node->op == op_Alloc);
1539   return get_irn_n(node, 1);
1540 }
1541
1542 inline void
1543 set_Alloc_size (ir_node *node, ir_node *size) {
1544   assert (node->op == op_Alloc);
1545   set_irn_n(node, 1, size);
1546 }
1547
1548 inline type  *
1549 get_Alloc_type (ir_node *node) {
1550   assert (node->op == op_Alloc);
1551   return node->attr.a.type;
1552 }
1553
1554 inline void
1555 set_Alloc_type (ir_node *node, type *type) {
1556   assert (node->op == op_Alloc);
1557   node->attr.a.type = type;
1558 }
1559
1560 inline where_alloc
1561 get_Alloc_where (ir_node *node) {
1562   assert (node->op == op_Alloc);
1563   return node->attr.a.where;
1564 }
1565
1566 inline void
1567 set_Alloc_where (ir_node *node, where_alloc where) {
1568   assert (node->op == op_Alloc);
1569   node->attr.a.where = where;
1570 }
1571
1572
1573 inline ir_node *
1574 get_Free_mem (ir_node *node) {
1575   assert (node->op == op_Free);
1576   return get_irn_n(node, 0);
1577 }
1578
1579 inline void
1580 set_Free_mem (ir_node *node, ir_node *mem) {
1581   assert (node->op == op_Free);
1582   set_irn_n(node, 0, mem);
1583 }
1584
1585 inline ir_node *
1586 get_Free_ptr (ir_node *node) {
1587   assert (node->op == op_Free);
1588   return get_irn_n(node, 1);
1589 }
1590
1591 inline void
1592 set_Free_ptr (ir_node *node, ir_node *ptr) {
1593   assert (node->op == op_Free);
1594   set_irn_n(node, 1, ptr);
1595 }
1596
1597 inline ir_node *
1598 get_Free_size (ir_node *node) {
1599   assert (node->op == op_Free);
1600   return get_irn_n(node, 2);
1601 }
1602
1603 inline void
1604 set_Free_size (ir_node *node, ir_node *size) {
1605   assert (node->op == op_Free);
1606   set_irn_n(node, 2, size);
1607 }
1608
1609 inline type  *
1610 get_Free_type (ir_node *node) {
1611   assert (node->op == op_Free);
1612   return node->attr.f;
1613 }
1614
1615 inline void
1616 set_Free_type (ir_node *node, type *type) {
1617   assert (node->op == op_Free);
1618   node->attr.f = type;
1619 }
1620
1621 inline ir_node **
1622 get_Sync_preds_arr (ir_node *node) {
1623   assert (node->op == op_Sync);
1624   return (ir_node **)&(get_irn_in(node)[1]);
1625 }
1626
1627 inline int
1628 get_Sync_n_preds (ir_node *node) {
1629   assert (node->op == op_Sync);
1630   return (get_irn_arity(node));
1631 }
1632
1633 /*
1634 inline void
1635 set_Sync_n_preds (ir_node *node, int n_preds) {
1636   assert (node->op == op_Sync);
1637 }
1638 */
1639
1640 inline ir_node *
1641 get_Sync_pred (ir_node *node, int pos) {
1642   assert (node->op == op_Sync);
1643   return get_irn_n(node, pos);
1644 }
1645
1646 inline void
1647 set_Sync_pred (ir_node *node, int pos, ir_node *pred) {
1648   assert (node->op == op_Sync);
1649   set_irn_n(node, pos, pred);
1650 }
1651
1652 inline ir_node *
1653 get_Proj_pred (ir_node *node) {
1654   assert (node->op == op_Proj);
1655   return get_irn_n(node, 0);
1656 }
1657
1658 inline void
1659 set_Proj_pred (ir_node *node, ir_node *pred) {
1660   assert (node->op == op_Proj);
1661   set_irn_n(node, 0, pred);
1662 }
1663
1664 inline long
1665 get_Proj_proj (ir_node *node) {
1666   assert (node->op == op_Proj);
1667   return node->attr.proj;
1668 }
1669
1670 inline void
1671 set_Proj_proj (ir_node *node, long proj) {
1672   assert (node->op == op_Proj);
1673   node->attr.proj = proj;
1674 }
1675
1676 inline ir_node **
1677 get_Tuple_preds_arr (ir_node *node) {
1678   assert (node->op == op_Tuple);
1679   return (ir_node **)&(get_irn_in(node)[1]);
1680 }
1681
1682 inline int
1683 get_Tuple_n_preds (ir_node *node) {
1684   assert (node->op == op_Tuple);
1685   return (get_irn_arity(node));
1686 }
1687
1688 /*
1689 inline void
1690 set_Tuple_n_preds (ir_node *node, int n_preds) {
1691   assert (node->op == op_Tuple);
1692 }
1693 */
1694
1695 inline ir_node *
1696 get_Tuple_pred (ir_node *node, int pos) {
1697   assert (node->op == op_Tuple);
1698   return get_irn_n(node, pos);
1699 }
1700
1701 inline void
1702 set_Tuple_pred (ir_node *node, int pos, ir_node *pred) {
1703   assert (node->op == op_Tuple);
1704   set_irn_n(node, pos, pred);
1705 }
1706
1707 inline ir_node *
1708 get_Id_pred (ir_node *node) {
1709   assert (node->op == op_Id);
1710   return get_irn_n(node, 0);
1711 }
1712
1713 inline void
1714 set_Id_pred (ir_node *node, ir_node *pred) {
1715   assert (node->op == op_Id);
1716   set_irn_n(node, 0, pred);
1717 }
1718
1719 /******************************************************************/
1720 /*  Auxiliary routines                                            */
1721 /******************************************************************/
1722
1723 inline ir_node *
1724 skip_Proj (ir_node *node) {
1725   /* don't assert node !!! */
1726   if (node && (node->op == op_Proj)) {
1727     return get_Proj_pred(node);
1728   } else {
1729     return node;
1730   }
1731 }
1732
1733 inline ir_node *
1734 skip_nop (ir_node *node) {
1735   /* don't assert node !!! */
1736
1737   if (node && (node->op == op_Id) && (node != get_Id_pred(node))) {
1738     /* Don't use get_Id_pred:  We get into an endless loop for
1739        self-referencing Ids. */
1740     assert (get_irn_arity (node) > 0);
1741     return node->in[0+1];
1742   } else {
1743     return node;
1744   }
1745 }
1746
1747 inline int
1748 is_Bad (ir_node *node) {
1749   assert(node);
1750   if ((node) && get_irn_opcode(node) == iro_Bad)
1751     return 1;
1752   return 0;
1753 }
1754
1755 inline int
1756 is_no_Block (ir_node *node) {
1757   assert(node);
1758   return (get_irn_opcode(node) != iro_Block);
1759 }
1760
1761 /* Returns true if the operation manipulates control flow. */
1762 int
1763 is_cfop(ir_node *node) {
1764   return (   (get_irn_opcode(node) == iro_Start)
1765           || (get_irn_opcode(node) == iro_Jmp)
1766           || (get_irn_opcode(node) == iro_Cond)
1767           || (get_irn_opcode(node) == iro_Return)
1768           || (get_irn_opcode(node) == iro_Raise)
1769           || (get_irn_opcode(node) == iro_Bad));
1770 }
1771
1772 /* Returns true if the operation can change the control flow because
1773    of an exception. */
1774 int
1775 is_fragile_op(ir_node *node) {
1776   return (   (get_irn_opcode(node) == iro_Call)
1777           || (get_irn_opcode(node) == iro_Quot)
1778           || (get_irn_opcode(node) == iro_DivMod)
1779           || (get_irn_opcode(node) == iro_Div)
1780           || (get_irn_opcode(node) == iro_Mod)
1781           || (get_irn_opcode(node) == iro_Load)
1782           || (get_irn_opcode(node) == iro_Store)
1783           || (get_irn_opcode(node) == iro_Alloc)
1784           || (get_irn_opcode(node) == iro_Bad));
1785 }