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