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