*** empty log message ***
[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 #include "irnode.h"
9 //#include "irnode2.h"
10 #include "array.h"
11
12 static char *pnc_name_arr [] = {"False", "Eq", "Lt", "Le",
13                                 "Gt", "Ge", "Lg", "Leg", "Uo",
14                                 "Ue", "Ul", "Ule", "Ug", "Uge",
15                                 "Ne", "True" };
16
17 inline char *get_pnc_string(int pnc) {
18   return pnc_name_arr[pnc];
19 }
20
21
22 int
23 get_negated_pnc(int pnc) {
24   switch (pnc) {
25   case False: return True;  break;
26   case Eq:    return Ne;    break;
27   case Lt:    return Uge;   break;
28   case Le:    return Ug;    break;
29   case Gt:    return Ule;   break;
30   case Ge:    return Ul;    break;
31   case Lg:    return Ue;    break;
32   case Leg:   return Uo;    break;
33   case Uo:    return Leg;   break;
34   case Ue:    return Lg;    break;
35   case Ul:    return Ge;    break;
36   case Ule:   return Gt;    break;
37   case Ug:    return Le;    break;
38   case Uge:   return Lt;    break;
39   case Ne:    return Eq;    break;
40   case True:  return False; break;
41   }
42   return 99; /* to shut up gcc */
43 }
44
45 static char *pns_name_arr [] = {"initial_exec", "global_store",
46                                 "frame_base", "globals", "args"};
47
48 static char *symconst_name_arr [] = {"type_tag", "size", "linkage_ptr_info"};
49
50
51
52 void
53 init_irnode (void)
54 {
55 }
56
57 /* irnode constructor                                             */
58 /* create a new irnode in irg, with an op, mode, arity and        */
59 /* some incoming irnodes                                          */
60 /* this constructor is used in every specified irnode constructor */
61 inline ir_node *
62 new_ir_node (ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode,
63              int arity, ir_node **in)
64 {
65   ir_node *res;
66   int node_size = offsetof (ir_node, attr) +  op->attr_size;
67
68   res = (ir_node *) obstack_alloc (irg->obst, node_size);
69
70   res->kind = k_ir_node;
71   res->op = op;
72   res->mode = mode;
73   res->visit = 0;
74   res->link = NULL;
75   if (arity < 0) {
76     res->in = NEW_ARR_F (ir_node *, 1);
77   } else {
78     res->in = NEW_ARR_D (ir_node *, irg->obst, (arity+1));
79     memcpy (&res->in[1], in, sizeof (ir_node *) * arity);
80   }
81   res->in[0] = block;
82   return res;
83 }
84
85
86 /* IR-Nodes with attributes */
87 int
88 ir_node_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN)
89 {
90   int printed = 0;
91   ir_node *np = XP_GETARG (ir_node *, 0);
92
93   if (!np) {
94     XPS ("<null ir_node>");
95     return printed;
96   }
97
98   XPF1 ("%I", get_irn_op(np)->name);
99
100   switch (get_irn_opcode (np)) {        /* node label */
101   case iro_Const:
102     XPF1 ("%I", get_irn_mode(np)->name);
103     XPS (" : ");
104     XPF1 ("%v", get_irn_const_attr);
105     break;
106   case iro_Proj:
107     if (get_irn_modecode (np) == irm_b) {
108       XPC (" ");
109       XP (pnc_name_arr[get_irn_proj_attr(np)]);
110     } else if (get_irn_opcode (get_irn_in (np)[1]) == iro_Start) {
111       XPC (" ");
112       XP (pns_name_arr[get_irn_proj_attr(np)]);
113     } else {
114       XPF1 ("%I", get_irn_mode(np)->name);
115       XPC (" ");
116       XPF1 ("%d", get_irn_proj_attr(np));
117     }
118     break;
119   case iro_SymConst:
120     XPF1 ("%I", get_irn_mode(np)->name);
121     XPC  (" ");
122     XP   (symconst_name_arr[get_irn_symconst_attr(np).num]);
123     XPF1 (" %#N", get_class_ident((type_class *)get_SymConst_type(np)));
124     break;
125   case iro_Start:               /* don't dump mode of these */
126   case iro_Cond:
127   case iro_Block:
128   case iro_Call:
129   case iro_Jmp:
130   case iro_Return:
131   case iro_End:
132     break;
133   default:
134     XPF1 ("%I", get_irn_mode(np)->name);
135   }
136
137   return printed;
138 }
139
140
141 /** getting some parameters from ir_nodes **/
142
143 /* returns the number of predecessors without the block predecessor. */
144 inline int
145 get_irn_arity (ir_node *node)
146 {
147   assert(node);
148   return (ARR_LEN((node)->in)-1);
149 }
150
151 /* returns the array with ins */
152 inline ir_node **
153 get_irn_in (ir_node *node)
154 {
155   assert (node);
156   return ((node)->in);
157 }
158
159 /* to iterate through the predecessors without touching the array */
160 /* To iterate over the operands iterate from 0 to i < get_irn_arity(),
161    to iterate includind the Block predecessor iterate from i = -1 to
162    i < get_irn_arity. */
163 inline ir_node *
164 get_irn_n (ir_node *node, int n)
165 {
166   assert (node);
167   // assert (get_irn_arity (node) > n);
168   return skip_nop(node->in[n+1]);
169 }
170
171 inline void
172 set_irn_n (ir_node *node, int n, ir_node *in)
173 {
174   assert (node);
175   assert (get_irn_arity (node) > n);
176   node->in[n+1] = in;
177 }
178
179 inline ir_mode *
180 get_irn_mode (ir_node *node)
181 {
182   assert (node);
183   return node->mode;
184 }
185
186 inline modecode
187 get_irn_modecode (ir_node *node)
188 {
189   assert (node);
190   return node->mode->code;
191 }
192
193 inline ir_op *
194 get_irn_op (ir_node *node)
195 {
196   assert (node);
197   return node->op;
198 }
199
200 /* should be private to the library: */
201 inline void
202 set_irn_op (ir_node *node, ir_op *op)
203 {
204   assert (node);
205   node->op = op;
206 }
207
208 inline opcode
209 get_irn_opcode (ir_node *node)
210 {
211   assert (node);
212   return node->op->code;
213 }
214
215 inline void
216 set_irn_link (ir_node *node, ir_node *link) {
217   assert (node);
218   node->link = link;
219 }
220
221 inline ir_node *
222 get_irn_link (ir_node *node) {
223   assert (node);
224   return node->link;
225 }
226
227 inline tarval *
228 get_irn_const_attr (ir_node *node)
229 {
230   assert (node->op == op_Const);
231   return node->attr.con;
232 }
233
234 inline long
235 get_irn_proj_attr (ir_node *node)
236 {
237   assert (node->op == op_Proj);
238   return node->attr.proj;
239 }
240
241 inline alloc_attr
242 get_irn_alloc_attr (ir_node *node)
243 {
244   assert (node->op == op_Alloc);
245   return node->attr.a;
246 }
247
248 inline type *
249 get_irn_free_attr     (ir_node *node)
250 {
251   assert (node->op == op_Free);
252   return node->attr.f;
253 }
254
255 inline symconst_attr
256 get_irn_symconst_attr (ir_node *node)
257 {
258   assert (node->op == op_SymConst);
259   return node->attr.i;
260 }
261
262 inline type_method *
263 get_irn_call_attr (ir_node *node)
264 {
265   assert (node->op == op_Call);
266   return node->attr.call;
267 }
268
269 inline sel_attr
270 get_irn_sel_attr (ir_node *node)
271 {
272   assert (node->op == op_Sel);
273   return node->attr.s;
274 }
275
276 inline int
277 get_irn_phi_attr (ir_node *node)
278 {
279   assert (node->op == op_Phi);
280   return node->attr.phi0_pos;
281 }
282
283 inline block_attr
284 get_irn_block_attr (ir_node *node)
285 {
286   assert (node->op == op_Block);
287   return node->attr.block;
288 }
289
290 /** manipulate fields of individual nodes **/
291
292 /* this works for all except Block */
293 ir_node *
294 get_nodes_Block (ir_node *node) {
295   assert (!(node->op == op_Block));
296   return get_irn_n(node, -1);
297 }
298
299 inline void
300 set_nodes_Block (ir_node *node, ir_node *block) {
301   assert (!(node->op == op_Block));
302   set_irn_n(node, -1, block);
303 }
304
305 inline int
306 get_Block_n_cfgpreds (ir_node *node) {
307   assert ((node->op == op_Block));
308   return (get_irn_arity(node));
309 }
310
311 /*
312 inline void
313 set_Block_n_cfgpreds (ir_node *node, int n_preds) {
314   assert ((node->op == op_Block));
315 }
316 */
317
318 inline ir_node *
319 get_Block_cfgpred (ir_node *node, int pos) {
320   assert (node->op == op_Block);
321   return get_irn_n(node, pos);
322 }
323
324 inline void
325 set_Block_cfgpred (ir_node *node, int pos, ir_node *pred) {
326   assert (node->op == op_Block);
327   set_irn_n(node, pos, pred);
328 }
329
330 inline bool
331 get_Block_matured (ir_node *node) {
332   assert (node->op == op_Block);
333   return node->attr.block.matured;
334 }
335
336 inline void
337 set_Block_matured (ir_node *node, bool matured) {
338   assert (node->op == op_Block);
339   node->attr.block.matured = matured;
340 }
341 inline unsigned long
342 get_Block_block_visit (ir_node *node) {
343   assert (node->op == op_Block);
344   return node->attr.block.block_visit;
345 }
346
347 inline void
348 set_Block_block_visit (ir_node *node, unsigned long visit) {
349   assert (node->op == op_Block);
350   node->attr.block.block_visit = visit;
351 }
352
353 inline ir_node *
354 get_Block_graph_arr (ir_node *node, int pos) {
355   assert (node->op == op_Block);
356   return node->attr.block.graph_arr[pos+1];
357 }
358
359 inline void
360 set_Block_graph_arr (ir_node *node, int pos, ir_node *value) {
361   assert (node->op == op_Block);
362   node->attr.block.graph_arr[pos+1] = value;
363 }
364
365 inline ir_node *
366 get_Cond_selector (ir_node *node) {
367   assert (node->op == op_Cond);
368   return get_irn_n(node, 0);
369 }
370
371 inline void
372 set_Cond_selector (ir_node *node, ir_node *selector) {
373   assert (node->op == op_Cond);
374   set_irn_n(node, 0, selector);
375 }
376
377 inline ir_node *
378 get_Return_mem (ir_node *node) {
379   assert (node->op == op_Cond);
380   return get_irn_n(node, 0);
381 }
382
383 inline void
384 set_Return_mem (ir_node *node, ir_node *mem) {
385   assert (node->op == op_Return);
386   set_irn_n(node, 0, mem);
387 }
388
389 inline int
390 get_Return_n_res (ir_node *node) {
391   assert (node->op == op_Return);
392   return (get_irn_arity(node) - 1);
393 }
394
395 /*
396 inline void
397 set_Return_n_res (ir_node *node, int results) {
398   assert (node->op == op_Return);
399 }
400 */
401
402 inline ir_node *
403 get_Return_res (ir_node *node, int pos) {
404   assert (node->op == op_Return);
405   return get_irn_n(node, pos+1);
406 }
407
408 inline void
409 set_Return_res (ir_node *node, int pos, ir_node *res){
410   assert (node->op == op_Raise);
411   set_irn_n(node, pos+1, res);
412 }
413
414 inline ir_node *
415 get_Raise_mem (ir_node *node) {
416   assert (node->op == op_Return);
417   return get_irn_n(node, 0);
418 }
419
420 inline void
421 set_Raise_mem (ir_node *node, ir_node *mem) {
422   assert (node->op == op_Raise);
423   set_irn_n(node, 0, mem);
424 }
425
426 inline ir_node *
427 get_Raise_exo_ptr (ir_node *node) {
428   assert (node->op == op_Raise);
429   return get_irn_n(node, 1);
430 }
431
432 inline void
433 set_Raise_exo_ptr (ir_node *node, ir_node *exo_ptr) {
434   assert (node->op == op_Raise);
435   set_irn_n(node, 1, exo_ptr);
436 }
437
438 inline tarval *get_Const_tarval (ir_node *node) {
439   assert (node->op == op_Const);
440   return get_irn_const_attr(node);
441 }
442
443 inline void
444 set_Const_tarval (ir_node *node, tarval *con) {
445   assert (node->op == op_Const);
446   node->attr.con = con;
447 }
448
449 inline symconst_kind
450 get_SymConst_kind (ir_node *node) {
451   assert (node->op == op_SymConst);
452   return node->attr.i.num;
453 }
454
455 inline void
456 set_SymConst_kind (ir_node *node, symconst_kind num) {
457   assert (node->op == op_SymConst);
458   node->attr.i.num = num;
459 }
460
461 inline type *
462 get_SymConst_type (ir_node *node) {
463   assert (   (node->op == op_SymConst)
464           && (   get_SymConst_kind(node) == type_tag
465               || get_SymConst_kind(node) == size));
466   return node->attr.i.tori.typ;
467 }
468
469 inline void
470 set_SymConst_type (ir_node *node, type *type) {
471   assert (   (node->op == op_SymConst)
472           && (   get_SymConst_kind(node) == type_tag
473               || get_SymConst_kind(node) == size));
474   node->attr.i.tori.typ = type;
475 }
476
477 inline ident *
478 get_SymConst_ptrinfo (ir_node *node) {
479   assert (   (node->op == op_SymConst)
480           && (get_SymConst_kind(node) == linkage_ptr_info));
481   return node->attr.i.tori.ptrinfo;
482
483
484 }
485
486 inline void
487 set_SymConst_ptrinfo (ir_node *node, ident *ptrinfo) {
488   assert (   (node->op == op_SymConst)
489           && (get_SymConst_kind(node) == linkage_ptr_info));
490   node->attr.i.tori.ptrinfo = ptrinfo;
491 }
492
493 inline ir_node *
494 get_Sel_mem (ir_node *node) {
495   assert (node->op == op_Sel);
496   return get_irn_n(node, 0);
497 }
498
499 inline void
500 set_Sel_mem (ir_node *node, ir_node *mem) {
501   assert (node->op == op_Sel);
502   set_irn_n(node, 0, mem);
503 }
504
505 inline ir_node *
506 get_Sel_ptr (ir_node *node) {
507   assert (node->op == op_Sel);
508   return get_irn_n(node, 1);
509 }
510
511 inline void
512 set_Sel_ptr (ir_node *node, ir_node *ptr) {
513   assert (node->op == op_Sel);
514   set_irn_n(node, 1, ptr);
515 }
516
517 inline int
518 get_Sel_n_index (ir_node *node) {
519   assert (node->op == op_Sel);
520   return (get_irn_arity(node) - 2);
521 }
522
523 /*
524 inline void
525 set_Sel_n_index (ir_node *node, int n_index) {
526   assert (node->op == op_Sel);
527 }
528 */
529
530 inline ir_node *
531 get_Sel_index (ir_node *node, int pos) {
532   assert (node->op == op_Sel);
533   return get_irn_n(node, pos+2);
534 }
535
536 inline void
537 set_Sel_index (ir_node *node, int pos, ir_node *index) {
538   assert (node->op == op_Sel);
539   set_irn_n(node, pos+2, index);
540 }
541
542 inline entity *
543 get_Sel_entity (ir_node *node) {
544   assert (node->op == op_Sel);
545   return node->attr.s.ent;
546 }
547
548 inline void
549 set_Sel_entity (ir_node *node, entity *ent) {
550   assert (node->op == op_Sel);
551   node->attr.s.ent = ent;
552 }
553
554 inline linkage_type
555 get_Sel_linkage_type (ir_node *node) {
556   assert (node->op == op_Sel);
557   return node->attr.s.ltyp;
558 }
559
560 inline void
561 set_Sel_linkage_type (ir_node *node, linkage_type lt) {
562   assert (node->op == op_Sel);
563   node->attr.s.ltyp = lt;
564 }
565
566 inline ir_node *
567 get_Call_mem (ir_node *node) {
568   assert (node->op == op_Call);
569   return get_irn_n(node, 0);
570 }
571
572 inline void
573 set_Call_mem (ir_node *node, ir_node *mem) {
574   assert (node->op == op_Call);
575   set_irn_n(node, 0, mem);
576 }
577
578 inline ir_node *
579 get_Call_ptr (ir_node *node) {
580   assert (node->op == op_Call);
581   return get_irn_n(node, 1);
582 }
583
584 inline void
585 set_Call_ptr (ir_node *node, ir_node *ptr) {
586   assert (node->op == op_Call);
587   set_irn_n(node, 1, ptr);
588 }
589
590 inline int
591 get_Call_arity (ir_node *node) {
592   assert (node->op == op_Call);
593   return (get_irn_arity(node) - 2);
594 }
595
596 /* inline void
597 set_Call_arity (ir_node *node, ir_node *arity) {
598   assert (node->op == op_Call);
599 }
600 */
601
602 inline ir_node *
603 get_Call_param (ir_node *node, int pos) {
604   assert (node->op == op_Call);
605   return get_irn_n(node, pos+1);
606 }
607
608 inline void
609 set_Call_param (ir_node *node, int pos, ir_node *param) {
610   assert (node->op == op_Call);
611   set_irn_n(node, pos+1, param);
612 }
613
614 inline type_method *
615 get_Call_type (ir_node *node) {
616   assert (node->op == op_Call);
617   return node->attr.call;
618 }
619
620 inline void
621 set_Call_type (ir_node *node, type_method *type) {
622   assert (node->op == op_Call);
623   node->attr.call = type;
624 }
625
626 /* For unary and binary arithmetic operations the access to the
627    operands can be factored out.  Left is the first, right the
628    second arithmetic value  as listed in tech report 0999-33.
629    unops are: Minus, Abs, Not, Conv
630    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
631    Shr, Shrs, Rotate, Cmp */
632
633 int
634 is_unop (ir_node *node) {
635   return ( node->op == op_Minus ||
636            node->op == op_Abs  ||
637            node->op == op_Not  ||
638            node->op == op_Conv );
639 }
640
641 inline ir_node *
642 get_unop_op (ir_node *node) {
643   assert ( node->op == op_Minus ||
644            node->op == op_Abs  ||
645             node->op == op_Not  ||
646            node->op == op_Conv );
647   switch (get_irn_opcode (node)) {
648     case iro_Minus: return get_Minus_op(node); break;
649     case iro_Abs:   return get_Abs_op(node);   break;
650     case iro_Not:   return get_Not_op(node);   break;
651     case iro_Conv:  return get_Conv_op(node);  break;
652     default: return NULL;
653   }
654 }
655
656 inline void
657 set_unop_op (ir_node *node, ir_node *op) {
658     assert (node->op == op_Minus ||
659             node->op == op_Abs   ||
660             node->op == op_Not   ||
661             node->op == op_Conv    );
662     switch (get_irn_opcode (node)) {
663     case iro_Minus:   set_Minus_op(node, op); break;
664     case iro_Abs:     set_Abs_op(node, op);   break;
665     case iro_Not:     set_Not_op(node, op);   break;
666     case iro_Conv:    set_Conv_op(node, op);  break;
667     default:  ;
668     }
669
670 }
671
672 int
673 is_binop (ir_node *node) {
674   return (node->op == op_Add    ||
675           node->op == op_Sub    ||
676           node->op == op_Mul    ||
677           node->op == op_Quot   ||
678           node->op == op_DivMod ||
679           node->op == op_Div    ||
680           node->op == op_Mod    ||
681           node->op == op_And    ||
682           node->op == op_Or     ||
683           node->op == op_Eor    ||
684           node->op == op_Shl    ||
685           node->op == op_Shr    ||
686           node->op == op_Shrs   ||
687           node->op == op_Rot    ||
688           node->op == op_Cmp      );
689 }
690
691 inline ir_node *
692 get_binop_left (ir_node *node) {
693   assert (node->op == op_Add    ||
694           node->op == op_Sub    ||
695           node->op == op_Mul    ||
696           node->op == op_Quot   ||
697           node->op == op_DivMod ||
698           node->op == op_Div    ||
699           node->op == op_Mod    ||
700           node->op == op_And    ||
701           node->op == op_Or     ||
702           node->op == op_Eor    ||
703           node->op == op_Shl    ||
704           node->op == op_Shr    ||
705           node->op == op_Shrs   ||
706           node->op == op_Rot    ||
707           node->op == op_Cmp      );
708
709     switch (get_irn_opcode (node)) {
710       case iro_Add   :     return get_Add_left(node);  break;
711       case iro_Sub   :     return get_Sub_left(node);  break;
712       case iro_Mul   :     return get_Mul_left(node);  break;
713       case iro_Quot  :     return get_Quot_left(node); break;
714       case iro_DivMod:     return get_DivMod_left(node);  break;
715       case iro_Div   :     return get_Div_left(node);  break;
716       case iro_Mod   :     return get_Mod_left(node);  break;
717       case iro_And   :     return get_And_left(node);  break;
718       case iro_Or    :     return get_Or_left(node);   break;
719       case iro_Eor   :     return get_Eor_left(node);  break;
720       case iro_Shl   :     return get_Shl_left(node);  break;
721       case iro_Shr   :     return get_Shr_left(node);  break;
722       case iro_Shrs  :     return get_Shrs_left(node); break;
723       case iro_Rot   :     return get_Rot_left(node);  break;
724       case iro_Cmp   :     return get_Cmp_left(node);  break;
725     default:  return NULL;
726   };
727 }
728
729 inline void
730 set_binop_left (ir_node *node, ir_node *left) {
731   assert (node->op == op_Add    ||
732           node->op == op_Sub    ||
733           node->op == op_Mul    ||
734           node->op == op_Quot   ||
735           node->op == op_DivMod ||
736           node->op == op_Div    ||
737           node->op == op_Mod    ||
738           node->op == op_And    ||
739           node->op == op_Or     ||
740           node->op == op_Eor    ||
741           node->op == op_Shl    ||
742           node->op == op_Shr    ||
743           node->op == op_Shrs   ||
744           node->op == op_Rot    ||
745           node->op == op_Cmp      );
746
747     switch (get_irn_opcode (node)) {
748       case iro_Add   :     set_Add_left(node, left);  break;
749       case iro_Sub   :     set_Sub_left(node, left);  break;
750       case iro_Mul   :     set_Mul_left(node, left);  break;
751       case iro_Quot  :     set_Quot_left(node, left); break;
752       case iro_DivMod:     set_DivMod_left(node, left);  break;
753       case iro_Div   :     set_Div_left(node, left);  break;
754       case iro_Mod   :     set_Mod_left(node, left);  break;
755       case iro_And   :     set_And_left(node, left);  break;
756       case iro_Or    :     set_Or_left(node, left);   break;
757       case iro_Eor   :     set_Eor_left(node, left);  break;
758       case iro_Shl   :     set_Shl_left(node, left);  break;
759       case iro_Shr   :     set_Shr_left(node, left);  break;
760       case iro_Shrs  :     set_Shrs_left(node, left); break;
761       case iro_Rot   :     set_Rot_left(node, left);  break;
762       case iro_Cmp   :     set_Cmp_left(node, left);  break;
763     default:  ;
764   };
765 }
766
767 inline ir_node *
768 get_binop_right (ir_node *node) {
769   assert (node->op == op_Add    ||
770           node->op == op_Sub    ||
771           node->op == op_Mul    ||
772           node->op == op_Quot   ||
773           node->op == op_DivMod ||
774           node->op == op_Div    ||
775           node->op == op_Mod    ||
776           node->op == op_And    ||
777           node->op == op_Or     ||
778           node->op == op_Eor    ||
779           node->op == op_Shl    ||
780           node->op == op_Shr    ||
781           node->op == op_Shrs   ||
782           node->op == op_Rot    ||
783           node->op == op_Cmp      );
784
785     switch (get_irn_opcode (node)) {
786       case iro_Add   :     return get_Add_right(node);  break;
787       case iro_Sub   :     return get_Sub_right(node);  break;
788       case iro_Mul   :     return get_Mul_right(node);  break;
789       case iro_Quot  :     return get_Quot_right(node); break;
790       case iro_DivMod:     return get_DivMod_right(node);  break;
791       case iro_Div   :     return get_Div_right(node);  break;
792       case iro_Mod   :     return get_Mod_right(node);  break;
793       case iro_And   :     return get_And_right(node);  break;
794       case iro_Or    :     return get_Or_right(node);   break;
795       case iro_Eor   :     return get_Eor_right(node);  break;
796       case iro_Shl   :     return get_Shl_right(node);  break;
797       case iro_Shr   :     return get_Shr_right(node);  break;
798       case iro_Shrs  :     return get_Shrs_right(node); break;
799       case iro_Rot   :     return get_Rot_right(node);  break;
800       case iro_Cmp   :     return get_Cmp_right(node);  break;
801     default:  return NULL;
802   };
803 }
804
805 inline void
806 set_binop_right (ir_node *node, ir_node *right) {
807   assert (node->op == op_Add    ||
808           node->op == op_Sub    ||
809           node->op == op_Mul    ||
810           node->op == op_Quot   ||
811           node->op == op_DivMod ||
812           node->op == op_Div    ||
813           node->op == op_Mod    ||
814           node->op == op_And    ||
815           node->op == op_Or     ||
816           node->op == op_Eor    ||
817           node->op == op_Shl    ||
818           node->op == op_Shr    ||
819           node->op == op_Shrs   ||
820           node->op == op_Rot    ||
821           node->op == op_Cmp      );
822
823     switch (get_irn_opcode (node)) {
824       case iro_Add   :     set_Add_right(node, right);  break;
825       case iro_Sub   :     set_Sub_right(node, right);  break;
826       case iro_Mul   :     set_Mul_right(node, right);  break;
827       case iro_Quot  :     set_Quot_right(node, right); break;
828       case iro_DivMod:     set_DivMod_right(node, right);  break;
829       case iro_Div   :     set_Div_right(node, right);  break;
830       case iro_Mod   :     set_Mod_right(node, right);  break;
831       case iro_And   :     set_And_right(node, right);  break;
832       case iro_Or    :     set_Or_right(node, right);   break;
833       case iro_Eor   :     set_Eor_right(node, right);  break;
834       case iro_Shl   :     set_Shl_right(node, right);  break;
835       case iro_Shr   :     set_Shr_right(node, right);  break;
836       case iro_Shrs  :     set_Shrs_right(node, right); break;
837       case iro_Rot   :     set_Rot_right(node, right);  break;
838       case iro_Cmp   :     set_Cmp_right(node, right);  break;
839     default: ;
840   };
841 }
842
843 inline ir_node *
844 get_Add_left (ir_node *node) {
845   assert (node->op == op_Add);
846   return get_irn_n(node, 0);
847 }
848
849 inline void
850 set_Add_left (ir_node *node, ir_node *left) {
851   assert (node->op == op_Add);
852   set_irn_n(node, 0, left);
853 }
854
855 inline ir_node *
856 get_Add_right (ir_node *node) {
857   assert (node->op == op_Add);
858   return get_irn_n(node, 1);
859 }
860
861 inline void
862 set_Add_right (ir_node *node, ir_node *right) {
863   assert (node->op == op_Add);
864   set_irn_n(node, 1, right);
865 }
866
867 inline ir_node *
868 get_Sub_left (ir_node *node) {
869   assert (node->op == op_Sub);
870   return get_irn_n(node, 0);
871 }
872
873 inline void
874 set_Sub_left (ir_node *node, ir_node *left) {
875   assert (node->op == op_Sub);
876   set_irn_n(node, 0, left);
877 }
878
879 inline ir_node *
880 get_Sub_right (ir_node *node) {
881   assert (node->op == op_Sub);
882   return get_irn_n(node, 1);
883 }
884
885 inline void
886 set_Sub_right (ir_node *node, ir_node *right) {
887   assert (node->op == op_Sub);
888   set_irn_n(node, 1, right);
889 }
890
891
892 inline ir_node *
893 get_Minus_op (ir_node *node) {
894   assert (node->op == op_Minus);
895   return get_irn_n(node, 0);
896 }
897
898 inline void
899 set_Minus_op (ir_node *node, ir_node *op) {
900   assert (node->op == op_Minus);
901   set_irn_n(node, 0, op);
902 }
903
904
905 inline ir_node *
906 get_Mul_left (ir_node *node) {
907   assert (node->op == op_Mul);
908   return get_irn_n(node, 0);
909 }
910
911 inline void
912 set_Mul_left (ir_node *node, ir_node *left) {
913   assert (node->op == op_Mul);
914   set_irn_n(node, 0, left);
915 }
916
917 inline ir_node *
918 get_Mul_right (ir_node *node) {
919   assert (node->op == op_Mul);
920   return get_irn_n(node, 1);
921 }
922
923 inline void
924 set_Mul_right (ir_node *node, ir_node *right) {
925   assert (node->op == op_Mul);
926   set_irn_n(node, 1, right);
927 }
928
929 inline ir_node *
930 get_Quot_left (ir_node *node) {
931   assert (node->op == op_Quot);
932   return get_irn_n(node, 1);
933 }
934
935 inline void
936 set_Quot_left (ir_node *node, ir_node *left) {
937   assert (node->op == op_Quot);
938   set_irn_n(node, 1, left);
939 }
940
941 inline ir_node *
942 get_Quot_right (ir_node *node) {
943   assert (node->op == op_Quot);
944   return get_irn_n(node, 2);
945 }
946
947 inline void
948 set_Quot_right (ir_node *node, ir_node *right) {
949   assert (node->op == op_Quot);
950   set_irn_n(node, 2, right);
951 }
952
953 inline ir_node *
954 get_Quot_mem (ir_node *node) {
955   assert (node->op == op_Quot);
956   return get_irn_n(node, 0);
957 }
958
959 inline void
960 set_Quot_mem (ir_node *node, ir_node *mem) {
961   assert (node->op == op_Quot);
962   set_irn_n(node, 0, mem);
963 }
964
965 inline ir_node *
966 get_DivMod_left (ir_node *node) {
967   assert (node->op == op_DivMod);
968   return get_irn_n(node, 1);
969 }
970
971 inline void
972 set_DivMod_left (ir_node *node, ir_node *left) {
973   assert (node->op == op_DivMod);
974   set_irn_n(node, 1, left);
975 }
976
977 inline ir_node *
978 get_DivMod_right (ir_node *node) {
979   assert (node->op == op_DivMod);
980   return get_irn_n(node, 2);
981 }
982
983 inline void
984 set_DivMod_right (ir_node *node, ir_node *right) {
985   assert (node->op == op_DivMod);
986   set_irn_n(node, 2, right);
987 }
988
989 inline ir_node *
990 get_DivMod_mem (ir_node *node) {
991   assert (node->op == op_DivMod);
992   return get_irn_n(node, 0);
993 }
994
995 inline void
996 set_DivMod_mem (ir_node *node, ir_node *mem) {
997   assert (node->op == op_DivMod);
998   set_irn_n(node, 0, mem);
999 }
1000
1001 inline ir_node *
1002 get_Div_left (ir_node *node) {
1003   assert (node->op == op_Div);
1004   return get_irn_n(node, 1);
1005 }
1006
1007 inline void
1008 set_Div_left (ir_node *node, ir_node *left) {
1009   assert (node->op == op_Div);
1010   set_irn_n(node, 1, left);
1011 }
1012
1013 inline ir_node *
1014 get_Div_right (ir_node *node) {
1015   assert (node->op == op_Div);
1016   return get_irn_n(node, 2);
1017 }
1018
1019 inline void
1020 set_Div_right (ir_node *node, ir_node *right) {
1021   assert (node->op == op_Div);
1022   set_irn_n(node, 2, right);
1023 }
1024
1025 inline ir_node *
1026 get_Div_mem (ir_node *node) {
1027   assert (node->op == op_Div);
1028   return get_irn_n(node, 0);
1029 }
1030
1031 inline void
1032 set_Div_mem (ir_node *node, ir_node *mem) {
1033   assert (node->op == op_Div);
1034   set_irn_n(node, 0, mem);
1035 }
1036
1037 inline ir_node *
1038 get_Mod_left (ir_node *node) {
1039   assert (node->op == op_Mod);
1040   return get_irn_n(node, 1);
1041 }
1042
1043 inline void
1044 set_Mod_left (ir_node *node, ir_node *left) {
1045   assert (node->op == op_Mod);
1046   set_irn_n(node, 1, left);
1047 }
1048
1049 inline ir_node *
1050 get_Mod_right (ir_node *node) {
1051   assert (node->op == op_Mod);
1052   return get_irn_n(node, 2);
1053 }
1054
1055 inline void
1056 set_Mod_right (ir_node *node, ir_node *right) {
1057   assert (node->op == op_Mod);
1058   set_irn_n(node, 2, right);
1059 }
1060
1061 inline ir_node *
1062 get_Mod_mem (ir_node *node) {
1063   assert (node->op == op_Mod);
1064   return get_irn_n(node, 0);
1065 }
1066
1067 inline void
1068 set_Mod_mem (ir_node *node, ir_node *mem) {
1069   assert (node->op == op_Mod);
1070   set_irn_n(node, 0, mem);
1071 }
1072
1073 inline ir_node *
1074 get_Abs_op (ir_node *node) {
1075   assert (node->op == op_Abs);
1076   return get_irn_n(node, 0);
1077 }
1078
1079 inline void
1080 set_Abs_op (ir_node *node, ir_node *op) {
1081   assert (node->op == op_Abs);
1082   set_irn_n(node, 0, op);
1083 }
1084
1085 inline ir_node *
1086 get_And_left (ir_node *node) {
1087   assert (node->op == op_And);
1088   return get_irn_n(node, 0);
1089 }
1090
1091 inline void
1092 set_And_left (ir_node *node, ir_node *left) {
1093   assert (node->op == op_And);
1094   set_irn_n(node, 0, left);
1095 }
1096
1097 inline ir_node *
1098 get_And_right (ir_node *node) {
1099   assert (node->op == op_And);
1100   return get_irn_n(node, 1);
1101 }
1102
1103 inline void
1104 set_And_right (ir_node *node, ir_node *right) {
1105   assert (node->op == op_And);
1106   set_irn_n(node, 1, right);
1107 }
1108
1109 inline ir_node *
1110 get_Or_left (ir_node *node) {
1111   assert (node->op == op_Or);
1112   return get_irn_n(node, 0);
1113 }
1114
1115 inline void
1116 set_Or_left (ir_node *node, ir_node *left) {
1117   assert (node->op == op_Or);
1118   set_irn_n(node, 0, left);
1119 }
1120
1121 inline ir_node *
1122 get_Or_right (ir_node *node) {
1123   assert (node->op == op_Or);
1124   return get_irn_n(node, 1);
1125 }
1126
1127 inline void
1128 set_Or_right (ir_node *node, ir_node *right) {
1129   assert (node->op == op_Or);
1130   set_irn_n(node, 1, right);
1131 }
1132
1133 inline ir_node *
1134 get_Eor_left (ir_node *node) {
1135   assert (node->op == op_Eor);
1136   return get_irn_n(node, 0);
1137 }
1138
1139 inline void
1140 set_Eor_left (ir_node *node, ir_node *left) {
1141   assert (node->op == op_Eor);
1142   set_irn_n(node, 0, left);
1143 }
1144
1145 inline ir_node *
1146 get_Eor_right (ir_node *node) {
1147   assert (node->op == op_Eor);
1148   return get_irn_n(node, 1);
1149 }
1150
1151 inline void
1152 set_Eor_right (ir_node *node, ir_node *right) {
1153   assert (node->op == op_Eor);
1154   set_irn_n(node, 1, right);
1155 }
1156
1157
1158 inline ir_node *
1159 get_Not_op (ir_node *node) {
1160   assert (node->op == op_Not);
1161   return get_irn_n(node, 0);
1162 }
1163
1164 inline void
1165 set_Not_op (ir_node *node, ir_node *op) {
1166   assert (node->op == op_Not);
1167   set_irn_n(node, 0, op);
1168 }
1169
1170
1171 inline ir_node *
1172 get_Shl_left (ir_node *node) {
1173   assert (node->op == op_Shl);
1174   return get_irn_n(node, 0);
1175 }
1176
1177 inline void
1178 set_Shl_left (ir_node *node, ir_node *left) {
1179   assert (node->op == op_Shl);
1180   set_irn_n(node, 0, left);
1181 }
1182
1183 inline ir_node *
1184 get_Shl_right (ir_node *node) {
1185   assert (node->op == op_Shl);
1186   return get_irn_n(node, 1);
1187 }
1188
1189 inline void
1190 set_Shl_right (ir_node *node, ir_node *right) {
1191   assert (node->op == op_Shl);
1192   set_irn_n(node, 1, right);
1193 }
1194
1195 inline ir_node *
1196 get_Shr_left (ir_node *node) {
1197   assert (node->op == op_Shr);
1198   return get_irn_n(node, 0);
1199 }
1200
1201 inline void
1202 set_Shr_left (ir_node *node, ir_node *left) {
1203   assert (node->op == op_Shr);
1204   set_irn_n(node, 0, left);
1205 }
1206
1207 inline ir_node *
1208 get_Shr_right (ir_node *node) {
1209   assert (node->op == op_Shr);
1210   return get_irn_n(node, 1);
1211 }
1212
1213 inline void
1214 set_Shr_right (ir_node *node, ir_node *right) {
1215   assert (node->op == op_Shr);
1216   set_irn_n(node, 1, right);
1217 }
1218
1219 inline ir_node *
1220 get_Shrs_left (ir_node *node) {
1221   assert (node->op == op_Shrs);
1222   return get_irn_n(node, 0);
1223 }
1224
1225 inline void
1226 set_Shrs_left (ir_node *node, ir_node *left) {
1227   assert (node->op == op_Shrs);
1228   set_irn_n(node, 0, left);
1229 }
1230
1231 inline ir_node *
1232 get_Shrs_right (ir_node *node) {
1233   assert (node->op == op_Shrs);
1234   return get_irn_n(node, 1);
1235 }
1236
1237 inline void
1238 set_Shrs_right (ir_node *node, ir_node *right) {
1239   assert (node->op == op_Shrs);
1240   set_irn_n(node, 1, right);
1241 }
1242
1243 inline ir_node *
1244 get_Rot_left (ir_node *node) {
1245   assert (node->op == op_Rot);
1246   return get_irn_n(node, 0);
1247 }
1248
1249 inline void
1250 set_Rot_left (ir_node *node, ir_node *left) {
1251   assert (node->op == op_Rot);
1252   set_irn_n(node, 0, left);
1253 }
1254
1255 inline ir_node *
1256 get_Rot_right (ir_node *node) {
1257   assert (node->op == op_Rot);
1258   return get_irn_n(node, 1);
1259 }
1260
1261 inline void
1262 set_Rot_right (ir_node *node, ir_node *right) {
1263   assert (node->op == op_Rot);
1264   set_irn_n(node, 1, right);
1265 }
1266
1267 inline ir_node *
1268 get_Cmp_left (ir_node *node) {
1269   assert (node->op == op_Cmp);
1270   return get_irn_n(node, 0);
1271 }
1272
1273 inline void
1274 set_Cmp_left (ir_node *node, ir_node *left) {
1275   assert (node->op == op_Cmp);
1276   set_irn_n(node, 0, left);
1277 }
1278
1279 inline ir_node *
1280 get_Cmp_right (ir_node *node) {
1281   assert (node->op == op_Cmp);
1282   return get_irn_n(node, 1);
1283 }
1284
1285 inline void
1286 set_Cmp_right (ir_node *node, ir_node *right) {
1287   assert (node->op == op_Cmp);
1288   set_irn_n(node, 1, right);
1289 }
1290
1291 inline ir_node *
1292 get_Conv_op (ir_node *node) {
1293   assert (node->op == op_Conv);
1294   return get_irn_n(node, 0);
1295 }
1296
1297 inline void
1298 set_Conv_op (ir_node *node, ir_node *op) {
1299   assert (node->op == op_Conv);
1300   set_irn_n(node, 0, op);
1301 }
1302
1303 inline int
1304 get_Phi_n_preds (ir_node *node) {
1305   assert (node->op == op_Phi);
1306   return (get_irn_arity(node));
1307 }
1308
1309 /*
1310 inline void set_Phi_n_preds (ir_node *node, int n_preds) {
1311   assert (node->op == op_Phi);
1312 }
1313 */
1314
1315 inline ir_node *
1316 get_Phi_pred (ir_node *node, int pos) {
1317   assert (node->op == op_Phi);
1318   return get_irn_n(node, pos);
1319 }
1320
1321 inline void
1322 set_Phi_pred (ir_node *node, int pos, ir_node *pred) {
1323   assert (node->op == op_Phi);
1324   set_irn_n(node, pos, pred);
1325 }
1326
1327 inline ir_node *
1328 get_Load_mem (ir_node *node) {
1329   assert (node->op == op_Load);
1330   return get_irn_n(node, 0);
1331 }
1332
1333 inline void
1334 set_Load_mem (ir_node *node, ir_node *mem) {
1335   assert (node->op == op_Load);
1336   set_irn_n(node, 0, mem);
1337 }
1338
1339 inline ir_node *
1340 get_Load_ptr (ir_node *node) {
1341   assert (node->op == op_Load);
1342   return get_irn_n(node, 1);
1343 }
1344
1345 inline void
1346 set_Load_ptr (ir_node *node, ir_node *ptr) {
1347   assert (node->op == op_Load);
1348   set_irn_n(node, 1, ptr);
1349 }
1350
1351 inline
1352 ir_node *
1353 get_Store_mem (ir_node *node) {
1354   assert (node->op == op_Store);
1355   return get_irn_n(node, 0);
1356 }
1357
1358 inline void
1359 set_Store_mem (ir_node *node, ir_node *mem) {
1360   assert (node->op == op_Store);
1361   set_irn_n(node, 0, mem);
1362 }
1363
1364 inline ir_node *
1365 get_Store_ptr (ir_node *node) {
1366   assert (node->op == op_Store);
1367   return get_irn_n(node, 1);
1368 }
1369
1370 inline void
1371 set_Store_ptr (ir_node *node, ir_node *ptr) {
1372   assert (node->op == op_Store);
1373   set_irn_n(node, 1, ptr);
1374 }
1375
1376 inline ir_node *
1377 get_Store_value (ir_node *node) {
1378   assert (node->op == op_Store);
1379   return get_irn_n(node, 2);
1380 }
1381
1382 inline void
1383 set_Store_value (ir_node *node, ir_node *value) {
1384   assert (node->op == op_Store);
1385   set_irn_n(node, 2, value);
1386 }
1387
1388 inline ir_node *
1389 get_Alloc_mem (ir_node *node) {
1390   assert (node->op == op_Alloc);
1391   return get_irn_n(node, 0);
1392 }
1393
1394 inline void
1395 set_Alloc_mem (ir_node *node, ir_node *mem) {
1396   assert (node->op == op_Alloc);
1397   set_irn_n(node, 0, mem);
1398 }
1399
1400 inline ir_node *
1401 get_Alloc_size (ir_node *node) {
1402   assert (node->op == op_Alloc);
1403   return get_irn_n(node, 1);
1404 }
1405
1406 inline void
1407 set_Allco_size (ir_node *node, ir_node *size) {
1408   assert (node->op == op_Alloc);
1409   set_irn_n(node, 1, size);
1410 }
1411
1412 inline type  *
1413 get_Alloc_type (ir_node *node) {
1414   assert (node->op == op_Alloc);
1415   return node->attr.a.type;
1416 }
1417
1418 inline void
1419 set_Alloc_type (ir_node *node, type *type) {
1420   assert (node->op == op_Alloc);
1421   node->attr.a.type = type;
1422 }
1423
1424 inline where_alloc
1425 get_Alloc_where (ir_node *node) {
1426   assert (node->op == op_Alloc);
1427   return node->attr.a.where;
1428 }
1429
1430 inline void
1431 set_Alloc_where (ir_node *node, where_alloc where) {
1432   assert (node->op == op_Alloc);
1433   node->attr.a.where = where;
1434 }
1435
1436
1437 inline ir_node *
1438 get_Free_mem (ir_node *node) {
1439   assert (node->op == op_Free);
1440   return get_irn_n(node, 0);
1441 }
1442
1443 inline void
1444 set_Free_mem (ir_node *node, ir_node *mem) {
1445   assert (node->op == op_Free);
1446   set_irn_n(node, 0, mem);
1447 }
1448
1449 inline ir_node *
1450 get_Free_ptr (ir_node *node) {
1451   assert (node->op == op_Free);
1452   return get_irn_n(node, 1);
1453 }
1454
1455 inline void
1456 set_Free_ptr (ir_node *node, ir_node *ptr) {
1457   assert (node->op == op_Free);
1458   set_irn_n(node, 1, ptr);
1459 }
1460
1461 inline ir_node *
1462 get_Free_size (ir_node *node) {
1463   assert (node->op == op_Free);
1464   return get_irn_n(node, 2);
1465 }
1466
1467 inline void
1468 set_Free_size (ir_node *node, ir_node *size) {
1469   assert (node->op == op_Free);
1470   set_irn_n(node, 2, size);
1471 }
1472
1473 inline type  *
1474 get_Free_type (ir_node *node) {
1475   assert (node->op == op_Free);
1476   return node->attr.f;
1477 }
1478
1479 inline void
1480 set_Free_type (ir_node *node, type *type) {
1481   assert (node->op == op_Free);
1482   node->attr.f = type;
1483 }
1484
1485 inline int
1486 get_Sync_n_preds (ir_node *node) {
1487   assert (node->op == op_Sync);
1488   return (get_irn_arity(node));
1489 }
1490
1491 /*
1492 inline void
1493 set_Sync_n_preds (ir_node *node, int n_preds) {
1494   assert (node->op == op_Sync);
1495 }
1496 */
1497
1498 inline ir_node *
1499 get_Sync_pred (ir_node *node, int pos) {
1500   assert (node->op == op_Sync);
1501   return get_irn_n(node, pos);
1502 }
1503
1504 inline void
1505 set_Sync_pred (ir_node *node, int pos, ir_node *pred) {
1506   assert (node->op == op_Sync);
1507   set_irn_n(node, pos, pred);
1508 }
1509
1510 inline ir_node *
1511 get_Proj_pred (ir_node *node) {
1512   assert (node->op == op_Proj);
1513   return get_irn_n(node, 0);
1514 }
1515
1516 inline void
1517 set_Proj_pred (ir_node *node, ir_node *pred) {
1518   assert (node->op == op_Proj);
1519   set_irn_n(node, 0, pred);
1520 }
1521
1522 inline long
1523 get_Proj_proj (ir_node *node) {
1524   assert (node->op == op_Proj);
1525   return node->attr.proj;
1526 }
1527
1528 inline void
1529 set_Proj_proj (ir_node *node, long proj) {
1530   assert (node->op == op_Proj);
1531   node->attr.proj = proj;
1532 }
1533
1534 inline int
1535 get_Tuple_n_preds (ir_node *node) {
1536   assert (node->op == op_Tuple);
1537   return (get_irn_arity(node));
1538 }
1539
1540 /*
1541 inline void
1542 set_Tuple_n_preds (ir_node *node, int n_preds) {
1543   assert (node->op == op_Tuple);
1544 }
1545 */
1546
1547 inline ir_node *
1548 get_Tuple_pred (ir_node *node, int pos) {
1549   assert (node->op == op_Tuple);
1550   return get_irn_n(node, pos);
1551 }
1552
1553 inline void
1554 set_Tuple_pred (ir_node *node, int pos, ir_node *pred) {
1555   assert (node->op == op_Tuple);
1556   set_irn_n(node, pos, pred);
1557 }
1558
1559 inline ir_node *
1560 get_Id_pred (ir_node *node) {
1561   assert (node->op == op_Id);
1562   return get_irn_n(node, 0);
1563 }
1564
1565 inline void
1566 set_Id_pred (ir_node *node, ir_node *pred) {
1567   assert (node->op == op_Id);
1568   set_irn_n(node, 0, pred);
1569 }
1570
1571 /******************************************************************/
1572 /*  Auxiliary routines                                            */
1573 /******************************************************************/
1574
1575 inline ir_node *
1576 skip_Proj (ir_node *node) {
1577   /* don't assert node !!! */
1578   if (node && (node->op == op_Proj)) {
1579     return get_Proj_pred(node);
1580   } else {
1581     return node;
1582   }
1583 }
1584
1585 inline ir_node *
1586 skip_nop (ir_node *node) {
1587   /* don't assert node !!! */
1588   if (node && (node->op == op_Id)) {
1589     return get_Id_pred(node);
1590   } else {
1591     return node;
1592   }
1593 }
1594
1595 inline int
1596 is_Bad (ir_node *node) {
1597   assert(node);
1598   if ((node) && get_irn_opcode(node) == iro_Bad)
1599     return 1;
1600   return 0;
1601 }
1602
1603 inline int
1604 is_no_Block (ir_node *node) {
1605   assert(node);
1606   return (get_irn_opcode(node) != iro_Block);
1607 }
1608
1609 /* Returns true if the operation manipulates control flow. */
1610 int
1611 is_cfop(ir_node *node) {
1612   return (   (get_irn_opcode(node) == iro_Start)
1613           || (get_irn_opcode(node) == iro_Jmp)
1614           || (get_irn_opcode(node) == iro_Cond)
1615           || (get_irn_opcode(node) == iro_Return)
1616           || (get_irn_opcode(node) == iro_Raise)
1617           || (get_irn_opcode(node) == iro_Bad));
1618 }
1619
1620 /* Returns true if the operation can change the control flow because
1621    of an exception. */
1622 int
1623 is_fragile_op(ir_node *node) {
1624   return (   (get_irn_opcode(node) == iro_Call)
1625           || (get_irn_opcode(node) == iro_Quot)
1626           || (get_irn_opcode(node) == iro_DivMod)
1627           || (get_irn_opcode(node) == iro_Div)
1628           || (get_irn_opcode(node) == iro_Mod)
1629           || (get_irn_opcode(node) == iro_Load)
1630           || (get_irn_opcode(node) == iro_Store)
1631           || (get_irn_opcode(node) == iro_Alloc)
1632           || (get_irn_opcode(node) == iro_Bad));
1633 }