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
16 # include "irgraph_t.h"
17 # include "irnode_t.h"
18 # include "irmode_t.h"
26 /* memset belongs to string.h */
29 #if USE_EXPICIT_PHI_IN_STACK
30 /* A stack needed for the automatic Phi node construction in constructor
31 Phi_in. Redefinition in irgraph.c!! */
36 typedef struct Phi_in_stack Phi_in_stack;
39 /*** ******************************************** */
40 /** privat interfaces, for professional use only */
42 /* Constructs a Block with a fixed number of predecessors.
43 Does not set current_block. Can not be used with automatic
44 Phi node construction. */
46 new_r_Block (ir_graph *irg, int arity, ir_node **in)
50 res = new_ir_node (irg, NULL, op_Block, mode_R, arity, in);
51 set_Block_matured(res, 1);
52 set_Block_block_visited(res, 0);
59 new_r_Start (ir_graph *irg, ir_node *block)
63 res = new_ir_node (irg, block, op_Start, mode_T, 0, NULL);
70 new_r_End (ir_graph *irg, ir_node *block)
74 res = new_ir_node (irg, block, op_End, mode_X, -1, NULL);
80 /* Creates a Phi node with all predecessors. Calling this constructor
81 is only allowed if the corresponding block is mature. */
83 new_r_Phi (ir_graph *irg, ir_node *block, int arity, ir_node **in, ir_mode *mode)
87 assert( get_Block_matured(block) );
88 assert( get_irn_arity(block) == arity );
90 res = new_ir_node (irg, block, op_Phi, mode, arity, in);
98 new_r_Const (ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con)
101 res = new_ir_node (irg, block, op_Const, mode, 0, NULL);
103 res = optimize (res);
107 res = local_optimize_newby (res);
114 new_r_Id (ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode)
116 ir_node *in[1] = {val};
118 res = new_ir_node (irg, block, op_Id, mode, 1, in);
119 res = optimize (res);
125 new_r_Proj (ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
128 ir_node *in[1] = {arg};
130 res = new_ir_node (irg, block, op_Proj, mode, 1, in);
131 res->attr.proj = proj;
134 assert(get_Proj_pred(res));
135 assert(get_nodes_Block(get_Proj_pred(res)));
137 res = optimize (res);
145 new_r_Conv (ir_graph *irg, ir_node *block, ir_node *op, ir_mode *mode)
147 ir_node *in[1] = {op};
149 res = new_ir_node (irg, block, op_Conv, mode, 1, in);
150 res = optimize (res);
157 new_r_Tuple (ir_graph *irg, ir_node *block, int arity, ir_node **in)
161 res = new_ir_node (irg, block, op_Tuple, mode_T, arity, in);
162 res = optimize (res);
168 new_r_Add (ir_graph *irg, ir_node *block,
169 ir_node *op1, ir_node *op2, ir_mode *mode)
171 ir_node *in[2] = {op1, op2};
173 res = new_ir_node (irg, block, op_Add, mode, 2, in);
174 res = optimize (res);
180 new_r_Sub (ir_graph *irg, ir_node *block,
181 ir_node *op1, ir_node *op2, ir_mode *mode)
183 ir_node *in[2] = {op1, op2};
185 res = new_ir_node (irg, block, op_Sub, mode, 2, in);
186 res = optimize (res);
192 new_r_Minus (ir_graph *irg, ir_node *block,
193 ir_node *op, ir_mode *mode)
195 ir_node *in[1] = {op};
197 res = new_ir_node (irg, block, op_Minus, mode, 1, in);
198 res = optimize (res);
204 new_r_Mul (ir_graph *irg, ir_node *block,
205 ir_node *op1, ir_node *op2, ir_mode *mode)
207 ir_node *in[2] = {op1, op2};
209 res = new_ir_node (irg, block, op_Mul, mode, 2, in);
210 res = optimize (res);
216 new_r_Quot (ir_graph *irg, ir_node *block,
217 ir_node *memop, ir_node *op1, ir_node *op2)
219 ir_node *in[3] = {memop, op1, op2};
221 res = new_ir_node (irg, block, op_Quot, mode_T, 3, in);
222 res = optimize (res);
228 new_r_DivMod (ir_graph *irg, ir_node *block,
229 ir_node *memop, ir_node *op1, ir_node *op2)
231 ir_node *in[3] = {memop, op1, op2};
233 res = new_ir_node (irg, block, op_DivMod, mode_T, 3, in);
234 res = optimize (res);
240 new_r_Div (ir_graph *irg, ir_node *block,
241 ir_node *memop, ir_node *op1, ir_node *op2)
243 ir_node *in[3] = {memop, op1, op2};
245 res = new_ir_node (irg, block, op_Div, mode_T, 3, in);
246 res = optimize (res);
252 new_r_Mod (ir_graph *irg, ir_node *block,
253 ir_node *memop, ir_node *op1, ir_node *op2)
255 ir_node *in[3] = {memop, op1, op2};
257 res = new_ir_node (irg, block, op_Mod, mode_T, 3, in);
258 res = optimize (res);
264 new_r_And (ir_graph *irg, ir_node *block,
265 ir_node *op1, ir_node *op2, ir_mode *mode)
267 ir_node *in[2] = {op1, op2};
269 res = new_ir_node (irg, block, op_And, mode, 2, in);
270 res = optimize (res);
276 new_r_Or (ir_graph *irg, ir_node *block,
277 ir_node *op1, ir_node *op2, ir_mode *mode)
279 ir_node *in[2] = {op1, op2};
281 res = new_ir_node (irg, block, op_Or, mode, 2, in);
282 res = optimize (res);
288 new_r_Eor (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_Eor, mode, 2, in);
294 res = optimize (res);
300 new_r_Not (ir_graph *irg, ir_node *block,
301 ir_node *op, ir_mode *mode)
303 ir_node *in[1] = {op};
305 res = new_ir_node (irg, block, op_Not, mode, 1, in);
306 res = optimize (res);
312 new_r_Shl (ir_graph *irg, ir_node *block,
313 ir_node *op, ir_node *k, ir_mode *mode)
315 ir_node *in[2] = {op, k};
317 res = new_ir_node (irg, block, op_Shl, mode, 2, in);
318 res = optimize (res);
324 new_r_Shr (ir_graph *irg, ir_node *block,
325 ir_node *op, ir_node *k, ir_mode *mode)
327 ir_node *in[2] = {op, k};
329 res = new_ir_node (irg, block, op_Shr, mode, 2, in);
330 res = optimize (res);
336 new_r_Shrs (ir_graph *irg, ir_node *block,
337 ir_node *op, ir_node *k, ir_mode *mode)
339 ir_node *in[2] = {op, k};
341 res = new_ir_node (irg, block, op_Shrs, mode, 2, in);
342 res = optimize (res);
348 new_r_Rot (ir_graph *irg, ir_node *block,
349 ir_node *op, ir_node *k, ir_mode *mode)
351 ir_node *in[2] = {op, k};
353 res = new_ir_node (irg, block, op_Rot, mode, 2, in);
354 res = optimize (res);
360 new_r_Abs (ir_graph *irg, ir_node *block,
361 ir_node *op, ir_mode *mode)
363 ir_node *in[1] = {op};
365 res = new_ir_node (irg, block, op_Abs, mode, 1, in);
366 res = optimize (res);
372 new_r_Cmp (ir_graph *irg, ir_node *block,
373 ir_node *op1, ir_node *op2)
375 ir_node *in[2] = {op1, op2};
377 res = new_ir_node (irg, block, op_Cmp, mode_T, 2, in);
378 res = optimize (res);
384 new_r_Jmp (ir_graph *irg, ir_node *block)
388 res = new_ir_node (irg, block, op_Jmp, mode_X, 0, in);
389 res = optimize (res);
395 new_r_Cond (ir_graph *irg, ir_node *block, ir_node *c)
397 ir_node *in[1] = {c};
399 res = new_ir_node (irg, block, op_Cond, mode_T, 1, in);
400 res = optimize (res);
406 new_r_Call (ir_graph *irg, ir_node *block, ir_node *store,
407 ir_node *callee, int arity, ir_node **in, type_method *type)
414 NEW_ARR_A (ir_node *, r_in, r_arity);
417 memcpy (&r_in[2], in, sizeof (ir_node *) * arity);
419 res = new_ir_node (irg, block, op_Call, mode_T, r_arity, r_in);
421 set_Call_type(res, type);
422 res = optimize (res);
428 new_r_Return (ir_graph *irg, ir_node *block,
429 ir_node *store, int arity, ir_node **in)
436 NEW_ARR_A (ir_node *, r_in, r_arity);
438 memcpy (&r_in[1], in, sizeof (ir_node *) * arity);
439 res = new_ir_node (irg, block, op_Return, mode_X, r_arity, r_in);
440 res = optimize (res);
446 new_r_Raise (ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
448 ir_node *in[2] = {store, obj};
450 res = new_ir_node (irg, block, op_Raise, mode_X, 2, in);
452 res = optimize (res);
458 new_r_Load (ir_graph *irg, ir_node *block,
459 ir_node *store, ir_node *adr)
461 ir_node *in[2] = {store, adr};
463 res = new_ir_node (irg, block, op_Load, mode_T, 2, in);
465 res = optimize (res);
471 new_r_Store (ir_graph *irg, ir_node *block,
472 ir_node *store, ir_node *adr, ir_node *val)
474 ir_node *in[3] = {store, adr, val};
476 res = new_ir_node (irg, block, op_Store, mode_T, 3, in);
478 res = optimize (res);
484 new_r_Alloc (ir_graph *irg, ir_node *block, ir_node *store,
485 ir_node *size, type *alloc_type, where_alloc where)
487 ir_node *in[2] = {store, size};
489 res = new_ir_node (irg, block, op_Alloc, mode_T, 2, in);
491 res->attr.a.where = where;
492 res->attr.a.type = alloc_type;
494 res = optimize (res);
500 new_r_Free (ir_graph *irg, ir_node *block, ir_node *store,
501 ir_node *ptr, ir_node *size, type *free_type)
503 ir_node *in[3] = {store, ptr, size};
505 res = new_ir_node (irg, block, op_Free, mode_T, 3, in);
507 res->attr.f = free_type;
509 res = optimize (res);
515 new_r_Sel (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
516 int arity, ir_node **in, entity *ent)
523 NEW_ARR_A (ir_node *, r_in, r_arity);
526 memcpy (&r_in[2], in, sizeof (ir_node *) * arity);
527 res = new_ir_node (irg, block, op_Sel, mode_p, r_arity, r_in);
529 res->attr.s.ltyp = static_linkage;
530 res->attr.s.ent = ent;
532 res = optimize (res);
538 new_r_SymConst (ir_graph *irg, ir_node *block, type_or_id_p value,
539 symconst_kind symkind)
544 if (symkind == linkage_ptr_info)
548 res = new_ir_node (irg, block, op_SymConst, mode, 0, in);
550 res->attr.i.num = symkind;
551 if (symkind == linkage_ptr_info) {
552 res->attr.i.tori.ptrinfo = (ident *)value;
554 assert ( ( (symkind == type_tag)
555 || (symkind == size))
556 && (is_type(value)));
557 res->attr.i.tori.typ = (type *)value;
559 res = optimize (res);
565 new_r_Sync (ir_graph *irg, ir_node *block, int arity, ir_node **in)
569 res = new_ir_node (irg, block, op_Sync, mode_M, arity, in);
571 res = optimize (res);
579 return current_ir_graph->bad;
582 /** ********************/
583 /** public interfaces */
584 /** construction tools */
586 /****f* ircons/new_Start
589 * new_Start -- create a new Start node in the current block
592 * s = new_Start(void);
593 * ir_node* new_Start(void);
596 * s - pointer to the created Start node
605 res = new_ir_node (current_ir_graph, current_ir_graph->current_block,
606 op_Start, mode_T, 0, NULL);
608 res = optimize (res);
618 res = new_ir_node (current_ir_graph, current_ir_graph->current_block,
619 op_End, mode_X, -1, NULL);
621 res = optimize (res);
627 /* Constructs a Block with a fixed number of predecessors.
628 Does set current_block. Can be used with automatic Phi
629 node construction. */
631 new_Block (int arity, ir_node **in)
635 res = new_r_Block (current_ir_graph, arity, in);
636 current_ir_graph->current_block = res;
638 /* Create and initialize array for Phi-node construction. */
639 res->attr.block.graph_arr = NEW_ARR_D (ir_node *, current_ir_graph->obst,
640 current_ir_graph->n_loc);
641 memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
643 res = optimize (res);
649 /* ***********************************************************************/
650 /* Methods necessary for automatic Phi node creation */
652 ir_node *phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
653 ir_node *get_r_value_internal (ir_node *block, int pos, ir_mode *mode);
654 ir_node *new_r_Phi0 (ir_graph *irg, ir_node *block, ir_mode *mode)
655 ir_node *new_r_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode, ir_node **in, int ins)
657 Call Graph: ( A ---> B == A "calls" B)
659 get_value mature_block
667 get_r_value_internal |
671 new_r_Phi0 new_r_Phi_in
673 * *************************************************************************** */
675 /* Creates a Phi node with 0 predecessors */
677 new_r_Phi0 (ir_graph *irg, ir_node *block, ir_mode *mode)
680 res = new_ir_node (irg, block, op_Phi, mode, 0, NULL);
685 /* There are two implementations of the Phi node construction. The first
686 is faster, but does not work for blocks with more than 2 predecessors.
687 The second works always but is slower and causes more unnecessary Phi
689 Select the implementations by the following preprocessor flag set in
691 #if USE_FAST_PHI_CONSTRUCTION
693 /* This is a stack used for allocating and deallocating nodes in
694 new_r_Phi_in. The original implementation used the obstack
695 to model this stack, now it is explicit. This reduces side effects.
697 #if USE_EXPICIT_PHI_IN_STACK
702 res = (Phi_in_stack *) malloc ( sizeof (Phi_in_stack));
704 res->stack = NEW_ARR_F (ir_node *, 1);
710 void free_to_Phi_in_stack(ir_node *phi) {
711 assert(get_irn_opcode(phi) == iro_Phi);
713 if (ARR_LEN(current_ir_graph->Phi_in_stack->stack) ==
714 current_ir_graph->Phi_in_stack->pos)
715 ARR_APP1 (ir_node *, current_ir_graph->Phi_in_stack->stack, phi);
717 current_ir_graph->Phi_in_stack->stack[current_ir_graph->Phi_in_stack->pos] = phi;
719 (current_ir_graph->Phi_in_stack->pos)++;
723 alloc_or_pop_from_Phi_in_stack(ir_graph *irg, ir_node *block, ir_mode *mode,
724 int arity, ir_node **in) {
726 ir_node **stack = current_ir_graph->Phi_in_stack->stack;
727 int pos = current_ir_graph->Phi_in_stack->pos;
731 /* We need to allocate a new node */
732 res = new_ir_node (irg, block, op_Phi, mode, arity, in);
734 /* reuse the old node and initialize it again. */
737 assert (res->kind == k_ir_node);
738 assert (res->op == op_Phi);
743 /* ???!!! How to free the old in array?? */
744 res->in = NEW_ARR_D (ir_node *, irg->obst, (arity+1));
746 memcpy (&res->in[1], in, sizeof (ir_node *) * arity);
748 (current_ir_graph->Phi_in_stack->pos)--;
752 #endif /* USE_EXPICIT_PHI_IN_STACK */
754 /* Creates a Phi node with a given, fixed array **in of predecessors.
755 If the Phi node is unnecessary, as the same value reaches the block
756 through all control flow paths, it is eliminated and the value
757 returned directly. This constructor is only intended for use in
758 the automatic Phi node generation triggered by get_value or mature.
759 The implementation is quite tricky and depends on the fact, that
760 the nodes are allocated on a stack:
761 The in array contains predecessors and NULLs. The NULLs appear,
762 if get_r_value_internal, that computed the predecessors, reached
763 the same block on two paths. In this case the same value reaches
764 this block on both paths, there is no definition in between. We need
765 not allocate a Phi where these path's merge, but we have to communicate
766 this fact to the caller. This happens by returning a pointer to the
767 node the caller _will_ allocate. (Yes, we predict the address. We can
768 do so because the nodes are allocated on the obstack.) The caller then
769 finds a pointer to itself and, when this routine is called again,
773 new_r_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode,
774 ir_node **in, int ins)
777 ir_node *res, *known;
779 /* allocate a new node on the obstack.
780 This can return a node to which some of the pointers in the in-array
782 Attention: the constructor copies the in array, i.e., the later changes
783 to the array in this routine do not affect the constructed node! If
784 the in array contains NULLs, there will be missing predecessors in the
786 Is this a possible internal state of the Phi node generation? */
787 #if USE_EXPICIT_PHI_IN_STACK
788 res = known = alloc_or_pop_from_Phi_in_stack(irg, block, mode, ins, in);
790 res = known = new_ir_node (irg, block, op_Phi, mode, ins, in);
792 /* The in-array can contain NULLs. These were returned by
793 get_r_value_internal if it reached the same block/definition on a
795 The NULLs are replaced by the node itself to simplify the test in the
797 for (i=0; i < ins; ++i)
798 if (in[i] == NULL) in[i] = res;
800 /* This loop checks whether the Phi has more than one predecessor.
801 If so, it is a real Phi node and we break the loop. Else the
802 Phi node merges the same definition on several paths and therefore
804 for (i=0; i < ins; ++i)
806 if (in[i]==res || in[i]==known) continue;
814 /* i==ins: there is at most one predecessor, we don't need a phi node. */
816 #if USE_EXPICIT_PHI_IN_STACK
817 free_to_Phi_in_stack(res);
819 obstack_free (current_ir_graph->obst, res);
823 res = optimize (res);
827 /* return the pointer to the Phi node. This node might be deallocated! */
832 get_r_value_internal (ir_node *block, int pos, ir_mode *mode);
834 /** This function computes the predecessors for a real Phi node, and then
835 allocates and returns this node. The routine called to allocate the
836 node might optimize it away and return a real value, or even a pointer
837 to a deallocated Phi node on top of the obstack!
838 This function is called with an in-array of proper size. **/
839 static inline ir_node *
840 phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
842 ir_node *prevBlock, *res;
845 /* This loop goes to all predecessor blocks of the block the Phi node is in
846 and there finds the operands of the Phi node by calling
847 get_r_value_internal. */
848 for (i = 1; i <= ins; ++i) {
849 assert (block->in[i]);
850 prevBlock = block->in[i]->in[0]; /* go past control flow op to prev block */
852 nin[i-1] = get_r_value_internal (prevBlock, pos, mode);
855 /* After collecting all predecessors into the array nin a new Phi node
856 with these predecessors is created. This constructor contains an
857 optimization: If all predecessors of the Phi node are identical it
858 returns the only operand instead of a new Phi node. If the value
859 passes two different control flow edges without being defined, and
860 this is the second path treated, a pointer to the node that will be
861 allocated for the first path (recursion) is returned. We already
862 know the address of this node, as it is the next node to be allocated
863 and will be placed on top of the obstack. (The obstack is a _stack_!) */
864 res = new_r_Phi_in (current_ir_graph, block, mode, nin, ins);
866 /* Now we now the value for "pos" and can enter it in the array with
867 all known local variables. Attention: this might be a pointer to
868 a node, that later will be allocated!!! See new_r_Phi_in.
869 If this is called in mature, after some set_value in the same block,
870 the proper value must not be overwritten:
872 get_value (makes Phi0, put's it into graph_arr)
873 set_value (overwrites Phi0 in graph_arr)
874 mature_block (upgrades Phi0, puts it again into graph_arr, overwriting
877 if (!block->attr.block.graph_arr[pos]) {
878 block->attr.block.graph_arr[pos] = res;
880 /* printf(" value already computed by %s\n",
881 id_to_str(block->attr.block.graph_arr[pos]->op->name)); */
887 /* This function returns the last definition of a variable. In case
888 this variable was last defined in a previous block, Phi nodes are
889 inserted. If the part of the firm graph containing the definition
890 is not yet constructed, a dummy Phi node is returned. */
892 get_r_value_internal (ir_node *block, int pos, ir_mode *mode)
895 /* There are 4 cases to treat.
897 1. The block is not mature and we visit it the first time. We can not
898 create a proper Phi node, therefore a Phi0, i.e., a Phi without
899 predecessors is returned. This node is added to the linked list (field
900 "link") of the containing block to be completed when this block is
901 matured. (Comlpletion will add a new Phi and turn the Phi0 into an Id
904 2. The value is already known in this block, graph_arr[pos] is set and we
905 visit the block the first time. We can return the value without
906 creating any new nodes.
908 3. The block is mature and we visit it the first time. A Phi node needs
909 to be created (phi_merge). If the Phi is not needed, as all it's
910 operands are the same value reaching the block through different
911 paths, it's optimized away and the value itself is returned.
913 4. The block is mature, and we visit it the second time. Now two
914 subcases are possible:
915 * The value was computed completely the last time we were here. This
916 is the case if there is no loop. We can return the proper value.
917 * The recursion that visited this node and set the flag did not
918 return yet. We are computing a value in a loop and need to
919 break the recursion without knowing the result yet.
920 @@@ strange case. Straight forward we would create a Phi before
921 starting the computation of it's predecessors. In this case we will find
922 a Phi here in any case. The problem is that this implementation only
923 creates a Phi after computing the predecessors, so that it is hard to
924 compute self references of this Phi. @@@
925 There is no simple check for the second subcase. Therefore we check
926 for a second visit and treat all such cases as the second subcase.
927 Anyways, the basic situation is the same: we reached a block
928 on two paths without finding a definition of the value: No Phi
929 nodes are needed on both paths.
930 We return this information "Two paths, no Phi needed" by a very tricky
931 implementation that relies on the fact that an obstack is a stack and
932 will return a node with the same address on different allocations.
933 Look also at phi_merge and new_r_phi_in to understand this.
934 @@@ Unfortunately this does not work, see testprogram three_cfpred_example.
938 /* case 4 -- already visited. */
939 if (get_irn_visited(block) == get_irg_visited(current_ir_graph)) return NULL;
941 /* visited the first time */
942 set_irn_visited(block, get_irg_visited(current_ir_graph));
944 /* Get the local valid value */
945 res = block->attr.block.graph_arr[pos];
947 /* case 2 -- If the value is actually computed, return it. */
948 if (res) { return res;};
950 if (block->attr.block.matured) { /* case 3 */
952 /* The Phi has the same amount of ins as the corresponding block. */
953 int ins = get_irn_arity(block);
955 NEW_ARR_A (ir_node *, nin, ins);
957 /* Phi merge collects the predecessors and then creates a node. */
958 res = phi_merge (block, pos, mode, nin, ins);
960 } else { /* case 1 */
961 /* The block is not mature, we don't know how many in's are needed. A Phi
962 with zero predecessors is created. Such a Phi node is called Phi0
963 node. (There is also an obsolete Phi0 opcode.) The Phi0 is then added
964 to the list of Phi0 nodes in this block to be matured by mature_block
966 The Phi0 has to remember the pos of it's internal value. If the real
967 Phi is computed, pos is used to update the array with the local
970 res = new_r_Phi0 (current_ir_graph, block, mode);
971 res->attr.phi0_pos = pos;
972 res->link = block->link;
976 /* If we get here, the frontend missed a use-before-definition error */
979 printf("Error: no value set. Use of undefined variable. Initializing
981 assert (mode->code >= irm_f && mode->code <= irm_p);
982 res = new_r_Const (current_ir_graph, block, mode,
983 tarval_mode_null[mode->code]);
986 /* The local valid value is available now. */
987 block->attr.block.graph_arr[pos] = res;
994 /** This is the simple algorithm. If first generates a Phi0, then
995 it starts the recursion. This causes an Id at the entry of
996 every block that has no definition of the value! **/
998 #if USE_EXPICIT_PHI_IN_STACK
1000 Phi_in_stack * new_Phi_in_stack() { return NULL; }
1004 new_r_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode,
1005 ir_node **in, int ins)
1008 ir_node *res, *known;
1010 /* Allocate a new node on the obstack. The allocation copies the in
1012 res = new_ir_node (irg, block, op_Phi, mode, ins, in);
1014 /* This loop checks whether the Phi has more than one predecessor.
1015 If so, it is a real Phi node and we break the loop. Else the
1016 Phi node merges the same definition on several paths and therefore
1017 is not needed. Don't consider Bad nodes! */
1019 for (i=0; i < ins; ++i)
1021 if (in[i]==res || in[i]==known || is_Bad(in[i])) continue;
1029 /* i==ins: there is at most one predecessor, we don't need a phi node. */
1032 obstack_free (current_ir_graph->obst, res);
1035 /* A undefined value, e.g., in unreachable code. */
1039 res = optimize (res);
1047 get_r_value_internal (ir_node *block, int pos, ir_mode *mode);
1049 /** This function allocates a dummy Phi node to break recursions,
1050 computes the predecessors for the real phi node, and then
1051 allocates and returns this node. The routine called to allocate the
1052 node might optimize it away and return a real value.
1053 This function is called with an in-array of proper size. **/
1054 static inline ir_node *
1055 phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
1057 ir_node *prevBlock, *res, *phi0;
1061 /* If this block has no value at pos create a Phi0 and remember it
1062 in graph_arr to break recursions. */
1064 if (!block->attr.block.graph_arr[pos]) {
1065 /* Even if all variables are defined before use, it can happen that
1066 we get to the start block, if a cond has been replaced by a tuple
1067 (bad, jmp). As the start has a self referencing control flow edge,
1068 we get a self referencing Id, which is hard to optimize away. We avoid
1069 this by defining the value as a Bad node. *
1070 if (block == get_irg_start_block(current_ir_graph)) {
1071 block->attr.block.graph_arr[pos] = new_Bad();
1074 phi0 = new_r_Phi0(current_ir_graph, block, mode);
1075 block->attr.block.graph_arr[pos] = phi0;
1079 /* This loop goes to all predecessor blocks of the block the Phi node
1080 is in and there finds the operands of the Phi node by calling
1081 get_r_value_internal. */
1082 for (i = 1; i <= ins; ++i) {
1083 assert (block->in[i]);
1084 if (is_Bad(block->in[i])) {
1085 /* In case a Cond has been optimized we would get right to the start block
1086 with an invalid definition. */
1087 nin[i-1] = new_Bad();
1090 prevBlock = block->in[i]->in[0]; /* go past control flow op to prev block */
1092 if (!is_Bad(prevBlock)) {
1093 nin[i-1] = get_r_value_internal (prevBlock, pos, mode);
1095 nin[i-1] = new_Bad();
1099 /* After collecting all predecessors into the array nin a new Phi node
1100 with these predecessors is created. This constructor contains an
1101 optimization: If all predecessors of the Phi node are identical it
1102 returns the only operand instead of a new Phi node. */
1103 res = new_r_Phi_in (current_ir_graph, block, mode, nin, ins);
1105 /* In case we allocated a Phi0 node at the beginning of this procedure,
1106 we need to exchange this Phi0 with the real Phi. */
1108 exchange(phi0, res);
1109 block->attr.block.graph_arr[pos] = res;
1115 /* This function returns the last definition of a variable. In case
1116 this variable was last defined in a previous block, Phi nodes are
1117 inserted. If the part of the firm graph containing the definition
1118 is not yet constructed, a dummy Phi node is returned. */
1120 get_r_value_internal (ir_node *block, int pos, ir_mode *mode)
1123 /* There are 4 cases to treat.
1125 1. The block is not mature and we visit it the first time. We can not
1126 create a proper Phi node, therefore a Phi0, i.e., a Phi without
1127 predecessors is returned. This node is added to the linked list (field
1128 "link") of the containing block to be completed when this block is
1129 matured. (Comlpletion will add a new Phi and turn the Phi0 into an Id
1132 2. The value is already known in this block, graph_arr[pos] is set and we
1133 visit the block the first time. We can return the value without
1134 creating any new nodes.
1136 3. The block is mature and we visit it the first time. A Phi node needs
1137 to be created (phi_merge). If the Phi is not needed, as all it's
1138 operands are the same value reaching the block through different
1139 paths, it's optimized away and the value itself is returned.
1141 4. The block is mature, and we visit it the second time. Now two
1142 subcases are possible:
1143 * The value was computed completely the last time we were here. This
1144 is the case if there is no loop. We can return the proper value.
1145 * The recursion that visited this node and set the flag did not
1146 return yet. We are computing a value in a loop and need to
1147 break the recursion. This case only happens if we visited
1148 the same block with phi_merge before, which inserted a Phi0.
1149 So we return the Phi0.
1152 /* case 4 -- already visited. */
1153 if (get_irn_visited(block) == get_irg_visited(current_ir_graph)) {
1154 /* As phi_merge allocates a Phi0 this value is always defined. Here
1155 is the critical difference of the two algorithms. */
1156 assert(block->attr.block.graph_arr[pos]);
1157 return block->attr.block.graph_arr[pos];
1160 /* visited the first time */
1161 set_irn_visited(block, get_irg_visited(current_ir_graph));
1163 /* Get the local valid value */
1164 res = block->attr.block.graph_arr[pos];
1166 /* case 2 -- If the value is actually computed, return it. */
1167 if (res) { return res; };
1169 if (block->attr.block.matured) { /* case 3 */
1171 /* The Phi has the same amount of ins as the corresponding block. */
1172 int ins = get_irn_arity(block);
1174 NEW_ARR_A (ir_node *, nin, ins);
1176 /* Phi merge collects the predecessors and then creates a node. */
1177 res = phi_merge (block, pos, mode, nin, ins);
1179 } else { /* case 1 */
1180 /* The block is not mature, we don't know how many in's are needed. A Phi
1181 with zero predecessors is created. Such a Phi node is called Phi0
1182 node. The Phi0 is then added to the list of Phi0 nodes in this block
1183 to be matured by mature_block later.
1184 The Phi0 has to remember the pos of it's internal value. If the real
1185 Phi is computed, pos is used to update the array with the local
1187 res = new_r_Phi0 (current_ir_graph, block, mode);
1188 res->attr.phi0_pos = pos;
1189 res->link = block->link;
1193 /* If we get here, the frontend missed a use-before-definition error */
1196 printf("Error: no value set. Use of undefined variable. Initializing
1198 assert (mode->code >= irm_f && mode->code <= irm_p);
1199 res = new_r_Const (current_ir_graph, block, mode,
1200 tarval_mode_null[mode->code]);
1203 /* The local valid value is available now. */
1204 block->attr.block.graph_arr[pos] = res;
1209 #endif /* USE_FAST_PHI_CONSTRUCTION */
1211 /* ************************************************************************** */
1213 /** Finalize a Block node, when all control flows are known. */
1214 /** Acceptable parameters are only Block nodes. */
1216 mature_block (ir_node *block)
1223 assert (get_irn_opcode(block) == iro_Block);
1225 if (!get_Block_matured(block)) {
1227 /* turn the dynamic in-array into a static one. */
1228 ins = ARR_LEN (block->in)-1;
1229 NEW_ARR_A (ir_node *, nin, ins);
1231 /* Traverse a chain of Phi nodes attached to this block and mature
1233 for (n = block->link; n; n=next) {
1234 inc_irg_visited(current_ir_graph);
1236 exchange (n, phi_merge (block, n->attr.phi0_pos, n->mode, nin, ins));
1239 block->attr.block.matured = 1;
1241 /* Now, as the block is a finished firm node, we can optimize it.
1242 Since other nodes have been allocated since the block was created
1243 we can not free the node on the obstack. Therefore we have to call
1245 Unfortunately the optimization does not change a lot, as all allocated
1246 nodes refer to the unoptimized node. */
1247 block = optimize_in_place(block);
1253 new_Phi (int arity, ir_node **in, ir_mode *mode)
1255 return new_r_Phi (current_ir_graph, current_ir_graph->current_block,
1260 new_Const (ir_mode *mode, tarval *con)
1262 return new_r_Const (current_ir_graph, current_ir_graph->start_block,
1267 new_Id (ir_node *val, ir_mode *mode)
1269 return new_r_Id (current_ir_graph, current_ir_graph->current_block,
1274 new_Proj (ir_node *arg, ir_mode *mode, long proj)
1276 return new_r_Proj (current_ir_graph, current_ir_graph->current_block,
1281 new_Conv (ir_node *op, ir_mode *mode)
1283 return new_r_Conv (current_ir_graph, current_ir_graph->current_block,
1288 new_Tuple (int arity, ir_node **in)
1290 return new_r_Tuple (current_ir_graph, current_ir_graph->current_block,
1295 new_Add (ir_node *op1, ir_node *op2, ir_mode *mode)
1297 return new_r_Add (current_ir_graph, current_ir_graph->current_block,
1302 new_Sub (ir_node *op1, ir_node *op2, ir_mode *mode)
1304 return new_r_Sub (current_ir_graph, current_ir_graph->current_block,
1310 new_Minus (ir_node *op, ir_mode *mode)
1312 return new_r_Minus (current_ir_graph, current_ir_graph->current_block,
1317 new_Mul (ir_node *op1, ir_node *op2, ir_mode *mode)
1319 return new_r_Mul (current_ir_graph, current_ir_graph->current_block,
1324 new_Quot (ir_node *memop, ir_node *op1, ir_node *op2)
1326 return new_r_Quot (current_ir_graph, current_ir_graph->current_block,
1331 new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2)
1333 return new_r_DivMod (current_ir_graph, current_ir_graph->current_block,
1338 new_Div (ir_node *memop, ir_node *op1, ir_node *op2)
1340 return new_r_Div (current_ir_graph, current_ir_graph->current_block,
1345 new_Mod (ir_node *memop, ir_node *op1, ir_node *op2)
1347 return new_r_Mod (current_ir_graph, current_ir_graph->current_block,
1352 new_And (ir_node *op1, ir_node *op2, ir_mode *mode)
1354 return new_r_And (current_ir_graph, current_ir_graph->current_block,
1359 new_Or (ir_node *op1, ir_node *op2, ir_mode *mode)
1361 return new_r_Or (current_ir_graph, current_ir_graph->current_block,
1366 new_Eor (ir_node *op1, ir_node *op2, ir_mode *mode)
1368 return new_r_Eor (current_ir_graph, current_ir_graph->current_block,
1373 new_Not (ir_node *op, ir_mode *mode)
1375 return new_r_Not (current_ir_graph, current_ir_graph->current_block,
1380 new_Shl (ir_node *op, ir_node *k, ir_mode *mode)
1382 return new_r_Shl (current_ir_graph, current_ir_graph->current_block,
1387 new_Shr (ir_node *op, ir_node *k, ir_mode *mode)
1389 return new_r_Shr (current_ir_graph, current_ir_graph->current_block,
1394 new_Shrs (ir_node *op, ir_node *k, ir_mode *mode)
1396 return new_r_Shrs (current_ir_graph, current_ir_graph->current_block,
1401 new_Rotate (ir_node *op, ir_node *k, ir_mode *mode)
1403 return new_r_Rot (current_ir_graph, current_ir_graph->current_block,
1408 new_Abs (ir_node *op, ir_mode *mode)
1410 return new_r_Abs (current_ir_graph, current_ir_graph->current_block,
1415 new_Cmp (ir_node *op1, ir_node *op2)
1417 return new_r_Cmp (current_ir_graph, current_ir_graph->current_block,
1424 return new_r_Jmp (current_ir_graph, current_ir_graph->current_block);
1428 new_Cond (ir_node *c)
1430 return new_r_Cond (current_ir_graph, current_ir_graph->current_block, c);
1434 new_Call (ir_node *store, ir_node *callee, int arity, ir_node **in,
1437 return new_r_Call (current_ir_graph, current_ir_graph->current_block,
1438 store, callee, arity, in, type);
1442 new_Return (ir_node* store, int arity, ir_node **in)
1444 return new_r_Return (current_ir_graph, current_ir_graph->current_block,
1449 new_Raise (ir_node *store, ir_node *obj)
1451 return new_r_Raise (current_ir_graph, current_ir_graph->current_block,
1456 new_Load (ir_node *store, ir_node *addr)
1458 return new_r_Load (current_ir_graph, current_ir_graph->current_block,
1463 new_Store (ir_node *store, ir_node *addr, ir_node *val)
1465 return new_r_Store (current_ir_graph, current_ir_graph->current_block,
1470 new_Alloc (ir_node *store, ir_node *size, type *alloc_type,
1473 return new_r_Alloc (current_ir_graph, current_ir_graph->current_block,
1474 store, size, alloc_type, where);
1478 new_Free (ir_node *store, ir_node *ptr, ir_node *size, type *free_type)
1480 return new_r_Free (current_ir_graph, current_ir_graph->current_block,
1481 store, ptr, size, free_type);
1485 new_simpleSel (ir_node *store, ir_node *objptr, entity *ent)
1486 /* GL: objptr was called frame before. Frame was a bad choice for the name
1487 as the operand could as well be a pointer to a dynamic object. */
1489 return new_r_Sel (current_ir_graph, current_ir_graph->current_block,
1490 store, objptr, 0, NULL, ent);
1494 new_Sel (ir_node *store, ir_node *objptr, int n_index, ir_node **index, entity *sel)
1496 return new_r_Sel (current_ir_graph, current_ir_graph->current_block,
1497 store, objptr, n_index, index, sel);
1501 new_SymConst (type_or_id_p value, symconst_kind kind)
1503 return new_r_SymConst (current_ir_graph, current_ir_graph->current_block,
1508 new_Sync (int arity, ir_node** in)
1510 return new_r_Sync (current_ir_graph, current_ir_graph->current_block,
1518 return current_ir_graph->bad;
1521 /* ********************************************************************* */
1522 /* Comfortable interface with automatic Phi node construction. */
1523 /* (Uses also constructors of ?? interface, except new_Block. */
1524 /* ********************************************************************* */
1526 /** Block construction **/
1527 /* immature Block without predecessors */
1528 ir_node *new_immBlock (void) {
1531 /* creates a new dynamic in-array as length of in is -1 */
1532 res = new_ir_node (current_ir_graph, NULL, op_Block, mode_R, -1, NULL);
1533 current_ir_graph->current_block = res;
1534 res->attr.block.matured = 0;
1535 set_Block_block_visited(res, 0);
1537 /* Create and initialize array for Phi-node construction. */
1538 res->attr.block.graph_arr = NEW_ARR_D (ir_node *, current_ir_graph->obst,
1539 current_ir_graph->n_loc);
1540 memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
1542 /* Immature block may not be optimized! */
1548 /* add an adge to a jmp/control flow node */
1550 add_in_edge (ir_node *block, ir_node *jmp)
1552 if (block->attr.block.matured) {
1553 printf("Error: Block already matured!\n");
1556 assert (jmp != NULL);
1557 ARR_APP1 (ir_node *, block->in, jmp);
1561 /* changing the current block */
1563 switch_block (ir_node *target)
1565 current_ir_graph->current_block = target;
1568 /* ************************ */
1569 /* parameter administration */
1571 /* get a value from the parameter array from the current block by its index */
1573 get_value (int pos, ir_mode *mode)
1575 inc_irg_visited(current_ir_graph);
1576 return get_r_value_internal (current_ir_graph->current_block, pos + 1, mode);
1579 /* set a value at position pos in the parameter array from the current block */
1581 set_value (int pos, ir_node *value)
1583 current_ir_graph->current_block->attr.block.graph_arr[pos + 1] = value;
1586 /* get the current store */
1590 /* GL: one could call get_value instead */
1591 inc_irg_visited(current_ir_graph);
1592 return get_r_value_internal (current_ir_graph->current_block, 0, mode_M);
1595 /* set the current store */
1597 set_store (ir_node *store)
1599 /* GL: one could call set_value instead */
1600 current_ir_graph->current_block->attr.block.graph_arr[0] = store;
1603 /* ********************************************************************* */
1606 /* call once for each run of the library */