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