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