1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
6 ** ircons.c: basic and more detailed irnode constructors
7 ** store, block and parameter administration ,
8 ** Adapted to extended FIRM nodes (exceptions...) and commented
9 ** by Goetz Lindenmaier
15 /* memset belongs to string.h */
19 /* irnode constructor */
20 /* create a new irnode in irg, with an op, mode, arity and */
21 /* some incoming irnodes */
22 /* this constructor is used in every specified irnode constructor */
24 new_ir_node (ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode,
25 int arity, ir_node **in)
28 int node_size = offsetof (ir_node, attr) + op->attr_size;
30 res = (ir_node *) obstack_alloc (irg->obst, node_size);
32 res->kind = k_ir_node;
38 res->in = NEW_ARR_F (ir_node *, 1);
40 res->in = NEW_ARR_D (ir_node *, irg->obst, (arity+1));
41 memcpy (&res->in[1], in, sizeof (ir_node *) * arity);
50 /*********************************************** */
51 /** privat interfaces, for professional use only */
53 /* Creates a Phi node with 0 predecessors */
55 new_r_Phi0 (ir_graph *irg, ir_node *block, ir_mode *mode)
59 res = new_ir_node (irg, block, op_Phi, mode, 0, NULL);
61 /* GL I'm not sure whether we should optimize this guy. *
62 res = optimize (res); ??? */
67 /* Creates a Phi node with all predecessors. Calling this constructor
68 is only allowed if the corresponding block is mature. */
70 new_r_Phi (ir_graph *irg, ir_node *block, int arity, ir_node **in, ir_mode *mode)
74 assert( get_Block_matured(block) );
75 assert( get_irn_arity(block) == arity );
77 res = new_ir_node (irg, block, op_Phi, mode, arity, in);
84 /* This is a stack used for allocating and deallocating nodes in
85 new_r_Phi_in. The original implementation used the obstack
86 to model this stack, now it is explicit. This reduces side effects.
88 #if USE_EXPICIT_PHI_IN_STACK
93 res = (Phi_in_stack *) malloc ( sizeof (Phi_in_stack));
95 res->stack = NEW_ARR_F (ir_node *, 1);
102 void free_to_Phi_in_stack(ir_node *phi) {
103 assert(get_irn_opcode(phi) == iro_Phi);
105 if (ARR_LEN(current_ir_graph->Phi_in_stack->stack) ==
106 current_ir_graph->Phi_in_stack->pos)
107 ARR_APP1 (ir_node *, current_ir_graph->Phi_in_stack->stack, phi);
109 current_ir_graph->Phi_in_stack->stack[current_ir_graph->Phi_in_stack->pos] = phi;
111 (current_ir_graph->Phi_in_stack->pos)++;
115 alloc_or_pop_from_Phi_in_stack(ir_graph *irg, ir_node *block, ir_mode *mode,
116 int arity, ir_node **in) {
118 ir_node **stack = current_ir_graph->Phi_in_stack->stack;
119 int pos = current_ir_graph->Phi_in_stack->pos;
123 /* We need to allocate a new node */
124 res = new_ir_node (irg, block, op_Phi, mode, arity, in);
126 /* reuse the old node and initialize it again. */
129 assert (res->kind == k_ir_node);
130 assert (res->op == op_Phi);
135 /* ???!!! How to free the old in array?? */
136 res->in = NEW_ARR_D (ir_node *, irg->obst, (arity+1));
138 memcpy (&res->in[1], in, sizeof (ir_node *) * arity);
140 (current_ir_graph->Phi_in_stack->pos)--;
148 /* Creates a Phi node with a given, fixed array **in of predecessors.
149 If the Phi node is unnecessary, as the same value reaches the block
150 through all control flow paths, it is eliminated and the value
151 returned directly. This constructor is only intended for use in
152 the automatic Phi node generation triggered by get_value or mature.
153 The implementation is quite tricky and depends on the fact, that
154 the nodes are allocated on a stack:
155 The in array contains predecessors and NULLs. The NULLs appear,
156 if get_r_value_internal, that computed the predecessors, reached
157 the same block on two paths. In this case the same value reaches
158 this block on both paths, there is no definition in between. We need
159 not allocate a Phi where these path's merge, but we have to communicate
160 this fact to the caller. This happens by returning a pointer to the
161 node the caller _will_ allocate. (Yes, we predict the address. We can
162 do so because the nodes are allocated on the obstack.) The caller then
163 finds a pointer to itself and, when this routine is called again,
167 new_r_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode,
168 ir_node **in, int ins)
171 ir_node *res, *known;
173 /* allocate a new node on the obstack.
174 This can return a node to which some of the pointers in the in-array
176 Attention: the constructor copies the in array, i.e., the later changes
177 to the array in this routine do not affect the constructed node! If
178 the in array contains NULLs, there will be missing predecessors in the
180 Is this a possible internal state of the Phi node generation? */
181 #if USE_EXPICIT_PHI_IN_STACK
182 res = known = alloc_or_pop_from_Phi_in_stack(irg, block, mode, ins, in);
184 res = known = new_ir_node (irg, block, op_Phi, mode, ins, in);
186 /* The in-array can contain NULLs. These were returned by get_r_value_internal
187 if it reached the same block/definition on a second path.
188 The NULLs are replaced by the node itself to simplify the test in the
190 for (i=0; i < ins; ++i)
191 if (in[i] == NULL) in[i] = res;
193 /* This loop checks whether the Phi has more than one predecessor.
194 If so, it is a real Phi node and we break the loop. Else the
195 Phi node merges the same definition on several paths and therefore
197 for (i=0; i < ins; ++i)
199 if (in[i]==res || in[i]==known) continue;
207 /* i==ins: there is at most one predecessor, we don't need a phi node. */
209 #if USE_EXPICIT_PHI_IN_STACK
210 free_to_Phi_in_stack(res);
212 obstack_free (current_ir_graph->obst, res);
216 res = optimize (res);
220 /* return the pointer to the Phi node. This node might be deallocated! */
225 new_r_Const (ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con)
228 res = new_ir_node (irg, block, op_Const, mode, 0, NULL);
230 res = optimize (res);
234 res = local_optimize_newby (res);
241 new_r_Id (ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode)
243 ir_node *in[1] = {val};
245 res = new_ir_node (irg, block, op_Id, mode, 1, in);
246 res = optimize (res);
252 new_r_Proj (ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode, long proj)
254 ir_node *in[1] = {arg};
256 res = new_ir_node (irg, block, op_Proj, mode, 1, in);
257 res->attr.proj = proj;
258 res = optimize (res);
265 new_r_Conv (ir_graph *irg, ir_node *block, ir_node *op, ir_mode *mode)
267 ir_node *in[1] = {op};
269 res = new_ir_node (irg, block, op_Conv, mode, 1, in);
270 res = optimize (res);
277 new_r_Tuple (ir_graph *irg, ir_node *block, int arity, ir_node **in)
281 res = new_ir_node (irg, block, op_Tuple, mode_T, arity, in);
282 res = optimize (res);
288 new_r_Add (ir_graph *irg, ir_node *block,
289 ir_node *op1, ir_node *op2, ir_mode *mode)
291 ir_node *in[2] = {op1, op2};
293 res = new_ir_node (irg, block, op_Add, mode, 2, in);
294 res = optimize (res);
300 new_r_Sub (ir_graph *irg, ir_node *block,
301 ir_node *op1, ir_node *op2, ir_mode *mode)
303 ir_node *in[2] = {op1, op2};
305 res = new_ir_node (irg, block, op_Sub, mode, 2, in);
306 res = optimize (res);
312 new_r_Minus (ir_graph *irg, ir_node *block,
313 ir_node *op, ir_mode *mode)
315 ir_node *in[1] = {op};
317 res = new_ir_node (irg, block, op_Minus, mode, 1, in);
318 res = optimize (res);
324 new_r_Mul (ir_graph *irg, ir_node *block,
325 ir_node *op1, ir_node *op2, ir_mode *mode)
327 ir_node *in[2] = {op1, op2};
329 res = new_ir_node (irg, block, op_Mul, mode, 2, in);
330 res = optimize (res);
336 new_r_Quot (ir_graph *irg, ir_node *block,
337 ir_node *memop, ir_node *op1, ir_node *op2)
339 ir_node *in[3] = {memop, op1, op2};
341 res = new_ir_node (irg, block, op_Quot, mode_T, 2, in);
342 res = optimize (res);
348 new_r_DivMod (ir_graph *irg, ir_node *block,
349 ir_node *memop, ir_node *op1, ir_node *op2)
351 ir_node *in[3] = {memop, op1, op2};
353 res = new_ir_node (irg, block, op_DivMod, mode_T, 2, in);
354 res = optimize (res);
360 new_r_Div (ir_graph *irg, ir_node *block,
361 ir_node *memop, ir_node *op1, ir_node *op2)
363 ir_node *in[3] = {memop, op1, op2};
365 res = new_ir_node (irg, block, op_Div, mode_T, 2, in);
366 res = optimize (res);
372 new_r_Mod (ir_graph *irg, ir_node *block,
373 ir_node *memop, ir_node *op1, ir_node *op2)
375 ir_node *in[3] = {memop, op1, op2};
377 res = new_ir_node (irg, block, op_Mod, mode_T, 2, in);
378 res = optimize (res);
384 new_r_And (ir_graph *irg, ir_node *block,
385 ir_node *op1, ir_node *op2, ir_mode *mode)
387 ir_node *in[2] = {op1, op2};
389 res = new_ir_node (irg, block, op_And, mode, 2, in);
390 res = optimize (res);
396 new_r_Or (ir_graph *irg, ir_node *block,
397 ir_node *op1, ir_node *op2, ir_mode *mode)
399 ir_node *in[2] = {op1, op2};
401 res = new_ir_node (irg, block, op_Or, mode, 2, in);
402 res = optimize (res);
408 new_r_Eor (ir_graph *irg, ir_node *block,
409 ir_node *op1, ir_node *op2, ir_mode *mode)
411 ir_node *in[2] = {op1, op2};
413 res = new_ir_node (irg, block, op_Eor, mode, 2, in);
414 res = optimize (res);
420 new_r_Not (ir_graph *irg, ir_node *block,
421 ir_node *op, ir_mode *mode)
423 ir_node *in[1] = {op};
425 res = new_ir_node (irg, block, op_Not, mode, 1, in);
426 res = optimize (res);
432 new_r_Shl (ir_graph *irg, ir_node *block,
433 ir_node *op, ir_node *k, ir_mode *mode)
435 ir_node *in[2] = {op, k};
437 res = new_ir_node (irg, block, op_Shl, mode, 2, in);
438 res = optimize (res);
444 new_r_Shr (ir_graph *irg, ir_node *block,
445 ir_node *op, ir_node *k, ir_mode *mode)
447 ir_node *in[2] = {op, k};
449 res = new_ir_node (irg, block, op_Shr, mode, 2, in);
450 res = optimize (res);
456 new_r_Shrs (ir_graph *irg, ir_node *block,
457 ir_node *op, ir_node *k, ir_mode *mode)
459 ir_node *in[2] = {op, k};
461 res = new_ir_node (irg, block, op_Shrs, mode, 2, in);
462 res = optimize (res);
468 new_r_Rot (ir_graph *irg, ir_node *block,
469 ir_node *op, ir_node *k, ir_mode *mode)
471 ir_node *in[2] = {op, k};
473 res = new_ir_node (irg, block, op_Rot, mode, 2, in);
474 res = optimize (res);
480 new_r_Abs (ir_graph *irg, ir_node *block,
481 ir_node *op, ir_mode *mode)
483 ir_node *in[1] = {op};
485 res = new_ir_node (irg, block, op_Abs, mode, 1, in);
486 res = optimize (res);
492 new_r_Cmp (ir_graph *irg, ir_node *block,
493 ir_node *op1, ir_node *op2)
495 ir_node *in[2] = {op1, op2};
497 res = new_ir_node (irg, block, op_Cmp, mode_T, 2, in);
498 res = optimize (res);
504 new_r_Jmp (ir_graph *irg, ir_node *block)
508 res = new_ir_node (irg, block, op_Jmp, mode_X, 0, in);
509 res = optimize (res);
515 new_r_Cond (ir_graph *irg, ir_node *block, ir_node *c)
517 ir_node *in[1] = {c};
519 res = new_ir_node (irg, block, op_Cond, mode_T, 1, in);
520 res = optimize (res);
526 new_r_Call (ir_graph *irg, ir_node *block, ir_node *store,
527 ir_node *callee, int arity, ir_node **in, type_method *type)
534 NEW_ARR_A (ir_node *, r_in, r_arity);
537 memcpy (&r_in[2], in, sizeof (ir_node *) * arity);
539 res = new_ir_node (irg, block, op_Call, mode_T, r_arity, r_in);
541 set_Call_type(res, type);
542 res = optimize (res);
548 new_r_Return (ir_graph *irg, ir_node *block,
549 ir_node *store, int arity, ir_node **in)
557 NEW_ARR_A (ir_node *, r_in, r_arity);
561 memcpy (&r_in[1], in, sizeof (ir_node *) * arity);
563 res = new_ir_node (irg, block, op_Return, mode_X, r_arity, r_in);
565 res = optimize (res);
572 new_r_Raise (ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
574 ir_node *in[2] = {store, obj};
576 res = new_ir_node (irg, block, op_Raise, mode_X, 2, in);
578 res = optimize (res);
584 new_r_Load (ir_graph *irg, ir_node *block,
585 ir_node *store, ir_node *adr)
587 ir_node *in[2] = {store, adr};
589 res = new_ir_node (irg, block, op_Load, mode_T, 2, in);
591 res = optimize (res);
597 new_r_Store (ir_graph *irg, ir_node *block,
598 ir_node *store, ir_node *adr, ir_node *val)
600 ir_node *in[3] = {store, adr, val};
602 res = new_ir_node (irg, block, op_Store, mode_T, 3, in);
604 res = optimize (res);
610 new_r_Alloc (ir_graph *irg, ir_node *block, ir_node *store,
611 ir_node *size, type *alloc_type, where_alloc where)
613 ir_node *in[2] = {store, size};
615 res = new_ir_node (irg, block, op_Alloc, mode_T, 2, in);
617 res->attr.a.where = where;
618 res->attr.a.type = alloc_type;
620 res = optimize (res);
626 new_r_Free (ir_graph *irg, ir_node *block, ir_node *store,
627 ir_node *ptr, ir_node *size, type *free_type)
629 ir_node *in[3] = {store, ptr, size};
631 res = new_ir_node (irg, block, op_Free, mode_T, 3, in);
633 res->attr.f = free_type;
635 res = optimize (res);
641 new_r_Sel (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
642 int arity, ir_node **in, entity *ent)
649 NEW_ARR_A (ir_node *, r_in, r_arity);
652 memcpy (&r_in[2], in, sizeof (ir_node *) * arity);
653 res = new_ir_node (irg, block, op_Sel, mode_p, r_arity, r_in);
655 res->attr.s.ltyp = static_linkage;
656 res->attr.s.ent = ent;
658 res = optimize (res);
664 new_r_SymConst (ir_graph *irg, ir_node *block, type_or_id *value,
665 symconst_kind symkind)
669 res = new_ir_node (irg, block, op_SymConst, mode_I, 0, in);
671 res->attr.i.num = symkind;
672 if (symkind == linkage_ptr_info) {
673 res->attr.i.tori.ptrinfo = (ident *)value;
675 assert ( ( (symkind == type_tag)
676 || (symkind == size))
677 && (is_type(value)));
678 res->attr.i.tori.typ = (type *)value;
680 res = optimize (res);
686 new_r_Sync (ir_graph *irg, ir_node *block, int arity, ir_node **in)
690 res = new_ir_node (irg, block, op_Sync, mode_M, arity, in);
692 res = optimize (res);
699 new_r_Bad (ir_node *block)
701 return current_ir_graph->bad;
704 /***********************/
705 /** public interfaces */
706 /** construction tools */
713 res = new_ir_node (current_ir_graph, current_ir_graph->current_block,
714 op_Start, mode_T, 0, NULL);
716 res = optimize (res);
727 res = new_ir_node (current_ir_graph, current_ir_graph->current_block,
728 op_End, mode_X, -1, NULL);
730 res = optimize (res);
741 res = new_ir_node (current_ir_graph, NULL, op_Block, mode_R, -1, NULL);
742 current_ir_graph->current_block = res;
743 res->attr.block.matured = 0;
744 set_Block_block_visit(res, 0);
746 // res = optimize (res); /* GL: only optimize if mature!!!! */
749 /** create a new dynamic array, which stores all parameters in irnodes */
750 /** using the same obstack as the whole irgraph */
751 res->attr.block.graph_arr = NEW_ARR_D (ir_node *, current_ir_graph->obst,
752 current_ir_graph->params);
754 /** initialize the parameter array */
755 memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->params);
762 new_Phi (int arity, ir_node **in, ir_mode *mode)
764 return new_r_Phi (current_ir_graph, current_ir_graph->current_block,
769 new_Const (ir_mode *mode, tarval *con)
771 return new_r_Const (current_ir_graph, current_ir_graph->start_block,
776 new_Id (ir_node *val, ir_mode *mode)
778 return new_r_Id (current_ir_graph, current_ir_graph->current_block,
783 new_Proj (ir_node *arg, ir_mode *mode, long proj)
785 return new_r_Proj (current_ir_graph, current_ir_graph->current_block,
790 new_Conv (ir_node *op, ir_mode *mode)
792 return new_r_Conv (current_ir_graph, current_ir_graph->current_block,
797 new_Tuple (int arity, ir_node **in)
799 return new_r_Tuple (current_ir_graph, current_ir_graph->current_block,
804 new_Add (ir_node *op1, ir_node *op2, ir_mode *mode)
806 return new_r_Add (current_ir_graph, current_ir_graph->current_block,
811 new_Sub (ir_node *op1, ir_node *op2, ir_mode *mode)
813 return new_r_Sub (current_ir_graph, current_ir_graph->current_block,
819 new_Minus (ir_node *op, ir_mode *mode)
821 return new_r_Minus (current_ir_graph, current_ir_graph->current_block,
826 new_Mul (ir_node *op1, ir_node *op2, ir_mode *mode)
828 return new_r_Mul (current_ir_graph, current_ir_graph->current_block,
833 new_Quot (ir_node *memop, ir_node *op1, ir_node *op2)
835 return new_r_Quot (current_ir_graph, current_ir_graph->current_block,
840 new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2)
842 return new_r_DivMod (current_ir_graph, current_ir_graph->current_block,
847 new_Div (ir_node *memop, ir_node *op1, ir_node *op2)
849 return new_r_Div (current_ir_graph, current_ir_graph->current_block,
854 new_Mod (ir_node *memop, ir_node *op1, ir_node *op2)
856 return new_r_Mod (current_ir_graph, current_ir_graph->current_block,
861 new_And (ir_node *op1, ir_node *op2, ir_mode *mode)
863 return new_r_And (current_ir_graph, current_ir_graph->current_block,
868 new_Or (ir_node *op1, ir_node *op2, ir_mode *mode)
870 return new_r_Or (current_ir_graph, current_ir_graph->current_block,
875 new_Eor (ir_node *op1, ir_node *op2, ir_mode *mode)
877 return new_r_Eor (current_ir_graph, current_ir_graph->current_block,
882 new_Not (ir_node *op, ir_mode *mode)
884 return new_r_Not (current_ir_graph, current_ir_graph->current_block,
889 new_Shl (ir_node *op, ir_node *k, ir_mode *mode)
891 return new_r_Shl (current_ir_graph, current_ir_graph->current_block,
896 new_Shr (ir_node *op, ir_node *k, ir_mode *mode)
898 return new_r_Shr (current_ir_graph, current_ir_graph->current_block,
903 new_Shrs (ir_node *op, ir_node *k, ir_mode *mode)
905 return new_r_Shrs (current_ir_graph, current_ir_graph->current_block,
910 new_Rotate (ir_node *op, ir_node *k, ir_mode *mode)
912 return new_r_Rot (current_ir_graph, current_ir_graph->current_block,
917 new_Abs (ir_node *op, ir_mode *mode)
919 return new_r_Abs (current_ir_graph, current_ir_graph->current_block,
924 new_Cmp (ir_node *op1, ir_node *op2)
926 return new_r_Cmp (current_ir_graph, current_ir_graph->current_block,
933 return new_r_Jmp (current_ir_graph, current_ir_graph->current_block);
937 new_Cond (ir_node *c)
939 return new_r_Cond (current_ir_graph, current_ir_graph->current_block, c);
943 new_Call (ir_node *store, ir_node *callee, int arity, ir_node **in,
946 return new_r_Call (current_ir_graph, current_ir_graph->current_block,
947 store, callee, arity, in, type);
950 /* make M parameter in call explicit:
951 new_Return (ir_node* store, int arity, ir_node **in) */
953 new_Return (ir_node* store, int arity, ir_node **in)
955 return new_r_Return (current_ir_graph, current_ir_graph->current_block,
960 new_Raise (ir_node *store, ir_node *obj)
962 return new_r_Raise (current_ir_graph, current_ir_graph->current_block,
967 new_Load (ir_node *store, ir_node *addr)
969 return new_r_Load (current_ir_graph, current_ir_graph->current_block,
974 new_Store (ir_node *store, ir_node *addr, ir_node *val)
976 return new_r_Store (current_ir_graph, current_ir_graph->current_block,
981 new_Alloc (ir_node *store, ir_node *size, type *alloc_type,
984 return new_r_Alloc (current_ir_graph, current_ir_graph->current_block,
985 store, size, alloc_type, where);
989 new_Free (ir_node *store, ir_node *ptr, ir_node *size, type *free_type)
991 return new_r_Free (current_ir_graph, current_ir_graph->current_block,
992 store, ptr, size, free_type);
996 new_simpleSel (ir_node *store, ir_node *objptr, entity *ent)
997 /* GL: objptr was called frame before. Frame was a bad choice for the name
998 as the operand could as well be a pointer to a dynamic object. */
1000 return new_r_Sel (current_ir_graph, current_ir_graph->current_block,
1001 store, objptr, 0, NULL, ent);
1005 new_Sel (ir_node *store, ir_node *objptr, int n_index, ir_node **index, entity *sel)
1007 return new_r_Sel (current_ir_graph, current_ir_graph->current_block,
1008 store, objptr, n_index, index, sel);
1012 new_SymConst (type_or_id *value, symconst_kind kind)
1014 return new_r_SymConst (current_ir_graph, current_ir_graph->current_block,
1019 new_Sync (int arity, ir_node** in)
1021 return new_r_Sync (current_ir_graph, current_ir_graph->current_block,
1029 return current_ir_graph->bad;
1033 /************************/
1034 /* ir block constructor */
1036 /* GL: what's this good for? */
1038 typedef struct ir_block {
1041 /* -1 = error, 0 = OK */
1058 /* call once for each run of the library */