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