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