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