is_Mux() added
[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
17 #ifdef HAVE_STRING_H
18 # include <string.h>
19 #endif
20
21 #include "ident.h"
22 #include "irnode_t.h"
23 #include "irgraph_t.h"
24 #include "irmode_t.h"
25 #include "typegmod.h"
26 #include "irbackedge_t.h"
27 #include "irdump.h"
28 #include "irop_t.h"
29 #include "irprog_t.h"
30 #include "iredges_t.h"
31
32 #include "irhooks.h"
33 #include "irtools.h"
34
35 /* some constants fixing the positions of nodes predecessors
36    in the in array */
37 #define CALL_PARAM_OFFSET     2
38 #define FUNCCALL_PARAM_OFFSET 1
39 #define SEL_INDEX_OFFSET      2
40 #define RETURN_RESULT_OFFSET  1  /* mem is not a result */
41 #define END_KEEPALIVE_OFFSET  0
42
43 static const char *pnc_name_arr [] = {
44   "pn_Cmp_False", "pn_Cmp_Eq", "pn_Cmp_Lt", "pn_Cmp_Le",
45   "pn_Cmp_Gt", "pn_Cmp_Ge", "pn_Cmp_Lg", "pn_Cmp_Leg",
46   "pn_Cmp_Uo", "pn_Cmp_Ue", "pn_Cmp_Ul", "pn_Cmp_Ule",
47   "pn_Cmp_Ug", "pn_Cmp_Uge", "pn_Cmp_Ne", "pn_Cmp_True"
48 };
49
50 /**
51  * returns the pnc name from an pnc constant
52  */
53 const char *get_pnc_string(int pnc) {
54   return pnc_name_arr[pnc];
55 }
56
57 /*
58  * Calculates the negated (Complement(R)) pnc condition.
59  */
60 int get_negated_pnc(int pnc, ir_mode *mode) {
61   pnc ^= pn_Cmp_True;
62
63   /* do NOT add the Uo bit for non-floating point values */
64   if (! mode_is_float(mode))
65     pnc &= ~pn_Cmp_Uo;
66
67   return pnc;
68 }
69
70 /* Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */
71 int
72 get_inversed_pnc(int pnc) {
73   int code    = pnc & ~(pn_Cmp_Lt|pn_Cmp_Gt);
74   int lesser  = pnc & pn_Cmp_Lt;
75   int greater = pnc & pn_Cmp_Gt;
76
77   code |= (lesser ? pn_Cmp_Gt : 0) | (greater ? pn_Cmp_Lt : 0);
78
79   return code;
80 }
81
82 const char *pns_name_arr [] = {
83   "initial_exec", "global_store",
84   "frame_base", "globals", "args"
85 };
86
87 const char *symconst_name_arr [] = {
88   "type_tag", "size", "addr_name", "addr_ent"
89 };
90
91 /**
92  * Indicates, whether additional data can be registered to ir nodes.
93  * If set to 1, this is not possible anymore.
94  */
95 static int forbid_new_data = 0;
96
97 /**
98  * The amount of additional space for custom data to be allocated upon
99  * creating a new node.
100  */
101 unsigned firm_add_node_size = 0;
102
103
104 /* register new space for every node */
105 unsigned register_additional_node_data(unsigned size) {
106   assert(!forbid_new_data && "Too late to register additional node data");
107
108   if (forbid_new_data)
109     return 0;
110
111   return firm_add_node_size += size;
112 }
113
114
115 void
116 init_irnode(void) {
117         /* Forbid the addition of new data to an ir node. */
118         forbid_new_data = 1;
119 }
120
121 /*
122  * irnode constructor.
123  * Create a new irnode in irg, with an op, mode, arity and
124  * some incoming irnodes.
125  * If arity is negative, a node with a dynamic array is created.
126  */
127 ir_node *
128 new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode,
129          int arity, ir_node **in)
130 {
131   ir_node *res;
132   size_t node_size = offsetof(ir_node, attr) + op->attr_size + firm_add_node_size;
133         char *p;
134
135   assert(irg && op && mode);
136   p = obstack_alloc (irg->obst, node_size);
137   memset(p, 0, node_size);
138         res = (ir_node *) (p + firm_add_node_size);
139
140   res->kind    = k_ir_node;
141   res->op      = op;
142   res->mode    = mode;
143   res->visited = 0;
144   res->link    = NULL;
145   if (arity < 0) {
146     res->in = NEW_ARR_F (ir_node *, 1);  /* 1: space for block */
147   } else {
148     res->in = NEW_ARR_D (ir_node *, irg->obst, (arity+1));
149     memcpy (&res->in[1], in, sizeof (ir_node *) * arity);
150   }
151
152   res->in[0] = block;
153   set_irn_dbg_info(res, db);
154   res->out = NULL;
155
156 #ifdef DEBUG_libfirm
157   res->node_nr = get_irp_new_node_nr();
158 #endif
159
160 #if FIRM_EDGES_INPLACE
161   {
162     int i;
163     int is_bl = is_Block(res);
164
165     INIT_LIST_HEAD(&res->edge_info.outs_head);
166     if(is_bl)
167       INIT_LIST_HEAD(&res->attr.block.succ_head);
168
169
170     for (i = is_bl; i <= arity; ++i)
171       edges_notify_edge(res, i - 1, res->in[i], NULL, irg);
172   }
173 #endif
174
175   hook_new_node(irg, res);
176
177   return res;
178 }
179
180 /*-- getting some parameters from ir_nodes --*/
181
182 int
183 (is_ir_node)(const void *thing) {
184   return _is_ir_node(thing);
185 }
186
187 int
188 (get_irn_intra_arity)(const ir_node *node) {
189   return _get_irn_intra_arity(node);
190 }
191
192 int
193 (get_irn_inter_arity)(const ir_node *node) {
194   return _get_irn_inter_arity(node);
195 }
196
197 int (*_get_irn_arity)(const ir_node *node) = _get_irn_intra_arity;
198
199 int
200 (get_irn_arity)(const ir_node *node) {
201   return _get_irn_arity(node);
202 }
203
204 /* Returns the array with ins. This array is shifted with respect to the
205    array accessed by get_irn_n: The block operand is at position 0 not -1.
206    (@@@ This should be changed.)
207    The order of the predecessors in this array is not guaranteed, except that
208    lists of operands as predecessors of Block or arguments of a Call are
209    consecutive. */
210 ir_node **
211 get_irn_in (const ir_node *node) {
212   assert(node);
213   if (get_interprocedural_view()) { /* handle Filter and Block specially */
214     if (get_irn_opcode(node) == iro_Filter) {
215       assert(node->attr.filter.in_cg);
216       return node->attr.filter.in_cg;
217     } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) {
218       return node->attr.block.in_cg;
219     }
220     /* else fall through */
221   }
222   return node->in;
223 }
224
225 void
226 set_irn_in (ir_node *node, int arity, ir_node **in) {
227   int i;
228   ir_node *** arr;
229   ir_graph *irg = current_ir_graph;
230   assert(node);
231   if (get_interprocedural_view()) { /* handle Filter and Block specially */
232     if (get_irn_opcode(node) == iro_Filter) {
233       assert(node->attr.filter.in_cg);
234       arr = &node->attr.filter.in_cg;
235     } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) {
236       arr = &node->attr.block.in_cg;
237     } else {
238       arr = &node->in;
239     }
240   } else {
241     arr = &node->in;
242   }
243
244         for (i = 0; i < arity; i++) {
245                 if (i < ARR_LEN(*arr)-1)
246         edges_notify_edge(node, i, in[i], (*arr)[i+1], irg);
247                 else
248             edges_notify_edge(node, i, in[i], NULL,        irg);
249   }
250         for(;i < ARR_LEN(*arr)-1; i++) {
251                 edges_notify_edge(node, i, NULL, (*arr)[i+1], irg);
252         }
253
254         if (arity != ARR_LEN(*arr) - 1) {
255     ir_node * block = (*arr)[0];
256     *arr = NEW_ARR_D(ir_node *, irg->obst, arity + 1);
257     (*arr)[0] = block;
258   }
259   fix_backedges(irg->obst, node);
260
261   memcpy((*arr) + 1, in, sizeof(ir_node *) * arity);
262 }
263
264 ir_node *
265 (get_irn_intra_n)(const ir_node *node, int n) {
266   return _get_irn_intra_n (node, n);
267 }
268
269 ir_node *
270 (get_irn_inter_n)(const ir_node *node, int n) {
271   return _get_irn_inter_n (node, n);
272 }
273
274 ir_node *(*_get_irn_n)(const ir_node *node, int n) = _get_irn_intra_n;
275
276 ir_node *
277 (get_irn_n)(const ir_node *node, int n) {
278   return _get_irn_n(node, n);
279 }
280
281 void
282 set_irn_n (ir_node *node, int n, ir_node *in) {
283   assert(node && node->kind == k_ir_node);
284   assert(-1 <= n);
285   assert(n < get_irn_arity(node));
286   assert(in && in->kind == k_ir_node);
287
288   if ((n == -1) && (get_irn_opcode(node) == iro_Filter)) {
289     /* Change block pred in both views! */
290     node->in[n + 1] = in;
291     assert(node->attr.filter.in_cg);
292     node->attr.filter.in_cg[n + 1] = in;
293     return;
294   }
295   if (get_interprocedural_view()) { /* handle Filter and Block specially */
296     if (get_irn_opcode(node) == iro_Filter) {
297       assert(node->attr.filter.in_cg);
298       node->attr.filter.in_cg[n + 1] = in;
299       return;
300     } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) {
301       node->attr.block.in_cg[n + 1] = in;
302       return;
303     }
304     /* else fall through */
305   }
306
307   /* Call the hook */
308   hook_set_irn_n(node, n, in, node->in[n + 1]);
309
310   /* Here, we rely on src and tgt being in the current ir graph */
311   edges_notify_edge(node, n, in, node->in[n + 1], current_ir_graph);
312
313   node->in[n + 1] = in;
314 }
315
316 ir_mode *
317 (get_irn_mode)(const ir_node *node) {
318   return _get_irn_mode(node);
319 }
320
321 void
322 (set_irn_mode)(ir_node *node, ir_mode *mode)
323 {
324   _set_irn_mode(node, mode);
325 }
326
327 modecode
328 get_irn_modecode (const ir_node *node)
329 {
330   assert (node);
331   return node->mode->code;
332 }
333
334 /** Gets the string representation of the mode .*/
335 const char *
336 get_irn_modename (const ir_node *node)
337 {
338   assert(node);
339   return get_mode_name(node->mode);
340 }
341
342 ident *
343 get_irn_modeident (const ir_node *node)
344 {
345   assert(node);
346   return get_mode_ident(node->mode);
347 }
348
349 ir_op *
350 (get_irn_op)(const ir_node *node)
351 {
352   return _get_irn_op(node);
353 }
354
355 /* should be private to the library: */
356 void
357 set_irn_op (ir_node *node, ir_op *op)
358 {
359   assert (node);
360   node->op = op;
361 }
362
363 opcode
364 (get_irn_opcode)(const ir_node *node)
365 {
366   return _get_irn_opcode(node);
367 }
368
369 const char *
370 get_irn_opname (const ir_node *node)
371 {
372   assert(node);
373   if ((get_irn_op((ir_node *)node) == op_Phi) &&
374       (get_irg_phase_state(get_irn_irg((ir_node *)node)) == phase_building) &&
375       (get_irn_arity((ir_node *)node) == 0)) return "Phi0";
376   return get_id_str(node->op->name);
377 }
378
379 ident *
380 get_irn_opident (const ir_node *node)
381 {
382   assert(node);
383   return node->op->name;
384 }
385
386 unsigned long
387 (get_irn_visited)(const ir_node *node)
388 {
389   return _get_irn_visited(node);
390 }
391
392 void
393 (set_irn_visited)(ir_node *node, unsigned long visited)
394 {
395   _set_irn_visited(node, visited);
396 }
397
398 void
399 (mark_irn_visited)(ir_node *node) {
400   _mark_irn_visited(node);
401 }
402
403 int
404 (irn_not_visited)(const ir_node *node) {
405   return _irn_not_visited(node);
406 }
407
408 int
409 (irn_visited)(const ir_node *node) {
410   return _irn_visited(node);
411 }
412
413 void
414 (set_irn_link)(ir_node *node, void *link) {
415   _set_irn_link(node, link);
416 }
417
418 void *
419 (get_irn_link)(const ir_node *node) {
420   return _get_irn_link(node);
421 }
422
423 op_pin_state
424 (get_irn_pinned)(const ir_node *node) {
425   return _get_irn_pinned(node);
426 }
427
428 op_pin_state
429 (is_irn_pinned_in_irg) (const ir_node *node) {
430   return _is_irn_pinned_in_irg(node);
431 }
432
433 void set_irn_pinned(ir_node *node, op_pin_state state) {
434   /* due to optimization an opt may be turned into a Tuple */
435   if (get_irn_op(node) == op_Tuple)
436     return;
437
438   assert(node && get_op_pinned(get_irn_op(node)) >= op_pin_state_exc_pinned);
439   assert(state == op_pin_state_pinned || state == op_pin_state_floats);
440
441   node->attr.except.pin_state = state;
442 }
443
444 #ifdef DO_HEAPANALYSIS
445 /* Access the abstract interpretation information of a node.
446    Returns NULL if no such information is available. */
447 struct abstval *get_irn_abst_value(ir_node *n) {
448   return n->av;
449 }
450 /* Set the abstract interpretation information of a node. */
451 void set_irn_abst_value(ir_node *n, struct abstval *os) {
452   n->av = os;
453 }
454 struct section *firm_get_irn_section(ir_node *n) {
455   return n->sec;
456 }
457 void firm_set_irn_section(ir_node *n, struct section *s) {
458   n->sec = s;
459 }
460 #else
461 /* Dummies needed for firmjni. */
462 struct abstval *get_irn_abst_value(ir_node *n) { return NULL; }
463 void set_irn_abst_value(ir_node *n, struct abstval *os) {}
464 struct section *firm_get_irn_section(ir_node *n) { return NULL; }
465 void firm_set_irn_section(ir_node *n, struct section *s) {}
466 #endif /* DO_HEAPANALYSIS */
467
468
469 /* Outputs a unique number for this node */
470 long get_irn_node_nr(const ir_node *node) {
471   assert(node);
472 #ifdef DEBUG_libfirm
473   return node->node_nr;
474 #else
475   return (long)PTR_TO_INT(node);
476 #endif
477 }
478
479 const_attr
480 get_irn_const_attr (ir_node *node)
481 {
482   assert (node->op == op_Const);
483   return node->attr.con;
484 }
485
486 long
487 get_irn_proj_attr (ir_node *node)
488 {
489   assert (node->op == op_Proj);
490   return node->attr.proj;
491 }
492
493 alloc_attr
494 get_irn_alloc_attr (ir_node *node)
495 {
496   assert (node->op == op_Alloc);
497   return node->attr.a;
498 }
499
500 free_attr
501 get_irn_free_attr     (ir_node *node)
502 {
503   assert (node->op == op_Free);
504   return node->attr.f;
505 }
506
507 symconst_attr
508 get_irn_symconst_attr (ir_node *node)
509 {
510   assert (node->op == op_SymConst);
511   return node->attr.i;
512 }
513
514 ir_type *
515 get_irn_call_attr (ir_node *node)
516 {
517   assert (node->op == op_Call);
518   return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
519 }
520
521 sel_attr
522 get_irn_sel_attr (ir_node *node)
523 {
524   assert (node->op == op_Sel);
525   return node->attr.s;
526 }
527
528 int
529 get_irn_phi_attr (ir_node *node)
530 {
531   assert (node->op == op_Phi);
532   return node->attr.phi0_pos;
533 }
534
535 block_attr
536 get_irn_block_attr (ir_node *node)
537 {
538   assert (node->op == op_Block);
539   return node->attr.block;
540 }
541
542 load_attr
543 get_irn_load_attr (ir_node *node)
544 {
545   assert (node->op == op_Load);
546   return node->attr.load;
547 }
548
549 store_attr
550 get_irn_store_attr (ir_node *node)
551 {
552   assert (node->op == op_Store);
553   return node->attr.store;
554 }
555
556 except_attr
557 get_irn_except_attr (ir_node *node)
558 {
559   assert (node->op == op_Div || node->op == op_Quot ||
560           node->op == op_DivMod || node->op == op_Mod || node->op == op_Call || node->op == op_Alloc);
561   return node->attr.except;
562 }
563
564 void *
565 get_irn_generic_attr (ir_node *node) {
566   return &node->attr;
567 }
568
569 /** manipulate fields of individual nodes **/
570
571 /* this works for all except Block */
572 ir_node *
573 get_nodes_block (const ir_node *node) {
574   assert (!(node->op == op_Block));
575         assert (is_irn_pinned_in_irg(node) && "block info may be incorrect");
576   return get_irn_n(node, -1);
577 }
578
579 void
580 set_nodes_block (ir_node *node, ir_node *block) {
581   assert (!(node->op == op_Block));
582   set_irn_n(node, -1, block);
583 }
584
585 /* Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
586  * from Start.  If so returns frame type, else Null. */
587 ir_type *is_frame_pointer(ir_node *n) {
588   if ((get_irn_op(n) == op_Proj) &&
589       (get_Proj_proj(n) == pn_Start_P_frame_base)) {
590     ir_node *start = get_Proj_pred(n);
591     if (get_irn_op(start) == op_Start) {
592       return get_irg_frame_type(get_irn_irg(start));
593     }
594   }
595   return NULL;
596 }
597
598 /* Test whether arbitrary node is globals pointer, i.e. Proj(pn_Start_P_globals)
599  * from Start.  If so returns global type, else Null. */
600 ir_type *is_globals_pointer(ir_node *n) {
601   if ((get_irn_op(n) == op_Proj) &&
602       (get_Proj_proj(n) == pn_Start_P_globals)) {
603     ir_node *start = get_Proj_pred(n);
604     if (get_irn_op(start) == op_Start) {
605       return get_glob_type();
606     }
607   }
608   return NULL;
609 }
610
611 /* Test whether arbitrary node is value arg base, i.e. Proj(pn_Start_P_value_arg_base)
612  * from Start.  If so returns 1, else 0. */
613 int is_value_arg_pointer(ir_node *n) {
614   if ((get_irn_op(n) == op_Proj) &&
615       (get_Proj_proj(n) == pn_Start_P_value_arg_base) &&
616       (get_irn_op(get_Proj_pred(n)) == op_Start))
617     return 1;
618   return 0;
619 }
620
621 /* Returns an array with the predecessors of the Block. Depending on
622    the implementation of the graph data structure this can be a copy of
623    the internal representation of predecessors as well as the internal
624    array itself. Therefore writing to this array might obstruct the ir. */
625 ir_node **
626 get_Block_cfgpred_arr (ir_node *node)
627 {
628   assert ((node->op == op_Block));
629   return (ir_node **)&(get_irn_in(node)[1]);
630 }
631
632 int
633 (get_Block_n_cfgpreds)(ir_node *node) {
634   return _get_Block_n_cfgpreds(node);
635 }
636
637 ir_node *
638 (get_Block_cfgpred)(ir_node *node, int pos) {
639   return _get_Block_cfgpred(node, pos);
640 }
641
642 void
643 set_Block_cfgpred (ir_node *node, int pos, ir_node *pred) {
644   assert (node->op == op_Block);
645   set_irn_n(node, pos, pred);
646 }
647
648 ir_node  *
649 (get_Block_cfgpred_block)(ir_node *node, int pos) {
650   return _get_Block_cfgpred_block(node, pos);
651 }
652
653 int
654 get_Block_matured (ir_node *node) {
655   assert (node->op == op_Block);
656   return (int)node->attr.block.matured;
657 }
658
659 void
660 set_Block_matured (ir_node *node, int matured) {
661   assert (node->op == op_Block);
662   node->attr.block.matured = matured;
663 }
664
665 unsigned long
666 (get_Block_block_visited)(ir_node *node) {
667   return _get_Block_block_visited(node);
668 }
669
670 void
671 (set_Block_block_visited)(ir_node *node, unsigned long visit) {
672   _set_Block_block_visited(node, visit);
673 }
674
675 /* For this current_ir_graph must be set. */
676 void
677 (mark_Block_block_visited)(ir_node *node) {
678   _mark_Block_block_visited(node);
679 }
680
681 int
682 (Block_not_block_visited)(ir_node *node) {
683   return _Block_not_block_visited(node);
684 }
685
686 ir_node *
687 get_Block_graph_arr (ir_node *node, int pos) {
688   assert (node->op == op_Block);
689   return node->attr.block.graph_arr[pos+1];
690 }
691
692 void
693 set_Block_graph_arr (ir_node *node, int pos, ir_node *value) {
694   assert (node->op == op_Block);
695   node->attr.block.graph_arr[pos+1] = value;
696 }
697
698 void set_Block_cg_cfgpred_arr(ir_node * node, int arity, ir_node ** in) {
699   assert(node->op == op_Block);
700   if (node->attr.block.in_cg == NULL || arity != ARR_LEN(node->attr.block.in_cg) - 1) {
701     node->attr.block.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
702     node->attr.block.in_cg[0] = NULL;
703     node->attr.block.cg_backedge = new_backedge_arr(current_ir_graph->obst, arity);
704     {
705       /* Fix backedge array.  fix_backedges() operates depending on
706      interprocedural_view. */
707       int ipv = get_interprocedural_view();
708       set_interprocedural_view(1);
709       fix_backedges(current_ir_graph->obst, node);
710       set_interprocedural_view(ipv);
711     }
712   }
713   memcpy(node->attr.block.in_cg + 1, in, sizeof(ir_node *) * arity);
714 }
715
716 void set_Block_cg_cfgpred(ir_node * node, int pos, ir_node * pred) {
717   assert(node->op == op_Block &&
718      node->attr.block.in_cg &&
719      0 <= pos && pos < ARR_LEN(node->attr.block.in_cg) - 1);
720   node->attr.block.in_cg[pos + 1] = pred;
721 }
722
723 ir_node ** get_Block_cg_cfgpred_arr(ir_node * node) {
724   assert(node->op == op_Block);
725   return node->attr.block.in_cg == NULL ? NULL : node->attr.block.in_cg  + 1;
726 }
727
728 int get_Block_cg_n_cfgpreds(ir_node * node) {
729   assert(node->op == op_Block);
730   return node->attr.block.in_cg == NULL ? 0 : ARR_LEN(node->attr.block.in_cg) - 1;
731 }
732
733 ir_node * get_Block_cg_cfgpred(ir_node * node, int pos) {
734   assert(node->op == op_Block && node->attr.block.in_cg);
735   return node->attr.block.in_cg[pos + 1];
736 }
737
738 void remove_Block_cg_cfgpred_arr(ir_node * node) {
739   assert(node->op == op_Block);
740   node->attr.block.in_cg = NULL;
741 }
742
743 ir_node *(set_Block_dead)(ir_node *block) {
744   return _set_Block_dead(block);
745 }
746
747 int (is_Block_dead)(const ir_node *block) {
748   return _is_Block_dead(block);
749 }
750
751 ir_extblk *get_Block_extbb(const ir_node *block) {
752         ir_extblk *res;
753   assert(is_Block(block));
754         res = block->attr.block.extblk;
755         assert(res == NULL || is_ir_extbb(res));
756   return res;
757 }
758
759 void set_Block_extbb(ir_node *block, ir_extblk *extblk) {
760   assert(is_Block(block));
761         assert(extblk == NULL || is_ir_extbb(extblk));
762   block->attr.block.extblk = extblk;
763 }
764
765 int
766 get_End_n_keepalives(ir_node *end) {
767   assert (end->op == op_End);
768   return (get_irn_arity(end) - END_KEEPALIVE_OFFSET);
769 }
770
771 ir_node *
772 get_End_keepalive(ir_node *end, int pos) {
773   assert (end->op == op_End);
774   return get_irn_n(end, pos + END_KEEPALIVE_OFFSET);
775 }
776
777 void
778 add_End_keepalive (ir_node *end, ir_node *ka) {
779   assert (end->op == op_End);
780   ARR_APP1 (ir_node *, end->in, ka);
781 }
782
783 void
784 set_End_keepalive(ir_node *end, int pos, ir_node *ka) {
785   assert (end->op == op_End);
786   set_irn_n(end, pos + END_KEEPALIVE_OFFSET, ka);
787 }
788
789 void
790 free_End (ir_node *end) {
791   assert (end->op == op_End);
792   end->kind = k_BAD;
793   DEL_ARR_F(end->in);  /* GL @@@ tut nicht ! */
794   end->in = NULL;   /* @@@ make sure we get an error if we use the
795                in array afterwards ... */
796 }
797
798 /* Return the target address of an IJmp */
799 ir_node *get_IJmp_target(ir_node *ijmp) {
800   assert(ijmp->op == op_IJmp);
801   return get_irn_n(ijmp, 0);
802 }
803
804 /** Sets the target address of an IJmp */
805 void set_IJmp_target(ir_node *ijmp, ir_node *tgt) {
806   assert(ijmp->op == op_IJmp);
807   set_irn_n(ijmp, 0, tgt);
808 }
809
810 /*
811 > Implementing the case construct (which is where the constant Proj node is
812 > important) involves far more than simply determining the constant values.
813 > We could argue that this is more properly a function of the translator from
814 > Firm to the target machine.  That could be done if there was some way of
815 > projecting "default" out of the Cond node.
816 I know it's complicated.
817 Basically there are two proglems:
818  - determining the gaps between the projs
819  - determining the biggest case constant to know the proj number for
820    the default node.
821 I see several solutions:
822 1. Introduce a ProjDefault node.  Solves both problems.
823    This means to extend all optimizations executed during construction.
824 2. Give the Cond node for switch two flavors:
825    a) there are no gaps in the projs  (existing flavor)
826    b) gaps may exist, default proj is still the Proj with the largest
827       projection number.  This covers also the gaps.
828 3. Fix the semantic of the Cond to that of 2b)
829
830 Solution 2 seems to be the best:
831 Computing the gaps in the Firm representation is not too hard, i.e.,
832 libFIRM can implement a routine that transforms between the two
833 flavours.  This is also possible for 1) but 2) does not require to
834 change any existing optimization.
835 Further it should be far simpler to determine the biggest constant than
836 to compute all gaps.
837 I don't want to choose 3) as 2a) seems to have advantages for
838 dataflow analysis and 3) does not allow to convert the representation to
839 2a).
840 */
841 ir_node *
842 get_Cond_selector (ir_node *node) {
843   assert (node->op == op_Cond);
844   return get_irn_n(node, 0);
845 }
846
847 void
848 set_Cond_selector (ir_node *node, ir_node *selector) {
849   assert (node->op == op_Cond);
850   set_irn_n(node, 0, selector);
851 }
852
853 cond_kind
854 get_Cond_kind (ir_node *node) {
855   assert (node->op == op_Cond);
856   return node->attr.c.kind;
857 }
858
859 void
860 set_Cond_kind (ir_node *node, cond_kind kind) {
861   assert (node->op == op_Cond);
862   node->attr.c.kind = kind;
863 }
864
865 long
866 get_Cond_defaultProj (ir_node *node) {
867   assert (node->op == op_Cond);
868   return node->attr.c.default_proj;
869 }
870
871 ir_node *
872 get_Return_mem (ir_node *node) {
873   assert (node->op == op_Return);
874   return get_irn_n(node, 0);
875 }
876
877 void
878 set_Return_mem (ir_node *node, ir_node *mem) {
879   assert (node->op == op_Return);
880   set_irn_n(node, 0, mem);
881 }
882
883 int
884 get_Return_n_ress (ir_node *node) {
885   assert (node->op == op_Return);
886   return (get_irn_arity(node) - RETURN_RESULT_OFFSET);
887 }
888
889 ir_node **
890 get_Return_res_arr (ir_node *node)
891 {
892   assert ((node->op == op_Return));
893   if (get_Return_n_ress(node) > 0)
894     return (ir_node **)&(get_irn_in(node)[1 + RETURN_RESULT_OFFSET]);
895   else
896     return NULL;
897 }
898
899 /*
900 void
901 set_Return_n_res (ir_node *node, int results) {
902   assert (node->op == op_Return);
903 }
904 */
905
906 ir_node *
907 get_Return_res (ir_node *node, int pos) {
908   assert (node->op == op_Return);
909   assert (get_Return_n_ress(node) > pos);
910   return get_irn_n(node, pos + RETURN_RESULT_OFFSET);
911 }
912
913 void
914 set_Return_res (ir_node *node, int pos, ir_node *res){
915   assert (node->op == op_Return);
916   set_irn_n(node, pos + RETURN_RESULT_OFFSET, res);
917 }
918
919 tarval *(get_Const_tarval)(ir_node *node) {
920         return _get_Const_tarval(node);
921 }
922
923 void
924 set_Const_tarval (ir_node *node, tarval *con) {
925   assert (node->op == op_Const);
926   node->attr.con.tv = con;
927 }
928
929 cnst_classify_t (classify_Const)(ir_node *node)
930 {
931         return _classify_Const(node);
932 }
933
934
935 /* The source language type.  Must be an atomic type.  Mode of type must
936    be mode of node. For tarvals from entities type must be pointer to
937    entity type. */
938 ir_type *
939 get_Const_type (ir_node *node) {
940   assert (node->op == op_Const);
941   return node->attr.con.tp;
942 }
943
944 void
945 set_Const_type (ir_node *node, ir_type *tp) {
946   assert (node->op == op_Const);
947   if (tp != firm_unknown_type) {
948     assert (is_atomic_type(tp));
949     assert (get_type_mode(tp) == get_irn_mode(node));
950   }
951   node->attr.con.tp = tp;
952 }
953
954
955 symconst_kind
956 get_SymConst_kind (const ir_node *node) {
957   assert (node->op == op_SymConst);
958   return node->attr.i.num;
959 }
960
961 void
962 set_SymConst_kind (ir_node *node, symconst_kind num) {
963   assert (node->op == op_SymConst);
964   node->attr.i.num = num;
965 }
966
967 ir_type *
968 get_SymConst_type (ir_node *node) {
969   assert (   (node->op == op_SymConst)
970           && (   get_SymConst_kind(node) == symconst_type_tag
971               || get_SymConst_kind(node) == symconst_size));
972   return node->attr.i.sym.type_p = skip_tid(node->attr.i.sym.type_p);
973 }
974
975 void
976 set_SymConst_type (ir_node *node, ir_type *tp) {
977   assert (   (node->op == op_SymConst)
978           && (   get_SymConst_kind(node) == symconst_type_tag
979               || get_SymConst_kind(node) == symconst_size));
980   node->attr.i.sym.type_p = tp;
981 }
982
983 ident *
984 get_SymConst_name (ir_node *node) {
985   assert (   (node->op == op_SymConst)
986           && (get_SymConst_kind(node) == symconst_addr_name));
987   return node->attr.i.sym.ident_p;
988 }
989
990 void
991 set_SymConst_name (ir_node *node, ident *name) {
992   assert (   (node->op == op_SymConst)
993           && (get_SymConst_kind(node) == symconst_addr_name));
994   node->attr.i.sym.ident_p = name;
995 }
996
997
998 /* Only to access SymConst of kind symconst_addr_ent.  Else assertion: */
999 entity   *get_SymConst_entity (ir_node *node) {
1000   assert (   (node->op == op_SymConst)
1001           && (get_SymConst_kind (node) == symconst_addr_ent));
1002   return node->attr.i.sym.entity_p;
1003 }
1004
1005 void     set_SymConst_entity (ir_node *node, entity *ent) {
1006   assert (   (node->op == op_SymConst)
1007           && (get_SymConst_kind(node) == symconst_addr_ent));
1008   node->attr.i.sym.entity_p  = ent;
1009 }
1010
1011 union symconst_symbol
1012 get_SymConst_symbol (ir_node *node) {
1013   assert (node->op == op_SymConst);
1014   return node->attr.i.sym;
1015 }
1016
1017 void
1018 set_SymConst_symbol (ir_node *node, union symconst_symbol sym) {
1019   assert (node->op == op_SymConst);
1020   //memcpy (&(node->attr.i.sym), sym, sizeof(type_or_id));
1021   node->attr.i.sym = sym;
1022 }
1023
1024 ir_type *
1025 get_SymConst_value_type (ir_node *node) {
1026   assert (node->op == op_SymConst);
1027   if (node->attr.i.tp) node->attr.i.tp = skip_tid(node->attr.i.tp);
1028   return node->attr.i.tp;
1029 }
1030
1031 void
1032 set_SymConst_value_type (ir_node *node, ir_type *tp) {
1033   assert (node->op == op_SymConst);
1034   node->attr.i.tp = tp;
1035 }
1036
1037 ir_node *
1038 get_Sel_mem (ir_node *node) {
1039   assert (node->op == op_Sel);
1040   return get_irn_n(node, 0);
1041 }
1042
1043 void
1044 set_Sel_mem (ir_node *node, ir_node *mem) {
1045   assert (node->op == op_Sel);
1046   set_irn_n(node, 0, mem);
1047 }
1048
1049 ir_node *
1050 get_Sel_ptr (ir_node *node) {
1051   assert (node->op == op_Sel);
1052   return get_irn_n(node, 1);
1053 }
1054
1055 void
1056 set_Sel_ptr (ir_node *node, ir_node *ptr) {
1057   assert (node->op == op_Sel);
1058   set_irn_n(node, 1, ptr);
1059 }
1060
1061 int
1062 get_Sel_n_indexs (ir_node *node) {
1063   assert (node->op == op_Sel);
1064   return (get_irn_arity(node) - SEL_INDEX_OFFSET);
1065 }
1066
1067 ir_node **
1068 get_Sel_index_arr (ir_node *node)
1069 {
1070   assert ((node->op == op_Sel));
1071   if (get_Sel_n_indexs(node) > 0)
1072     return (ir_node **)& get_irn_in(node)[SEL_INDEX_OFFSET + 1];
1073   else
1074     return NULL;
1075 }
1076
1077 ir_node *
1078 get_Sel_index (ir_node *node, int pos) {
1079   assert (node->op == op_Sel);
1080   return get_irn_n(node, pos + SEL_INDEX_OFFSET);
1081 }
1082
1083 void
1084 set_Sel_index (ir_node *node, int pos, ir_node *index) {
1085   assert (node->op == op_Sel);
1086   set_irn_n(node, pos + SEL_INDEX_OFFSET, index);
1087 }
1088
1089 entity *
1090 get_Sel_entity (ir_node *node) {
1091   assert (node->op == op_Sel);
1092   return node->attr.s.ent;
1093 }
1094
1095 void
1096 set_Sel_entity (ir_node *node, entity *ent) {
1097   assert (node->op == op_Sel);
1098   node->attr.s.ent = ent;
1099 }
1100
1101
1102 /* For unary and binary arithmetic operations the access to the
1103    operands can be factored out.  Left is the first, right the
1104    second arithmetic value  as listed in tech report 0999-33.
1105    unops are: Minus, Abs, Not, Conv, Cast
1106    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
1107    Shr, Shrs, Rotate, Cmp */
1108
1109
1110 ir_node *
1111 get_Call_mem (ir_node *node) {
1112   assert (node->op == op_Call);
1113   return get_irn_n(node, 0);
1114 }
1115
1116 void
1117 set_Call_mem (ir_node *node, ir_node *mem) {
1118   assert (node->op == op_Call);
1119   set_irn_n(node, 0, mem);
1120 }
1121
1122 ir_node *
1123 get_Call_ptr (ir_node *node) {
1124   assert (node->op == op_Call);
1125   return get_irn_n(node, 1);
1126 }
1127
1128 void
1129 set_Call_ptr (ir_node *node, ir_node *ptr) {
1130   assert (node->op == op_Call);
1131   set_irn_n(node, 1, ptr);
1132 }
1133
1134 ir_node **
1135 get_Call_param_arr (ir_node *node) {
1136   assert (node->op == op_Call);
1137   return (ir_node **)&get_irn_in(node)[CALL_PARAM_OFFSET + 1];
1138 }
1139
1140 int
1141 get_Call_n_params (ir_node *node)  {
1142   assert (node->op == op_Call);
1143   return (get_irn_arity(node) - CALL_PARAM_OFFSET);
1144 }
1145
1146 int
1147 get_Call_arity (ir_node *node) {
1148   assert (node->op == op_Call);
1149   return get_Call_n_params(node);
1150 }
1151
1152 /* void
1153 set_Call_arity (ir_node *node, ir_node *arity) {
1154   assert (node->op == op_Call);
1155 }
1156 */
1157
1158 ir_node *
1159 get_Call_param (ir_node *node, int pos) {
1160   assert (node->op == op_Call);
1161   return get_irn_n(node, pos + CALL_PARAM_OFFSET);
1162 }
1163
1164 void
1165 set_Call_param (ir_node *node, int pos, ir_node *param) {
1166   assert (node->op == op_Call);
1167   set_irn_n(node, pos + CALL_PARAM_OFFSET, param);
1168 }
1169
1170 ir_type *
1171 get_Call_type (ir_node *node) {
1172   assert (node->op == op_Call);
1173   return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
1174 }
1175
1176 void
1177 set_Call_type (ir_node *node, ir_type *tp) {
1178   assert (node->op == op_Call);
1179   assert ((get_unknown_type() == tp) || is_Method_type(tp));
1180   node->attr.call.cld_tp = tp;
1181 }
1182
1183 int Call_has_callees(ir_node *node) {
1184   assert(node && node->op == op_Call);
1185   return ((get_irg_callee_info_state(get_irn_irg(node)) != irg_callee_info_none) &&
1186       (node->attr.call.callee_arr != NULL));
1187 }
1188
1189 int get_Call_n_callees(ir_node * node) {
1190   assert(node && node->op == op_Call && node->attr.call.callee_arr);
1191   return ARR_LEN(node->attr.call.callee_arr);
1192 }
1193
1194 entity * get_Call_callee(ir_node * node, int pos) {
1195   assert(pos >= 0 && pos < get_Call_n_callees(node));
1196   return node->attr.call.callee_arr[pos];
1197 }
1198
1199 void set_Call_callee_arr(ir_node * node, const int n, entity ** arr) {
1200   assert(node->op == op_Call);
1201   if (node->attr.call.callee_arr == NULL || get_Call_n_callees(node) != n) {
1202     node->attr.call.callee_arr = NEW_ARR_D(entity *, current_ir_graph->obst, n);
1203   }
1204   memcpy(node->attr.call.callee_arr, arr, n * sizeof(entity *));
1205 }
1206
1207 void remove_Call_callee_arr(ir_node * node) {
1208   assert(node->op == op_Call);
1209   node->attr.call.callee_arr = NULL;
1210 }
1211
1212 ir_node * get_CallBegin_ptr (ir_node *node) {
1213   assert(node->op == op_CallBegin);
1214   return get_irn_n(node, 0);
1215 }
1216 void set_CallBegin_ptr (ir_node *node, ir_node *ptr) {
1217   assert(node->op == op_CallBegin);
1218   set_irn_n(node, 0, ptr);
1219 }
1220 ir_node * get_CallBegin_call (ir_node *node) {
1221   assert(node->op == op_CallBegin);
1222   return node->attr.callbegin.call;
1223 }
1224 void  set_CallBegin_call (ir_node *node, ir_node *call) {
1225   assert(node->op == op_CallBegin);
1226   node->attr.callbegin.call = call;
1227 }
1228
1229
1230 #define BINOP(OP)                   \
1231 ir_node * get_##OP##_left(ir_node *node) {      \
1232   assert(node->op == op_##OP);              \
1233   return get_irn_n(node, node->op->op_index);       \
1234 }                           \
1235 void set_##OP##_left(ir_node *node, ir_node *left) {    \
1236   assert(node->op == op_##OP);              \
1237   set_irn_n(node, node->op->op_index, left);        \
1238 }                           \
1239 ir_node *get_##OP##_right(ir_node *node) {      \
1240   assert(node->op == op_##OP);              \
1241   return get_irn_n(node, node->op->op_index + 1);   \
1242 }                           \
1243 void set_##OP##_right(ir_node *node, ir_node *right) {  \
1244   assert(node->op == op_##OP);              \
1245   set_irn_n(node, node->op->op_index + 1, right);   \
1246 }
1247
1248 #define UNOP(OP)                    \
1249 ir_node *get_##OP##_op(ir_node *node) {         \
1250   assert(node->op == op_##OP);              \
1251   return get_irn_n(node, node->op->op_index);       \
1252 }                           \
1253 void set_##OP##_op (ir_node *node, ir_node *op) {   \
1254   assert(node->op == op_##OP);              \
1255   set_irn_n(node, node->op->op_index, op);      \
1256 }
1257
1258 BINOP(Add)
1259 BINOP(Sub)
1260 UNOP(Minus)
1261 BINOP(Mul)
1262 BINOP(Quot)
1263
1264 ir_node *
1265 get_Quot_mem (ir_node *node) {
1266   assert (node->op == op_Quot);
1267   return get_irn_n(node, 0);
1268 }
1269
1270 void
1271 set_Quot_mem (ir_node *node, ir_node *mem) {
1272   assert (node->op == op_Quot);
1273   set_irn_n(node, 0, mem);
1274 }
1275
1276 BINOP(DivMod)
1277
1278 ir_node *
1279 get_DivMod_mem (ir_node *node) {
1280   assert (node->op == op_DivMod);
1281   return get_irn_n(node, 0);
1282 }
1283
1284 void
1285 set_DivMod_mem (ir_node *node, ir_node *mem) {
1286   assert (node->op == op_DivMod);
1287   set_irn_n(node, 0, mem);
1288 }
1289
1290 BINOP(Div)
1291
1292 ir_node *
1293 get_Div_mem (ir_node *node) {
1294   assert (node->op == op_Div);
1295   return get_irn_n(node, 0);
1296 }
1297
1298 void
1299 set_Div_mem (ir_node *node, ir_node *mem) {
1300   assert (node->op == op_Div);
1301   set_irn_n(node, 0, mem);
1302 }
1303
1304 BINOP(Mod)
1305
1306 ir_node *
1307 get_Mod_mem (ir_node *node) {
1308   assert (node->op == op_Mod);
1309   return get_irn_n(node, 0);
1310 }
1311
1312 void
1313 set_Mod_mem (ir_node *node, ir_node *mem) {
1314   assert (node->op == op_Mod);
1315   set_irn_n(node, 0, mem);
1316 }
1317
1318 UNOP(Abs)
1319 BINOP(And)
1320 BINOP(Or)
1321 BINOP(Eor)
1322 UNOP(Not)
1323 BINOP(Shl)
1324 BINOP(Shr)
1325 BINOP(Shrs)
1326 BINOP(Rot)
1327 BINOP(Cmp)
1328 UNOP(Conv)
1329 UNOP(Cast)
1330
1331 ir_type *
1332 get_Cast_type (ir_node *node) {
1333   assert (node->op == op_Cast);
1334   return node->attr.cast.totype;
1335 }
1336
1337 void
1338 set_Cast_type (ir_node *node, ir_type *to_tp) {
1339   assert (node->op == op_Cast);
1340   node->attr.cast.totype = to_tp;
1341 }
1342
1343
1344 /* Checks for upcast.
1345  *
1346  * Returns true if the Cast node casts a class type to a super type.
1347  */
1348 int is_Cast_upcast(ir_node *node) {
1349   ir_type *totype   = get_Cast_type(node);
1350   ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1351   ir_graph *myirg = get_irn_irg(node);
1352
1353   assert(get_irg_typeinfo_state(myirg) == ir_typeinfo_consistent);
1354   assert(fromtype);
1355
1356   while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1357     totype   = get_pointer_points_to_type(totype);
1358     fromtype = get_pointer_points_to_type(fromtype);
1359   }
1360
1361   assert(fromtype);
1362
1363   if (!is_Class_type(totype)) return 0;
1364   return is_SubClass_of(fromtype, totype);
1365 }
1366
1367 /* Checks for downcast.
1368  *
1369  * Returns true if the Cast node casts a class type to a sub type.
1370  */
1371 int is_Cast_downcast(ir_node *node) {
1372   ir_type *totype   = get_Cast_type(node);
1373   ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
1374
1375   assert(get_irg_typeinfo_state(get_irn_irg(node)) == ir_typeinfo_consistent);
1376   assert(fromtype);
1377
1378   while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
1379     totype   = get_pointer_points_to_type(totype);
1380     fromtype = get_pointer_points_to_type(fromtype);
1381   }
1382
1383   assert(fromtype);
1384
1385   if (!is_Class_type(totype)) return 0;
1386   return is_SubClass_of(totype, fromtype);
1387 }
1388
1389 int
1390 (is_unop)(const ir_node *node) {
1391   return _is_unop(node);
1392 }
1393
1394 ir_node *
1395 get_unop_op (ir_node *node) {
1396   if (node->op->opar == oparity_unary)
1397     return get_irn_n(node, node->op->op_index);
1398
1399   assert(node->op->opar == oparity_unary);
1400   return NULL;
1401 }
1402
1403 void
1404 set_unop_op (ir_node *node, ir_node *op) {
1405   if (node->op->opar == oparity_unary)
1406     set_irn_n(node, node->op->op_index, op);
1407
1408   assert(node->op->opar == oparity_unary);
1409 }
1410
1411 int
1412 (is_binop)(const ir_node *node) {
1413   return _is_binop(node);
1414 }
1415
1416 ir_node *
1417 get_binop_left (ir_node *node) {
1418   if (node->op->opar == oparity_binary)
1419     return get_irn_n(node, node->op->op_index);
1420
1421   assert(node->op->opar == oparity_binary);
1422   return NULL;
1423 }
1424
1425 void
1426 set_binop_left (ir_node *node, ir_node *left) {
1427   if (node->op->opar == oparity_binary)
1428     set_irn_n(node, node->op->op_index, left);
1429
1430   assert (node->op->opar == oparity_binary);
1431 }
1432
1433 ir_node *
1434 get_binop_right (ir_node *node) {
1435   if (node->op->opar == oparity_binary)
1436     return get_irn_n(node, node->op->op_index + 1);
1437
1438   assert(node->op->opar == oparity_binary);
1439   return NULL;
1440 }
1441
1442 void
1443 set_binop_right (ir_node *node, ir_node *right) {
1444   if (node->op->opar == oparity_binary)
1445     set_irn_n(node, node->op->op_index + 1, right);
1446
1447   assert (node->op->opar == oparity_binary);
1448 }
1449
1450 int is_Phi (const ir_node *n) {
1451   ir_op *op;
1452
1453   assert(n);
1454   op = get_irn_op(n);
1455
1456   if (op == op_Filter) return get_interprocedural_view();
1457
1458   if (op == op_Phi)
1459     return  ((get_irg_phase_state(get_irn_irg(n)) !=  phase_building) ||
1460          (get_irn_arity(n) > 0));
1461
1462   return 0;
1463 }
1464
1465 int is_Phi0 (const ir_node *n) {
1466   assert(n);
1467
1468   return ((get_irn_op(n) == op_Phi) &&
1469       (get_irn_arity(n) == 0) &&
1470       (get_irg_phase_state(get_irn_irg(n)) ==  phase_building));
1471 }
1472
1473 ir_node **
1474 get_Phi_preds_arr (ir_node *node) {
1475   assert (node->op == op_Phi);
1476   return (ir_node **)&(get_irn_in(node)[1]);
1477 }
1478
1479 int
1480 get_Phi_n_preds (ir_node *node) {
1481   assert (is_Phi(node) || is_Phi0(node));
1482   return (get_irn_arity(node));
1483 }
1484
1485 /*
1486 void set_Phi_n_preds (ir_node *node, int n_preds) {
1487   assert (node->op == op_Phi);
1488 }
1489 */
1490
1491 ir_node *
1492 get_Phi_pred (ir_node *node, int pos) {
1493   assert (is_Phi(node) || is_Phi0(node));
1494   return get_irn_n(node, pos);
1495 }
1496
1497 void
1498 set_Phi_pred (ir_node *node, int pos, ir_node *pred) {
1499   assert (is_Phi(node) || is_Phi0(node));
1500   set_irn_n(node, pos, pred);
1501 }
1502
1503
1504 int is_memop(ir_node *node) {
1505   return ((get_irn_op(node) == op_Load) || (get_irn_op(node) == op_Store));
1506 }
1507
1508 ir_node *get_memop_mem (ir_node *node) {
1509   assert(is_memop(node));
1510   return get_irn_n(node, 0);
1511 }
1512
1513 void     set_memop_mem (ir_node *node, ir_node *mem) {
1514   assert(is_memop(node));
1515   set_irn_n(node, 0, mem);
1516 }
1517
1518 ir_node *get_memop_ptr (ir_node *node) {
1519   assert(is_memop(node));
1520   return get_irn_n(node, 1);
1521 }
1522
1523 void     set_memop_ptr (ir_node *node, ir_node *ptr) {
1524   assert(is_memop(node));
1525   set_irn_n(node, 1, ptr);
1526 }
1527
1528 ir_node *
1529 get_Load_mem (ir_node *node) {
1530   assert (node->op == op_Load);
1531   return get_irn_n(node, 0);
1532 }
1533
1534 void
1535 set_Load_mem (ir_node *node, ir_node *mem) {
1536   assert (node->op == op_Load);
1537   set_irn_n(node, 0, mem);
1538 }
1539
1540 ir_node *
1541 get_Load_ptr (ir_node *node) {
1542   assert (node->op == op_Load);
1543   return get_irn_n(node, 1);
1544 }
1545
1546 void
1547 set_Load_ptr (ir_node *node, ir_node *ptr) {
1548   assert (node->op == op_Load);
1549   set_irn_n(node, 1, ptr);
1550 }
1551
1552 ir_mode *
1553 get_Load_mode (ir_node *node) {
1554   assert (node->op == op_Load);
1555   return node->attr.load.load_mode;
1556 }
1557
1558 void
1559 set_Load_mode (ir_node *node, ir_mode *mode) {
1560   assert (node->op == op_Load);
1561   node->attr.load.load_mode = mode;
1562 }
1563
1564 ent_volatility
1565 get_Load_volatility (ir_node *node) {
1566   assert (node->op == op_Load);
1567   return node->attr.load.volatility;
1568 }
1569
1570 void
1571 set_Load_volatility (ir_node *node, ent_volatility volatility) {
1572   assert (node->op == op_Load);
1573   node->attr.load.volatility = volatility;
1574 }
1575
1576
1577 ir_node *
1578 get_Store_mem (ir_node *node) {
1579   assert (node->op == op_Store);
1580   return get_irn_n(node, 0);
1581 }
1582
1583 void
1584 set_Store_mem (ir_node *node, ir_node *mem) {
1585   assert (node->op == op_Store);
1586   set_irn_n(node, 0, mem);
1587 }
1588
1589 ir_node *
1590 get_Store_ptr (ir_node *node) {
1591   assert (node->op == op_Store);
1592   return get_irn_n(node, 1);
1593 }
1594
1595 void
1596 set_Store_ptr (ir_node *node, ir_node *ptr) {
1597   assert (node->op == op_Store);
1598   set_irn_n(node, 1, ptr);
1599 }
1600
1601 ir_node *
1602 get_Store_value (ir_node *node) {
1603   assert (node->op == op_Store);
1604   return get_irn_n(node, 2);
1605 }
1606
1607 void
1608 set_Store_value (ir_node *node, ir_node *value) {
1609   assert (node->op == op_Store);
1610   set_irn_n(node, 2, value);
1611 }
1612
1613 ent_volatility
1614 get_Store_volatility (ir_node *node) {
1615   assert (node->op == op_Store);
1616   return node->attr.store.volatility;
1617 }
1618
1619 void
1620 set_Store_volatility (ir_node *node, ent_volatility volatility) {
1621   assert (node->op == op_Store);
1622   node->attr.store.volatility = volatility;
1623 }
1624
1625
1626 ir_node *
1627 get_Alloc_mem (ir_node *node) {
1628   assert (node->op == op_Alloc);
1629   return get_irn_n(node, 0);
1630 }
1631
1632 void
1633 set_Alloc_mem (ir_node *node, ir_node *mem) {
1634   assert (node->op == op_Alloc);
1635   set_irn_n(node, 0, mem);
1636 }
1637
1638 ir_node *
1639 get_Alloc_size (ir_node *node) {
1640   assert (node->op == op_Alloc);
1641   return get_irn_n(node, 1);
1642 }
1643
1644 void
1645 set_Alloc_size (ir_node *node, ir_node *size) {
1646   assert (node->op == op_Alloc);
1647   set_irn_n(node, 1, size);
1648 }
1649
1650 ir_type  *
1651 get_Alloc_type (ir_node *node) {
1652   assert (node->op == op_Alloc);
1653   return node->attr.a.type = skip_tid(node->attr.a.type);
1654 }
1655
1656 void
1657 set_Alloc_type (ir_node *node, ir_type *tp) {
1658   assert (node->op == op_Alloc);
1659   node->attr.a.type = tp;
1660 }
1661
1662 where_alloc
1663 get_Alloc_where (ir_node *node) {
1664   assert (node->op == op_Alloc);
1665   return node->attr.a.where;
1666 }
1667
1668 void
1669 set_Alloc_where (ir_node *node, where_alloc where) {
1670   assert (node->op == op_Alloc);
1671   node->attr.a.where = where;
1672 }
1673
1674
1675 ir_node *
1676 get_Free_mem (ir_node *node) {
1677   assert (node->op == op_Free);
1678   return get_irn_n(node, 0);
1679 }
1680
1681 void
1682 set_Free_mem (ir_node *node, ir_node *mem) {
1683   assert (node->op == op_Free);
1684   set_irn_n(node, 0, mem);
1685 }
1686
1687 ir_node *
1688 get_Free_ptr (ir_node *node) {
1689   assert (node->op == op_Free);
1690   return get_irn_n(node, 1);
1691 }
1692
1693 void
1694 set_Free_ptr (ir_node *node, ir_node *ptr) {
1695   assert (node->op == op_Free);
1696   set_irn_n(node, 1, ptr);
1697 }
1698
1699 ir_node *
1700 get_Free_size (ir_node *node) {
1701   assert (node->op == op_Free);
1702   return get_irn_n(node, 2);
1703 }
1704
1705 void
1706 set_Free_size (ir_node *node, ir_node *size) {
1707   assert (node->op == op_Free);
1708   set_irn_n(node, 2, size);
1709 }
1710
1711 ir_type *
1712 get_Free_type (ir_node *node) {
1713   assert (node->op == op_Free);
1714   return node->attr.f.type = skip_tid(node->attr.f.type);
1715 }
1716
1717 void
1718 set_Free_type (ir_node *node, ir_type *tp) {
1719   assert (node->op == op_Free);
1720   node->attr.f.type = tp;
1721 }
1722
1723 where_alloc
1724 get_Free_where (ir_node *node) {
1725   assert (node->op == op_Free);
1726   return node->attr.f.where;
1727 }
1728
1729 void
1730 set_Free_where (ir_node *node, where_alloc where) {
1731   assert (node->op == op_Free);
1732   node->attr.f.where = where;
1733 }
1734
1735 ir_node **
1736 get_Sync_preds_arr (ir_node *node) {
1737   assert (node->op == op_Sync);
1738   return (ir_node **)&(get_irn_in(node)[1]);
1739 }
1740
1741 int
1742 get_Sync_n_preds (ir_node *node) {
1743   assert (node->op == op_Sync);
1744   return (get_irn_arity(node));
1745 }
1746
1747 /*
1748 void
1749 set_Sync_n_preds (ir_node *node, int n_preds) {
1750   assert (node->op == op_Sync);
1751 }
1752 */
1753
1754 ir_node *
1755 get_Sync_pred (ir_node *node, int pos) {
1756   assert (node->op == op_Sync);
1757   return get_irn_n(node, pos);
1758 }
1759
1760 void
1761 set_Sync_pred (ir_node *node, int pos, ir_node *pred) {
1762   assert (node->op == op_Sync);
1763   set_irn_n(node, pos, pred);
1764 }
1765
1766 ir_type *get_Proj_type(ir_node *n)
1767 {
1768   ir_type *tp   = NULL;
1769   ir_node *pred = get_Proj_pred(n);
1770
1771   switch (get_irn_opcode(pred)) {
1772   case iro_Proj: {
1773     ir_node *pred_pred;
1774     /* Deal with Start / Call here: we need to know the Proj Nr. */
1775     assert(get_irn_mode(pred) == mode_T);
1776     pred_pred = get_Proj_pred(pred);
1777     if (get_irn_op(pred_pred) == op_Start)  {
1778       ir_type *mtp = get_entity_type(get_irg_entity(get_irn_irg(pred_pred)));
1779       tp = get_method_param_type(mtp, get_Proj_proj(n));
1780     } else if (get_irn_op(pred_pred) == op_Call) {
1781       ir_type *mtp = get_Call_type(pred_pred);
1782       tp = get_method_res_type(mtp, get_Proj_proj(n));
1783     }
1784   } break;
1785   case iro_Start: break;
1786   case iro_Call: break;
1787   case iro_Load: {
1788     ir_node *a = get_Load_ptr(pred);
1789     if (is_Sel(a))
1790       tp = get_entity_type(get_Sel_entity(a));
1791   } break;
1792   default:
1793     break;
1794   }
1795   return tp;
1796 }
1797
1798 ir_node *
1799 get_Proj_pred (const ir_node *node) {
1800   assert (is_Proj(node));
1801   return get_irn_n(node, 0);
1802 }
1803
1804 void
1805 set_Proj_pred (ir_node *node, ir_node *pred) {
1806   assert (is_Proj(node));
1807   set_irn_n(node, 0, pred);
1808 }
1809
1810 long
1811 get_Proj_proj (const ir_node *node) {
1812   assert (is_Proj(node));
1813   if (get_irn_opcode(node) == iro_Proj) {
1814     return node->attr.proj;
1815   } else {
1816     assert(get_irn_opcode(node) == iro_Filter);
1817     return node->attr.filter.proj;
1818   }
1819 }
1820
1821 void
1822 set_Proj_proj (ir_node *node, long proj) {
1823   assert (node->op == op_Proj);
1824   node->attr.proj = proj;
1825 }
1826
1827 ir_node **
1828 get_Tuple_preds_arr (ir_node *node) {
1829   assert (node->op == op_Tuple);
1830   return (ir_node **)&(get_irn_in(node)[1]);
1831 }
1832
1833 int
1834 get_Tuple_n_preds (ir_node *node) {
1835   assert (node->op == op_Tuple);
1836   return (get_irn_arity(node));
1837 }
1838
1839 /*
1840 void
1841 set_Tuple_n_preds (ir_node *node, int n_preds) {
1842   assert (node->op == op_Tuple);
1843 }
1844 */
1845
1846 ir_node *
1847 get_Tuple_pred (ir_node *node, int pos) {
1848   assert (node->op == op_Tuple);
1849   return get_irn_n(node, pos);
1850 }
1851
1852 void
1853 set_Tuple_pred (ir_node *node, int pos, ir_node *pred) {
1854   assert (node->op == op_Tuple);
1855   set_irn_n(node, pos, pred);
1856 }
1857
1858 ir_node *
1859 get_Id_pred (ir_node *node) {
1860   assert (node->op == op_Id);
1861   return get_irn_n(node, 0);
1862 }
1863
1864 void
1865 set_Id_pred (ir_node *node, ir_node *pred) {
1866   assert (node->op == op_Id);
1867   set_irn_n(node, 0, pred);
1868 }
1869
1870 ir_node *get_Confirm_value (ir_node *node) {
1871   assert (node->op == op_Confirm);
1872   return get_irn_n(node, 0);
1873 }
1874 void     set_Confirm_value (ir_node *node, ir_node *value) {
1875   assert (node->op == op_Confirm);
1876   set_irn_n(node, 0, value);
1877 }
1878 ir_node *get_Confirm_bound (ir_node *node) {
1879   assert (node->op == op_Confirm);
1880   return get_irn_n(node, 1);
1881 }
1882 void     set_Confirm_bound (ir_node *node, ir_node *bound) {
1883   assert (node->op == op_Confirm);
1884   set_irn_n(node, 0, bound);
1885 }
1886 pn_Cmp   get_Confirm_cmp   (ir_node *node) {
1887   assert (node->op == op_Confirm);
1888   return node->attr.confirm_cmp;
1889 }
1890 void     set_Confirm_cmp   (ir_node *node, pn_Cmp cmp) {
1891   assert (node->op == op_Confirm);
1892   node->attr.confirm_cmp = cmp;
1893 }
1894
1895
1896 ir_node *
1897 get_Filter_pred (ir_node *node) {
1898   assert(node->op == op_Filter);
1899   return node->in[1];
1900 }
1901 void
1902 set_Filter_pred (ir_node *node, ir_node *pred) {
1903   assert(node->op == op_Filter);
1904   node->in[1] = pred;
1905 }
1906 long
1907 get_Filter_proj(ir_node *node) {
1908   assert(node->op == op_Filter);
1909   return node->attr.filter.proj;
1910 }
1911 void
1912 set_Filter_proj (ir_node *node, long proj) {
1913   assert(node->op == op_Filter);
1914   node->attr.filter.proj = proj;
1915 }
1916
1917 /* Don't use get_irn_arity, get_irn_n in implementation as access
1918    shall work independent of view!!! */
1919 void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in) {
1920   assert(node->op == op_Filter);
1921   if (node->attr.filter.in_cg == NULL || arity != ARR_LEN(node->attr.filter.in_cg) - 1) {
1922     node->attr.filter.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
1923     node->attr.filter.backedge = NEW_ARR_D (int, current_ir_graph->obst, arity);
1924     memset(node->attr.filter.backedge, 0, sizeof(int) * arity);
1925     node->attr.filter.in_cg[0] = node->in[0];
1926   }
1927   memcpy(node->attr.filter.in_cg + 1, in, sizeof(ir_node *) * arity);
1928 }
1929
1930 void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred) {
1931   assert(node->op == op_Filter && node->attr.filter.in_cg &&
1932      0 <= pos && pos < ARR_LEN(node->attr.filter.in_cg) - 1);
1933   node->attr.filter.in_cg[pos + 1] = pred;
1934 }
1935 int get_Filter_n_cg_preds(ir_node *node) {
1936   assert(node->op == op_Filter && node->attr.filter.in_cg);
1937   return (ARR_LEN(node->attr.filter.in_cg) - 1);
1938 }
1939 ir_node *get_Filter_cg_pred(ir_node *node, int pos) {
1940   int arity;
1941   assert(node->op == op_Filter && node->attr.filter.in_cg &&
1942      0 <= pos);
1943   arity = ARR_LEN(node->attr.filter.in_cg);
1944   assert(pos <  arity - 1);
1945   return node->attr.filter.in_cg[pos + 1];
1946 }
1947
1948 /* Mux support */
1949 ir_node *get_Mux_sel   (ir_node *node) {
1950   if (node->op == op_Psi) {
1951     assert(get_irn_arity(node) == 3);
1952     return get_Psi_cond(node, 0);
1953   }
1954   assert(node->op == op_Mux);
1955   return node->in[1];
1956 }
1957 void     set_Mux_sel   (ir_node *node, ir_node *sel) {
1958   if (node->op == op_Psi) {
1959     assert(get_irn_arity(node) == 3);
1960     set_Psi_cond(node, 0, sel);
1961   }
1962   else {
1963     assert(node->op == op_Mux);
1964     node->in[1] = sel;
1965   }
1966 }
1967
1968 ir_node *get_Mux_false (ir_node *node) {
1969   if (node->op == op_Psi) {
1970     assert(get_irn_arity(node) == 3);
1971     return get_Psi_default(node);
1972   }
1973   assert(node->op == op_Mux);
1974   return node->in[2];
1975 }
1976 void     set_Mux_false (ir_node *node, ir_node *ir_false) {
1977   if (node->op == op_Psi) {
1978     assert(get_irn_arity(node) == 3);
1979     set_Psi_default(node, ir_false);
1980   }
1981   else {
1982     assert(node->op == op_Mux);
1983     node->in[2] = ir_false;
1984   }
1985 }
1986
1987 ir_node *get_Mux_true  (ir_node *node) {
1988   if (node->op == op_Psi) {
1989     assert(get_irn_arity(node) == 3);
1990     return get_Psi_val(node, 0);
1991   }
1992   assert(node->op == op_Mux);
1993   return node->in[3];
1994 }
1995 void     set_Mux_true  (ir_node *node, ir_node *ir_true) {
1996   if (node->op == op_Psi) {
1997     assert(get_irn_arity(node) == 3);
1998     set_Psi_val(node, 0, ir_true);
1999   }
2000   else {
2001     assert(node->op == op_Mux);
2002     node->in[3] = ir_true;
2003   }
2004 }
2005
2006 /* Psi support */
2007 ir_node *get_Psi_cond   (ir_node *node, int pos) {
2008   int num_conds = get_Psi_n_conds(node);
2009   assert(node->op == op_Psi);
2010   assert(pos < num_conds);
2011   return node->in[1 + 2 * pos];
2012 }
2013
2014 void     set_Psi_cond   (ir_node *node, int pos, ir_node *cond) {
2015   int num_conds = get_Psi_n_conds(node);
2016   assert(node->op == op_Psi);
2017   assert(pos < num_conds);
2018   node->in[1 + 2 * pos] = cond;
2019 }
2020
2021 ir_node *get_Psi_val    (ir_node *node, int pos) {
2022   int num_vals = get_Psi_n_conds(node);
2023   assert(node->op == op_Psi);
2024   assert(pos < num_vals);
2025   return node->in[1 + 2 * pos + 1];
2026 }
2027
2028 void     set_Psi_val    (ir_node *node, int pos, ir_node *val) {
2029   int num_vals = get_Psi_n_conds(node);
2030   assert(node->op == op_Psi);
2031   assert(pos < num_vals);
2032   node->in[1 + 2 * pos + 1] = val;
2033 }
2034
2035 ir_node *get_Psi_default(ir_node *node) {
2036   int def_pos = get_irn_arity(node);
2037   assert(node->op == op_Psi);
2038   return node->in[def_pos];
2039 }
2040
2041 void     set_Psi_default(ir_node *node, ir_node *val) {
2042   int def_pos = get_irn_arity(node);
2043   assert(node->op == op_Psi);
2044   node->in[def_pos] = node;
2045 }
2046
2047 int (get_Psi_n_conds)(ir_node *node) {
2048   return _get_Psi_n_conds(node);
2049 }
2050
2051 /* CopyB support */
2052 ir_node *get_CopyB_mem (ir_node *node) {
2053   assert (node->op == op_CopyB);
2054   return get_irn_n(node, 0);
2055 }
2056
2057 void     set_CopyB_mem (ir_node *node, ir_node *mem) {
2058   assert (node->op == op_CopyB);
2059   set_irn_n(node, 0, mem);
2060 }
2061
2062 ir_node *get_CopyB_dst (ir_node *node) {
2063   assert (node->op == op_CopyB);
2064   return get_irn_n(node, 1);
2065 }
2066
2067 void     set_CopyB_dst (ir_node *node, ir_node *dst) {
2068   assert (node->op == op_CopyB);
2069   set_irn_n(node, 1, dst);
2070 }
2071
2072 ir_node *get_CopyB_src (ir_node *node) {
2073   assert (node->op == op_CopyB);
2074   return get_irn_n(node, 2);
2075 }
2076
2077 void     set_CopyB_src (ir_node *node, ir_node *src) {
2078   assert (node->op == op_CopyB);
2079   set_irn_n(node, 2, src);
2080 }
2081
2082 ir_type *get_CopyB_type(ir_node *node) {
2083   assert (node->op == op_CopyB);
2084   return node->attr.copyb.data_type;
2085 }
2086
2087 void     set_CopyB_type(ir_node *node, ir_type *data_type) {
2088   assert (node->op == op_CopyB && data_type);
2089   node->attr.copyb.data_type = data_type;
2090 }
2091
2092
2093 ir_type *
2094 get_InstOf_type (ir_node *node) {
2095   assert (node->op = op_InstOf);
2096   return node->attr.io.type;
2097 }
2098
2099 void
2100 set_InstOf_type (ir_node *node, ir_type *type) {
2101   assert (node->op = op_InstOf);
2102   node->attr.io.type = type;
2103 }
2104
2105 ir_node *
2106 get_InstOf_store (ir_node *node) {
2107   assert (node->op = op_InstOf);
2108   return get_irn_n(node, 0);
2109 }
2110
2111 void
2112 set_InstOf_store (ir_node *node, ir_node *obj) {
2113   assert (node->op = op_InstOf);
2114   set_irn_n(node, 0, obj);
2115 }
2116
2117 ir_node *
2118 get_InstOf_obj (ir_node *node) {
2119   assert (node->op = op_InstOf);
2120   return get_irn_n(node, 1);
2121 }
2122
2123 void
2124 set_InstOf_obj (ir_node *node, ir_node *obj) {
2125   assert (node->op = op_InstOf);
2126   set_irn_n(node, 1, obj);
2127 }
2128
2129 /* Returns the memory input of a Raise operation. */
2130 ir_node *
2131 get_Raise_mem (ir_node *node) {
2132   assert (node->op == op_Raise);
2133   return get_irn_n(node, 0);
2134 }
2135
2136 void
2137 set_Raise_mem (ir_node *node, ir_node *mem) {
2138   assert (node->op == op_Raise);
2139   set_irn_n(node, 0, mem);
2140 }
2141
2142 ir_node *
2143 get_Raise_exo_ptr (ir_node *node) {
2144   assert (node->op == op_Raise);
2145   return get_irn_n(node, 1);
2146 }
2147
2148 void
2149 set_Raise_exo_ptr (ir_node *node, ir_node *exo_ptr) {
2150   assert (node->op == op_Raise);
2151   set_irn_n(node, 1, exo_ptr);
2152 }
2153
2154 /* Bound support */
2155
2156 /* Returns the memory input of a Bound operation. */
2157 ir_node *get_Bound_mem(ir_node *bound) {
2158   assert (bound->op == op_Bound);
2159   return get_irn_n(bound, 0);
2160 }
2161
2162 void     set_Bound_mem (ir_node *bound, ir_node *mem) {
2163   assert (bound->op == op_Bound);
2164   set_irn_n(bound, 0, mem);
2165 }
2166
2167 /* Returns the index input of a Bound operation. */
2168 ir_node *get_Bound_index(ir_node *bound) {
2169   assert (bound->op == op_Bound);
2170   return get_irn_n(bound, 1);
2171 }
2172
2173 void     set_Bound_index(ir_node *bound, ir_node *idx) {
2174   assert (bound->op == op_Bound);
2175   set_irn_n(bound, 1, idx);
2176 }
2177
2178 /* Returns the lower bound input of a Bound operation. */
2179 ir_node *get_Bound_lower(ir_node *bound) {
2180   assert (bound->op == op_Bound);
2181   return get_irn_n(bound, 2);
2182 }
2183
2184 void     set_Bound_lower(ir_node *bound, ir_node *lower) {
2185   assert (bound->op == op_Bound);
2186   set_irn_n(bound, 2, lower);
2187 }
2188
2189 /* Returns the upper bound input of a Bound operation. */
2190 ir_node *get_Bound_upper(ir_node *bound) {
2191   assert (bound->op == op_Bound);
2192   return get_irn_n(bound, 3);
2193 }
2194
2195 void     set_Bound_upper(ir_node *bound, ir_node *upper) {
2196   assert (bound->op == op_Bound);
2197   set_irn_n(bound, 3, upper);
2198 }
2199
2200 /* returns the graph of a node */
2201 ir_graph *
2202 get_irn_irg(const ir_node *node) {
2203         /*
2204          * Do not use get_nodes_Block() here, because this
2205          * will check the pinned state.
2206          * However even a 'wrong' block is always in the proper
2207          * irg.
2208          */
2209   if (! is_Block(node))
2210     node = get_irn_n(node, -1);
2211   if (is_Bad(node))  /* sometimes bad is predecessor of nodes instead of block: in case of optimization */
2212     node = get_irn_n(node, -1);
2213   assert(get_irn_op(node) == op_Block);
2214   return node->attr.block.irg;
2215 }
2216
2217
2218 /*----------------------------------------------------------------*/
2219 /*  Auxiliary routines                                            */
2220 /*----------------------------------------------------------------*/
2221
2222 ir_node *
2223 skip_Proj (ir_node *node) {
2224   /* don't assert node !!! */
2225   if (node && is_Proj(node)) {
2226     return get_Proj_pred(node);
2227   } else {
2228     return node;
2229   }
2230 }
2231
2232 ir_node *
2233 skip_Tuple (ir_node *node) {
2234   ir_node *pred;
2235   ir_op   *op;
2236
2237   if (!get_opt_normalize()) return node;
2238
2239 restart:
2240   node = skip_Id(node);
2241   if (get_irn_op(node) == op_Proj) {
2242     pred = skip_Id(get_Proj_pred(node));
2243     op   = get_irn_op(pred);
2244
2245     /*
2246      * Looks strange but calls get_irn_op() only once
2247      * in most often cases.
2248      */
2249     if (op == op_Proj) { /* nested Tuple ? */
2250       pred = skip_Id(skip_Tuple(pred));
2251       op   = get_irn_op(pred);
2252
2253       if (op == op_Tuple) {
2254         node = get_Tuple_pred(pred, get_Proj_proj(node));
2255         goto restart;
2256       }
2257     }
2258     else if (op == op_Tuple) {
2259       node = get_Tuple_pred(pred, get_Proj_proj(node));
2260       goto restart;
2261     }
2262   }
2263   return node;
2264 }
2265
2266 /* returns operand of node if node is a Cast */
2267 ir_node *skip_Cast  (ir_node *node) {
2268   if (node && get_irn_op(node) == op_Cast)
2269     return get_Cast_op(node);
2270   return node;
2271 }
2272
2273 /* returns operand of node if node is a Confirm */
2274 ir_node *skip_Confirm  (ir_node *node) {
2275   if (node && get_irn_op(node) == op_Confirm)
2276     return get_Confirm_value(node);
2277   return node;
2278 }
2279
2280 /* skip all high-level ops */
2281 ir_node *skip_HighLevel(ir_node *node) {
2282   if (node && is_op_highlevel(get_irn_op(node)))
2283     return get_irn_n(node, 0);
2284   return node;
2285 }
2286
2287 #if 0
2288 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2289  * than any other approach, as Id chains are resolved and all point to the real node, or
2290  * all id's are self loops.
2291  *
2292  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2293  */
2294 ir_node *
2295 skip_Id (ir_node *node) {
2296   /* don't assert node !!! */
2297
2298   /* Don't use get_Id_pred:  We get into an endless loop for
2299      self-referencing Ids. */
2300   if (node && (node->op == op_Id) && (node != node->in[0+1])) {
2301     ir_node *rem_pred = node->in[0+1];
2302     ir_node *res;
2303
2304     assert (get_irn_arity (node) > 0);
2305
2306     node->in[0+1] = node;
2307     res = skip_Id(rem_pred);
2308     if (res->op == op_Id) /* self-loop */ return node;
2309
2310     node->in[0+1] = res;
2311     return res;
2312   } else {
2313     return node;
2314   }
2315 }
2316 #else
2317 /* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
2318  * than any other approach, as Id chains are resolved and all point to the real node, or
2319  * all id's are self loops.
2320  *
2321  * Note: This function takes 10% of mostly ANY the compiler run, so it's
2322  * a little bit "hand optimized".
2323  *
2324  * Moreover, it CANNOT be switched off using get_opt_normalize() ...
2325  */
2326 ir_node *
2327 skip_Id (ir_node *node) {
2328   ir_node *pred;
2329   /* don't assert node !!! */
2330
2331   if (!node || (node->op != op_Id)) return node;
2332
2333   /* Don't use get_Id_pred():  We get into an endless loop for
2334      self-referencing Ids. */
2335   pred = node->in[0+1];
2336
2337   if (pred->op != op_Id) return pred;
2338
2339   if (node != pred) {  /* not a self referencing Id. Resolve Id chain. */
2340     ir_node *rem_pred, *res;
2341
2342     if (pred->op != op_Id) return pred; /* shortcut */
2343     rem_pred = pred;
2344
2345     assert (get_irn_arity (node) > 0);
2346
2347     node->in[0+1] = node;   /* turn us into a self referencing Id:  shorten Id cycles. */
2348     res = skip_Id(rem_pred);
2349     if (res->op == op_Id) /* self-loop */ return node;
2350
2351     node->in[0+1] = res;    /* Turn Id chain into Ids all referencing the chain end. */
2352     return res;
2353   } else {
2354     return node;
2355   }
2356 }
2357 #endif
2358
2359 void skip_Id_and_store(ir_node **node) {
2360   ir_node *n = *node;
2361
2362   if (!n || (n->op != op_Id)) return;
2363
2364   /* Don't use get_Id_pred():  We get into an endless loop for
2365      self-referencing Ids. */
2366   *node = skip_Id(n);
2367 }
2368
2369 int
2370 (is_Bad)(const ir_node *node) {
2371   return _is_Bad(node);
2372 }
2373
2374 int
2375 (is_Const)(const ir_node *node) {
2376         return _is_Const(node);
2377 }
2378
2379 int
2380 (is_no_Block)(const ir_node *node) {
2381   return _is_no_Block(node);
2382 }
2383
2384 int
2385 (is_Block)(const ir_node *node) {
2386   return _is_Block(node);
2387 }
2388
2389 /* returns true if node is an Unknown node. */
2390 int
2391 (is_Unknown)(const ir_node *node) {
2392   return _is_Unknown(node);
2393 }
2394
2395 /* returns true if node is a Return node. */
2396 int
2397 (is_Return)(const ir_node *node) {
2398   return _is_Return(node);
2399 }
2400
2401 /* returns true if node is a Call node. */
2402 int
2403 (is_Call)(const ir_node *node) {
2404   return _is_Call(node);
2405 }
2406
2407 /* returns true if node is a Sel node. */
2408 int
2409 (is_Sel)(const ir_node *node) {
2410   return _is_Sel(node);
2411 }
2412
2413 /* returns true if node is a Mux node or a Psi with only one condition. */
2414 int
2415 (is_Mux)(const ir_node *node) {
2416   return _is_Mux(node);
2417 }
2418
2419 int
2420 is_Proj (const ir_node *node) {
2421   assert(node);
2422   return node->op == op_Proj
2423     || (!get_interprocedural_view() && node->op == op_Filter);
2424 }
2425
2426 /* Returns true if the operation manipulates control flow. */
2427 int
2428 is_cfop(const ir_node *node) {
2429   return is_cfopcode(get_irn_op(node));
2430 }
2431
2432 /* Returns true if the operation manipulates interprocedural control flow:
2433    CallBegin, EndReg, EndExcept */
2434 int is_ip_cfop(const ir_node *node) {
2435   return is_ip_cfopcode(get_irn_op(node));
2436 }
2437
2438 /* Returns true if the operation can change the control flow because
2439    of an exception. */
2440 int
2441 is_fragile_op(const ir_node *node) {
2442   return is_op_fragile(get_irn_op(node));
2443 }
2444
2445 /* Returns the memory operand of fragile operations. */
2446 ir_node *get_fragile_op_mem(ir_node *node) {
2447   assert(node && is_fragile_op(node));
2448
2449   switch (get_irn_opcode (node)) {
2450   case iro_Call  :
2451   case iro_Quot  :
2452   case iro_DivMod:
2453   case iro_Div   :
2454   case iro_Mod   :
2455   case iro_Load  :
2456   case iro_Store :
2457   case iro_Alloc :
2458     return get_irn_n(node, 0);
2459   case iro_Bad   :
2460   case iro_Unknown:
2461     return node;
2462   default: ;
2463     assert(0 && "should not be reached");
2464     return NULL;
2465   }
2466 }
2467
2468 /* Returns true if the operation is a forking control flow operation. */
2469 int (is_irn_forking)(const ir_node *node) {
2470   return _is_irn_forking(node);
2471 }
2472
2473 /* Return the type associated with the value produced by n
2474  * if the node remarks this type as it is the case for
2475  * Cast, Const, SymConst and some Proj nodes. */
2476 ir_type *(get_irn_type)(ir_node *node) {
2477   return _get_irn_type(node);
2478 }
2479
2480 /* Return the type attribute of a node n (SymConst, Call, Alloc, Free,
2481    Cast) or NULL.*/
2482 ir_type *(get_irn_type_attr)(ir_node *node) {
2483   return _get_irn_type_attr(node);
2484 }
2485
2486 /* Return the entity attribute of a node n (SymConst, Sel) or NULL. */
2487 entity *(get_irn_entity_attr)(ir_node *node) {
2488   return _get_irn_entity_attr(node);
2489 }
2490
2491 /* Returns non-zero for constant-like nodes. */
2492 int (is_irn_constlike)(const ir_node *node) {
2493   return _is_irn_constlike(node);
2494 }
2495
2496 /*
2497  * Returns non-zero for nodes that are allowed to have keep-alives and
2498  * are neither Block nor PhiM.
2499  */
2500 int (is_irn_keep)(const ir_node *node) {
2501   return _is_irn_keep(node);
2502 }
2503
2504 /* Gets the string representation of the jump prediction .*/
2505 const char *get_cond_jmp_predicate_name(cond_jmp_predicate pred)
2506 {
2507   switch (pred) {
2508   default:
2509   case COND_JMP_PRED_NONE:  return "no prediction";
2510   case COND_JMP_PRED_TRUE:  return "true taken";
2511   case COND_JMP_PRED_FALSE: return "false taken";
2512   }
2513 }
2514
2515 /* Returns the conditional jump prediction of a Cond node. */
2516 cond_jmp_predicate (get_Cond_jmp_pred)(ir_node *cond) {
2517   return _get_Cond_jmp_pred(cond);
2518 }
2519
2520 /* Sets a new conditional jump prediction. */
2521 void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) {
2522   _set_Cond_jmp_pred(cond, pred);
2523 }
2524
2525 /** the get_type operation must be always implemented and return a firm type */
2526 static ir_type *get_Default_type(ir_node *n) {
2527   return get_unknown_type();
2528 }
2529
2530 /* Sets the get_type operation for an ir_op_ops. */
2531 ir_op_ops *firm_set_default_get_type(opcode code, ir_op_ops *ops)
2532 {
2533   switch (code) {
2534   case iro_Const:    ops->get_type = get_Const_type; break;
2535   case iro_SymConst: ops->get_type = get_SymConst_value_type; break;
2536   case iro_Cast:     ops->get_type = get_Cast_type; break;
2537   case iro_Proj:     ops->get_type = get_Proj_type; break;
2538   default:
2539     /* not allowed to be NULL */
2540     if (! ops->get_type)
2541       ops->get_type = get_Default_type;
2542     break;
2543   }
2544   return ops;
2545 }
2546
2547 /** Return the attribute type of a SymConst node if exists */
2548 static ir_type *get_SymConst_attr_type(ir_node *self) {
2549   symconst_kind kind = get_SymConst_kind(self);
2550   if (kind == symconst_type_tag || kind == symconst_size)
2551     return get_SymConst_type(self);
2552   return NULL;
2553 }
2554
2555 /** Return the attribute entity of a SymConst node if exists */
2556 static entity *get_SymConst_attr_entity(ir_node *self) {
2557   symconst_kind kind = get_SymConst_kind(self);
2558   if (kind == symconst_addr_ent)
2559     return get_SymConst_entity(self);
2560   return NULL;
2561 }
2562
2563 /** the get_type_attr operation must be always implemented */
2564 static ir_type *get_Null_type(ir_node *n) {
2565   return firm_unknown_type;
2566 }
2567
2568 /* Sets the get_type operation for an ir_op_ops. */
2569 ir_op_ops *firm_set_default_get_type_attr(opcode code, ir_op_ops *ops)
2570 {
2571   switch (code) {
2572   case iro_SymConst: ops->get_type_attr = get_SymConst_attr_type; break;
2573   case iro_Call:     ops->get_type_attr = get_Call_type; break;
2574   case iro_Alloc:    ops->get_type_attr = get_Alloc_type; break;
2575   case iro_Free:     ops->get_type_attr = get_Free_type; break;
2576   case iro_Cast:     ops->get_type_attr = get_Cast_type; break;
2577   default:
2578     /* not allowed to be NULL */
2579     if (! ops->get_type_attr)
2580       ops->get_type_attr = get_Null_type;
2581     break;
2582   }
2583   return ops;
2584 }
2585
2586 /** the get_entity_attr operation must be always implemented */
2587 static entity *get_Null_ent(ir_node *n) {
2588   return NULL;
2589 }
2590
2591 /* Sets the get_type operation for an ir_op_ops. */
2592 ir_op_ops *firm_set_default_get_entity_attr(opcode code, ir_op_ops *ops)
2593 {
2594   switch (code) {
2595   case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break;
2596   case iro_Sel:      ops->get_entity_attr = get_Sel_entity; break;
2597   default:
2598     /* not allowed to be NULL */
2599     if (! ops->get_entity_attr)
2600       ops->get_entity_attr = get_Null_ent;
2601     break;
2602   }
2603   return ops;
2604 }
2605
2606 #ifdef DEBUG_libfirm
2607 void dump_irn (ir_node *n) {
2608   int i, arity = get_irn_arity(n);
2609   printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n);
2610   if (!is_Block(n)) {
2611     ir_node *pred = get_irn_n(n, -1);
2612     printf("  block: %s%s: %ld (%p)\n", get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2613        get_irn_node_nr(pred), (void *)pred);
2614   }
2615   printf("  preds: \n");
2616   for (i = 0; i < arity; ++i) {
2617     ir_node *pred = get_irn_n(n, i);
2618     printf("    %d: %s%s: %ld (%p)\n", i, get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
2619        get_irn_node_nr(pred), (void *)pred);
2620   }
2621 }
2622
2623 #else  /* DEBUG_libfirm */
2624 void dump_irn (ir_node *n) {}
2625 #endif /* DEBUG_libfirm */