X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Fircons.c;h=ea1573d8540d35800b1b8f4d9f65e655399f2825;hb=eed0e43a82a6da6d60cf9d2e67f2394ca9f34e8d;hp=449230a58777d9eb67495cd1460f8031f1f9626a;hpb=45a9397451c25fb527c32c87f64ffefc72015c81;p=libfirm diff --git a/ir/ir/ircons.c b/ir/ir/ircons.c index 449230a58..ea1573d85 100644 --- a/ir/ir/ircons.c +++ b/ir/ir/ircons.c @@ -18,6 +18,7 @@ # include "array.h" /* memset belongs to string.h */ # include "string.h" +# include "irnode.h" #if USE_EXPICIT_PHI_IN_STACK /* A stack needed for the automatic Phi node construction in constructor @@ -31,14 +32,16 @@ struct Phi_in_stack { /*********************************************** */ /** privat interfaces, for professional use only */ +/* Constructs a Block with a fixed number of predecessors.*/ inline ir_node * new_r_Block (ir_graph *irg, int arity, ir_node **in) { ir_node *res; - res = new_ir_node (current_ir_graph, NULL, op_Block, mode_R, -1, NULL); + res = new_ir_node (current_ir_graph, NULL, op_Block, mode_R, arity, in); + irn_vrfy (res); return res; } @@ -49,7 +52,7 @@ new_r_Start (ir_graph *irg, ir_node *block) res = new_ir_node (irg, block, op_Start, mode_T, 0, NULL); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -60,7 +63,7 @@ new_r_End (ir_graph *irg, ir_node *block) res = new_ir_node (irg, block, op_End, mode_X, -1, NULL); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -74,7 +77,7 @@ new_r_Phi0 (ir_graph *irg, ir_node *block, ir_mode *mode) /* GL I'm not sure whether we should optimize this guy. * res = optimize (res); ??? */ - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -91,7 +94,7 @@ new_r_Phi (ir_graph *irg, ir_node *block, int arity, ir_node **in, ir_mode *mode res = new_ir_node (irg, block, op_Phi, mode, arity, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -142,7 +145,7 @@ alloc_or_pop_from_Phi_in_stack(ir_graph *irg, ir_node *block, ir_mode *mode, assert (res->kind == k_ir_node); assert (res->op == op_Phi); res->mode = mode; - res->visit = 0; + res->visited = 0; res->link = NULL; assert (arity >= 0); /* ???!!! How to free the old in array?? */ @@ -195,8 +198,9 @@ new_r_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode, #else res = known = new_ir_node (irg, block, op_Phi, mode, ins, in); #endif - /* The in-array can contain NULLs. These were returned by get_r_value_internal - if it reached the same block/definition on a second path. + /* The in-array can contain NULLs. These were returned by + get_r_value_internal if it reached the same block/definition on a + second path. The NULLs are replaced by the node itself to simplify the test in the next loop. */ for (i=0; i < ins; ++i) @@ -226,7 +230,7 @@ new_r_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode, res = known; } else { res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); } /* return the pointer to the Phi node. This node might be deallocated! */ @@ -240,7 +244,7 @@ new_r_Const (ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con) res = new_ir_node (irg, block, op_Const, mode, 0, NULL); res->attr.con = con; res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); #if 0 res = local_optimize_newby (res); @@ -256,19 +260,26 @@ new_r_Id (ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode) ir_node *res; res = new_ir_node (irg, block, op_Id, mode, 1, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } ir_node * -new_r_Proj (ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode, long proj) +new_r_Proj (ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode, + long proj) { ir_node *in[1] = {arg}; ir_node *res; res = new_ir_node (irg, block, op_Proj, mode, 1, in); res->attr.proj = proj; + + assert(res); + assert(get_Proj_pred(res)); + assert(get_nodes_Block(get_Proj_pred(res))); + res = optimize (res); - ir_vrfy (res); + + irn_vrfy (res); return res; } @@ -280,7 +291,7 @@ new_r_Conv (ir_graph *irg, ir_node *block, ir_node *op, ir_mode *mode) ir_node *res; res = new_ir_node (irg, block, op_Conv, mode, 1, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -292,7 +303,7 @@ new_r_Tuple (ir_graph *irg, ir_node *block, int arity, ir_node **in) res = new_ir_node (irg, block, op_Tuple, mode_T, arity, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -304,7 +315,7 @@ new_r_Add (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Add, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -316,7 +327,7 @@ new_r_Sub (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Sub, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -328,7 +339,7 @@ new_r_Minus (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Minus, mode, 1, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -340,7 +351,7 @@ new_r_Mul (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Mul, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -350,9 +361,9 @@ new_r_Quot (ir_graph *irg, ir_node *block, { ir_node *in[3] = {memop, op1, op2}; ir_node *res; - res = new_ir_node (irg, block, op_Quot, mode_T, 2, in); + res = new_ir_node (irg, block, op_Quot, mode_T, 3, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -362,9 +373,9 @@ new_r_DivMod (ir_graph *irg, ir_node *block, { ir_node *in[3] = {memop, op1, op2}; ir_node *res; - res = new_ir_node (irg, block, op_DivMod, mode_T, 2, in); + res = new_ir_node (irg, block, op_DivMod, mode_T, 3, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -374,9 +385,9 @@ new_r_Div (ir_graph *irg, ir_node *block, { ir_node *in[3] = {memop, op1, op2}; ir_node *res; - res = new_ir_node (irg, block, op_Div, mode_T, 2, in); + res = new_ir_node (irg, block, op_Div, mode_T, 3, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -386,9 +397,9 @@ new_r_Mod (ir_graph *irg, ir_node *block, { ir_node *in[3] = {memop, op1, op2}; ir_node *res; - res = new_ir_node (irg, block, op_Mod, mode_T, 2, in); + res = new_ir_node (irg, block, op_Mod, mode_T, 3, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -400,7 +411,7 @@ new_r_And (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_And, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -412,7 +423,7 @@ new_r_Or (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Or, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -424,7 +435,7 @@ new_r_Eor (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Eor, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -436,7 +447,7 @@ new_r_Not (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Not, mode, 1, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -448,7 +459,7 @@ new_r_Shl (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Shl, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -460,7 +471,7 @@ new_r_Shr (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Shr, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -472,7 +483,7 @@ new_r_Shrs (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Shrs, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -484,7 +495,7 @@ new_r_Rot (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Rot, mode, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -496,7 +507,7 @@ new_r_Abs (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Abs, mode, 1, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -508,7 +519,7 @@ new_r_Cmp (ir_graph *irg, ir_node *block, ir_node *res; res = new_ir_node (irg, block, op_Cmp, mode_T, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -519,7 +530,7 @@ new_r_Jmp (ir_graph *irg, ir_node *block) ir_node *res; res = new_ir_node (irg, block, op_Jmp, mode_X, 0, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -530,7 +541,7 @@ new_r_Cond (ir_graph *irg, ir_node *block, ir_node *c) ir_node *res; res = new_ir_node (irg, block, op_Cond, mode_T, 1, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -552,7 +563,7 @@ new_r_Call (ir_graph *irg, ir_node *block, ir_node *store, set_Call_type(res, type); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -565,18 +576,12 @@ new_r_Return (ir_graph *irg, ir_node *block, int r_arity; r_arity = arity+1; - NEW_ARR_A (ir_node *, r_in, r_arity); - r_in[0] = store; - memcpy (&r_in[1], in, sizeof (ir_node *) * arity); - res = new_ir_node (irg, block, op_Return, mode_X, r_arity, r_in); - res = optimize (res); - - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -588,7 +593,7 @@ new_r_Raise (ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj) res = new_ir_node (irg, block, op_Raise, mode_X, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -601,7 +606,7 @@ new_r_Load (ir_graph *irg, ir_node *block, res = new_ir_node (irg, block, op_Load, mode_T, 2, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -614,7 +619,7 @@ new_r_Store (ir_graph *irg, ir_node *block, res = new_ir_node (irg, block, op_Store, mode_T, 3, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -630,7 +635,7 @@ new_r_Alloc (ir_graph *irg, ir_node *block, ir_node *store, res->attr.a.type = alloc_type; res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -645,7 +650,7 @@ new_r_Free (ir_graph *irg, ir_node *block, ir_node *store, res->attr.f = free_type; res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -668,7 +673,7 @@ new_r_Sel (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr, res->attr.s.ent = ent; res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -690,7 +695,7 @@ new_r_SymConst (ir_graph *irg, ir_node *block, type_or_id *value, res->attr.i.tori.typ = (type *)value; } res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -702,12 +707,12 @@ new_r_Sync (ir_graph *irg, ir_node *block, int arity, ir_node **in) res = new_ir_node (irg, block, op_Sync, mode_M, arity, in); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } ir_node * -new_r_Bad (ir_node *block) +new_r_Bad () { return current_ir_graph->bad; } @@ -725,7 +730,7 @@ new_Start (void) op_Start, mode_T, 0, NULL); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); return res; } @@ -738,7 +743,8 @@ new_End (void) op_End, mode_X, -1, NULL); res = optimize (res); - ir_vrfy (res); + irn_vrfy (res); + return res; } @@ -750,11 +756,11 @@ new_Block (void) res = new_ir_node (current_ir_graph, NULL, op_Block, mode_R, -1, NULL); current_ir_graph->current_block = res; res->attr.block.matured = 0; - set_Block_block_visit(res, 0); + set_Block_block_visited(res, 0); /* forget this optimization. use this only if mature !!!! res = optimize (res); */ - ir_vrfy (res); + irn_vrfy (res); /** create a new dynamic array, which stores all parameters in irnodes */ /** using the same obstack as the whole irgraph */ @@ -868,10 +874,10 @@ get_r_value_internal (ir_node *block, int pos, ir_mode *mode) */ /* case 4 -- already visited. */ - if (block->visit == ir_visited) return NULL; + if (get_irn_visited(block) == get_irg_visited(current_ir_graph)) return NULL; /* visited the first time */ - block->visit = ir_visited; + set_irn_visited(block, get_irg_visited(current_ir_graph)); /* Get the local valid value */ res = block->attr.block.graph_arr[pos]; @@ -882,7 +888,7 @@ get_r_value_internal (ir_node *block, int pos, ir_mode *mode) if (block->attr.block.matured) { /* case 3 */ /* The Phi has the same amount of ins as the corresponding block. */ - int ins = get_irn_arity(block); // ARR_LEN (block->in)-1; + int ins = get_irn_arity(block); ir_node **nin; NEW_ARR_A (ir_node *, nin, ins); @@ -941,7 +947,7 @@ mature_block (ir_node *block) /* Traverse a chain of Phi nodes attached to this block and mature these, too. **/ for (n = block->link; n; n=next) { - ir_visited++; + inc_irg_visited(current_ir_graph); next = n->link; exchange (n, phi_merge (block, n->attr.phi0_pos, n->mode, nin, ins)); } @@ -949,7 +955,7 @@ mature_block (ir_node *block) block->attr.block.matured = 1; block = optimize_in_place(block); - ir_vrfy(block); + irn_vrfy(block); } } @@ -1253,7 +1259,7 @@ switch_block (ir_node *target) ir_node * get_value (int pos, ir_mode *mode) { - ++ir_visited; + inc_irg_visited(current_ir_graph); return get_r_value_internal (current_ir_graph->current_block, pos + 1, mode); } @@ -1269,7 +1275,7 @@ inline ir_node * get_store (void) { /* GL: one could call get_value instead */ - ++ir_visited; + inc_irg_visited(current_ir_graph); return get_r_value_internal (current_ir_graph->current_block, 0, mode_M); }