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