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