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