X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fdata_flow_scalar_replace.c;h=a26c5eb5147a290a5402592649e7b81067b8be46;hb=f4479a465ed166eead2717c3633d632e9710d8c3;hp=91011b3eaea949ae585d81ad42cb08854e11b2a3;hpb=f94205465ba1d555a195902e36248b10d6a812cb;p=libfirm diff --git a/ir/opt/data_flow_scalar_replace.c b/ir/opt/data_flow_scalar_replace.c index 91011b3ea..a26c5eb51 100644 --- a/ir/opt/data_flow_scalar_replace.c +++ b/ir/opt/data_flow_scalar_replace.c @@ -1,3 +1,22 @@ +/* + * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + /* * Project: libFIRM * File name: ir/opt/data_flow_scalar_replace.c @@ -7,20 +26,11 @@ * Created: * CVS-ID: $Id$ * Copyright: (c) 1998-2005 Universität Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif -#ifdef HAVE_ALLOCA_H -#include -#endif - -#ifdef HAVE_MALLOC_H -#include -#endif - #ifdef HAVE_STRING_H #include #endif @@ -40,6 +50,7 @@ #include "irprintf.h" #include "compute_loop_info.h" #include "irgopt.h" +#include "xmalloc.h" #define SET_ENT_VNUM(ent, vnum) set_entity_link(ent, INT_TO_PTR(vnum)) #define GET_ENT_VNUM(ent) (unsigned)PTR_TO_INT(get_entity_link(ent)) @@ -49,13 +60,13 @@ typedef struct _ent_leaves_t{ - entity *ent; /**< An entity, that contains scalars for replace.*/ + ir_entity *ent; /**< An entity, that contains scalars for replace.*/ pset *leaves; /**< All leaves of this entity.*/ } ent_leaves_t; typedef struct _sels_t { ir_node *sel; /**< A sel node, thats entity have scalars.*/ - entity *ent; /**< The entity of this sel node.*/ + ir_entity *ent; /**< The entity of this sel node.*/ }sels_t; typedef struct _call_access_t { @@ -88,7 +99,7 @@ typedef struct _leave_t { * accesses like a.b.c[8].d */ typedef union { - entity *ent; + ir_entity *ent; tarval *tv; } path_elem_t; @@ -140,8 +151,8 @@ static int ent_leaves_t_cmp(const void *elt, const void *key, size_t size) */ static int ent_cmp(const void *elt, const void *key) { - const entity *c1 = elt; - const entity *c2 = key; + const ir_entity *c1 = elt; + const ir_entity *c2 = key; return c1 != c2; } @@ -285,7 +296,7 @@ static int is_address_taken(ir_node *sel) * @param ent the entity that will be scalar replaced * @param sel a Sel node that selects some fields of this entity */ -static void link_all_leave_sels(entity *ent, ir_node *sel) +static void link_all_leave_sels(ir_entity *ent, ir_node *sel) { int i, n; @@ -353,7 +364,7 @@ static int find_possible_replacements(ir_graph *irg) ir_node *succ = get_irn_out(irg_frame, i); if (get_irn_op(succ) == op_Sel) { - entity *ent = get_Sel_entity(succ); + ir_entity *ent = get_Sel_entity(succ); set_entity_link(ent, NULL); } } @@ -367,7 +378,7 @@ static int find_possible_replacements(ir_graph *irg) ir_node *succ = get_irn_out(irg_frame, i); if (get_irn_op(succ) == op_Sel) { - entity *ent = get_Sel_entity(succ); + ir_entity *ent = get_Sel_entity(succ); ir_type *ent_type; if (get_entity_link(ent) == ADDRESS_TAKEN) @@ -468,7 +479,7 @@ static path_t *find_path(ir_node *sel, unsigned len) * * @return the next free value number */ -static unsigned allocate_value_numbers(set *set_sels, pset *leaves, entity *ent, unsigned vnum) +static unsigned allocate_value_numbers(set *set_sels, pset *leaves, ir_entity *ent, unsigned vnum) { ir_node *sel, *next; path_t *key, *path; @@ -612,13 +623,13 @@ static void sync_stored_scalars(ir_node *blk, env_t *env) { val_arr = get_irn_link(pred); if(val_arr[GET_ENT_VNUM(value_ent->ent)].access_type == SYNCED) - /* This entity was synced.*/ - continue; + /* This entity was synced.*/ + continue; if(val_arr[GET_ENT_VNUM(value_ent->ent)].access_type <= 3) { - /* To avoid repeated sync of this entity in this block.*/ - val_arr[GET_ENT_VNUM(value_ent->ent)].access_type = SYNCED; + /* To avoid repeated sync of this entity in this block.*/ + val_arr[GET_ENT_VNUM(value_ent->ent)].access_type = SYNCED; /* In this predecessor block is this entity not acessed. * We must sync in the end ot this block.*/ if(get_Block_n_cfgpreds(blk) > 1) @@ -791,7 +802,7 @@ static void split_call_mem_edge(env_t *env, ir_node *call, pset *accessed_entiti call_access_t key_call, *value_call; ir_node *call_blk, *new_mem_state, *leave; ir_node *sync, **in; - entity *ent; + ir_entity *ent; unsigned ent_vnum; int fix_irn = 0; /**< Set to 1 if we must add this call to it fix list.*/ int *accessed_leaves_vnum = NULL; /**< An arraw, where are saved the value number, that @@ -976,7 +987,7 @@ static void split_memory_edge(ir_node *irn, void *ctx) { * @param block A block from the current ir graph. * @param vnum The value number, that must be found. */ -static ir_node *find_value(ir_node *block, unsigned vnum) +static ir_node *find_vnum_value(ir_node *block, unsigned vnum) { value_arr_entry_t *val_arr; int i; @@ -993,7 +1004,7 @@ static ir_node *find_value(ir_node *block, unsigned vnum) for (i = get_Block_n_cfgpreds(block) - 1; i >= 0; --i) { ir_node *pred = get_Block_cfgpred(block, i); - res = find_value(get_nodes_block(pred), vnum); + res = find_vnum_value(get_nodes_block(pred), vnum); if (res) return res; } @@ -1009,7 +1020,7 @@ static ir_node *find_value(ir_node *block, unsigned vnum) static void fix_ls(env_t *env) { fixlist_entry_t *l; - ir_node *irn, *block, *pred, *val; + ir_node *irn, *block, *pred, *val = NULL; ir_op *op; int i; @@ -1023,7 +1034,7 @@ static void fix_ls(env_t *env) pred = get_nodes_block(pred); inc_irg_block_visited(current_ir_graph); - val = find_value(pred, l->vnum); + val = find_vnum_value(pred, l->vnum); if (val) break; @@ -1031,12 +1042,12 @@ static void fix_ls(env_t *env) if(val) { if(op == op_Store) - set_Store_mem(irn, val); + set_Store_mem(irn, val); else - if(op == op_Load) - set_Load_mem(irn, val); - else - set_Call_mem(irn, val); + if(op == op_Load) + set_Load_mem(irn, val); + else + set_Call_mem(irn, val); } } } @@ -1062,7 +1073,7 @@ static void fix_phis(env_t *env) pred = get_nodes_block(pred); inc_irg_block_visited(current_ir_graph); - val = find_value(pred, l->vnum); + val = find_vnum_value(pred, l->vnum); if (val) set_irn_n(phi, i, val); @@ -1096,7 +1107,7 @@ static void fix_syncs(env_t *env) /* We first repair the global memory edge at the first position of sync predecessors.*/ if(get_irn_op(get_irn_n(sync, 0)) == op_Unknown) { inc_irg_block_visited(current_ir_graph); - val = find_value(pred, env->gl_mem_vnum); + val = find_vnum_value(pred, env->gl_mem_vnum); if(val) set_irn_n(sync, 0, val); @@ -1108,7 +1119,7 @@ static void fix_syncs(env_t *env) assert(k <= ARR_LEN(l->accessed_vnum) && "The algorythm for sync repair is wron"); if(get_irn_op(get_irn_n(sync, i)) == op_Unknown) { inc_irg_block_visited(current_ir_graph); - val = find_value(pred, l->accessed_vnum[k++]); + val = find_vnum_value(pred, l->accessed_vnum[k++]); if(val) set_irn_n(sync, i, val); @@ -1146,7 +1157,7 @@ static void sync_mem_edges(env_t *env) { if(val_arr[env->gl_mem_vnum].mem_edge_state == NULL) { /* We must search through blocks for this memory state.*/ inc_irg_block_visited(current_ir_graph); - in[0] = find_value(Return_blk, env->gl_mem_vnum); + in[0] = find_vnum_value(Return_blk, env->gl_mem_vnum); } else in[0] = val_arr[env->gl_mem_vnum].mem_edge_state; @@ -1160,7 +1171,7 @@ static void sync_mem_edges(env_t *env) { if(val_arr[vnum].mem_edge_state == NULL) { /* We must search through blocks for this memory state.*/ inc_irg_block_visited(current_ir_graph); - in[i] = find_value(Return_blk, vnum); + in[i] = find_vnum_value(Return_blk, vnum); } else in[i] = val_arr[vnum].mem_edge_state; @@ -1213,7 +1224,7 @@ static void analyse_calls(ir_node *irn, void *ctx) { unsigned int acces_type; ir_node *param, *call_ptr, *blk; ir_op *op; - entity *meth_ent; + ir_entity *meth_ent; sels_t key_sels, *value_sels; call_access_t key_call, *value_call; value_arr_entry_t *val_arr; @@ -1330,7 +1341,7 @@ static void set_block_access(ir_node *irn, void *ctx){ vnum = GET_ENT_VNUM(value_leaves->ent); if((get_Block_n_cfgpreds(irn) > 1) && (val_arr[vnum].access_type > 3)) - env->changes = set_block_dominated_first_access(irn, vnum, val_arr[vnum].access_type); + env->changes = set_block_dominated_first_access(irn, vnum, val_arr[vnum].access_type); if((val_arr_pred[vnum].access_type > 3) && (val_arr[vnum].access_type < 3)) { /* We have found a block for update it access and value number information.*/ @@ -1511,7 +1522,7 @@ void data_flow_scalar_replacement_opt(ir_graph *irg) { ir_node *succ = get_irn_out(irg_frame, i); if (get_irn_op(succ) == op_Sel) { - entity *ent = get_Sel_entity(succ); + ir_entity *ent = get_Sel_entity(succ); if (get_entity_link(ent) == NULL || get_entity_link(ent) == ADDRESS_TAKEN) continue;