X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fopt%2Fldstopt.c;h=dcfc7392f6194d6be8a34c51826c5c15db9be47c;hb=82caacf18daf84d2fab123eb22d133b6cfbfcb3e;hp=07df1e91ba842babe65eab8436cd7e0d6af64452;hpb=741bd8e289acb40897b9bde72d89631feb08357e;p=libfirm diff --git a/ir/opt/ldstopt.c b/ir/opt/ldstopt.c index 07df1e91b..dcfc7392f 100644 --- a/ir/opt/ldstopt.c +++ b/ir/opt/ldstopt.c @@ -446,8 +446,8 @@ static unsigned is_Call_pure(ir_node *call) { /* try the called entity */ ir_node *ptr = get_Call_ptr(call); - if (is_SymConst_addr_ent(ptr)) { - ir_entity *ent = get_SymConst_entity(ptr); + if (is_Global(ptr)) { + ir_entity *ent = get_Global_entity(ptr); prop = get_entity_additional_properties(ent); } @@ -586,7 +586,7 @@ static unsigned follow_Mem_chain(ir_node *load, ir_node *curr) { get_irn_mode(get_Store_value(pred)), ptr, load_mode); /* if the might be an alias, we cannot pass this Store */ - if (rel != no_alias) + if (rel != ir_no_alias) break; pred = skip_Proj(get_Store_mem(pred)); } else if (is_Load(pred)) { @@ -887,7 +887,7 @@ static unsigned follow_Mem_chain_for_Store(ir_node *store, ir_node *curr) { get_nodes_MacroBlock(pred) == mblk && is_completely_overwritten(get_irn_mode(get_Store_value(pred)), mode)) { /* - * a Store after a Store in the same block -- a write after write. + * a Store after a Store in the same MacroBlock -- a write after write. * We may remove the first Store, if it does not have an exception handler. * * TODO: What, if both have the same exception handler ??? @@ -902,8 +902,10 @@ static unsigned follow_Mem_chain_for_Store(ir_node *store, ir_node *curr) { } else if (is_Load(pred) && get_Load_ptr(pred) == ptr && value == pred_info->projs[pn_Load_res]) { /* - * a Store of a value after a Load -- a write after read. - * We may remove the second Store, if it does not have an exception handler. + * a Store of a value just loaded from the same address + * -- a write after read. + * We may remove the Store, if it does not have an exception + * handler. */ if (! info->projs[pn_Store_X_except]) { DBG_OPT_WAR(store, pred); @@ -922,10 +924,16 @@ static unsigned follow_Mem_chain_for_Store(ir_node *store, ir_node *curr) { get_irn_mode(get_Store_value(pred)), ptr, mode); /* if the might be an alias, we cannot pass this Store */ - if (rel != no_alias) + if (rel != ir_no_alias) break; pred = skip_Proj(get_Store_mem(pred)); } else if (get_irn_op(pred) == op_Load) { + ir_alias_relation rel = get_alias_relation( + current_ir_graph, get_Load_ptr(pred), get_Load_mode(pred), + ptr, mode); + if (rel != ir_no_alias) + break; + pred = skip_Proj(get_Load_mem(pred)); } else { /* follow only Load chains */ @@ -973,6 +981,7 @@ static unsigned optimize_store(ir_node *store) { /* follow the memory chain as long as there are only Loads */ INC_MASTER(); + return follow_Mem_chain_for_Store(store, skip_Proj(mem)); } /* optimize_store */ @@ -1351,10 +1360,10 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env) { if (info->projs[pn_Load_res] == NULL || info->projs[pn_Load_X_regular] != NULL || info->projs[pn_Load_X_except] != NULL) continue; - /* for now, we can only handle Load(SymConst) */ - if (! is_SymConst_addr_ent(ptr)) + /* for now, we can only handle Load(Global) */ + if (! is_Global(ptr)) continue; - ent = get_SymConst_entity(ptr); + ent = get_Global_entity(ptr); load_mode = get_Load_mode(load); for (other = pscc->head; other != NULL; other = next_other) { node_entry *ne = get_irn_ne(other, env); @@ -1367,7 +1376,7 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env) { get_irn_mode(get_Store_value(other)), ptr, load_mode); /* if the might be an alias, we cannot pass this Store */ - if (rel != no_alias) + if (rel != ir_no_alias) break; } /* only pure Calls are allowed here, so ignore them */