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