X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Flower%2Flower_copyb.c;h=c76d258484f82e2fa3cf62327b4b707b9f6fa53a;hb=158e3e9a7f3972c6e6a993591e87f42112b6b5e5;hp=2d5400a1fc3134c188aada6cec8ce76f51123f14;hpb=bc35052031be38b7243401b37fe1d791728c7df2;p=libfirm diff --git a/ir/lower/lower_copyb.c b/ir/lower/lower_copyb.c index 2d5400a1f..c76d25848 100644 --- a/ir/lower/lower_copyb.c +++ b/ir/lower/lower_copyb.c @@ -51,7 +51,7 @@ typedef struct walk_env { static ir_mode *get_ir_mode(unsigned bytes) { switch (bytes) { - case 1: return mode_Bu; + case 1: return mode_Bu; case 2: return mode_Hu; case 4: return mode_Iu; case 8: return mode_Lu; @@ -64,8 +64,9 @@ static ir_mode *get_ir_mode(unsigned bytes) /** * lower a CopyB node. */ -static void lower_copyb_nodes(ir_node *irn, unsigned mode_bytes) { - ir_graph *irg = current_ir_graph; +static void lower_copyb_nodes(ir_node *irn, unsigned mode_bytes) +{ + ir_graph *irg = get_irn_irg(irn); unsigned size; unsigned offset; ir_mode *mode; @@ -101,15 +102,15 @@ static void lower_copyb_nodes(ir_node *irn, unsigned mode_bytes) { addr_const = new_r_Const_long(irg, mode_Iu, offset); add = new_r_Add(block, addr_src, addr_const, addr_mode); - load = new_r_Load(block, mem, add, mode, 0); - load_res = new_r_Proj(block, load, mode, pn_Load_res); - load_mem = new_r_Proj(block, load, mode_M, pn_Load_M); + load = new_r_Load(block, mem, add, mode, cons_none); + load_res = new_r_Proj(load, mode, pn_Load_res); + load_mem = new_r_Proj(load, mode_M, pn_Load_M); addr_const = new_r_Const_long(irg, mode_Iu, offset); add = new_r_Add(block, addr_dst, addr_const, addr_mode); - store = new_r_Store(block, load_mem, add, load_res, 0); - store_mem = new_r_Proj(block, store, mode_M, pn_Store_M); + store = new_r_Store(block, load_mem, add, load_res, cons_none); + store_mem = new_r_Proj(store, mode_M, pn_Store_M); mem = store_mem; } @@ -126,8 +127,9 @@ static void lower_copyb_nodes(ir_node *irn, unsigned mode_bytes) { /** * Post-Walker: find small CopyB nodes. */ -static void find_copyb_nodes(ir_node *irn, void *ctx) { - walk_env_t *env = ctx; +static void find_copyb_nodes(ir_node *irn, void *ctx) +{ + walk_env_t *env = (walk_env_t*)ctx; ir_type *tp; unsigned size; entry_t *entry; @@ -135,9 +137,9 @@ static void find_copyb_nodes(ir_node *irn, void *ctx) { if (is_Proj(irn)) { ir_node *pred = get_Proj_pred(irn); - if (is_CopyB(pred) && get_Proj_proj(irn) != pn_CopyB_M_regular) { + if (is_CopyB(pred) && get_Proj_proj(irn) != pn_CopyB_M) { /* found an exception Proj: remove it from the list again */ - entry = get_irn_link(pred); + entry = (entry_t*)get_irn_link(pred); list_del(&entry->list); } return; @@ -165,10 +167,8 @@ static void find_copyb_nodes(ir_node *irn, void *ctx) { void lower_CopyB(ir_graph *irg, unsigned max_size, unsigned native_mode_bytes) { walk_env_t env; - entry_t *entry; - ir_graph *rem = current_ir_graph; - - current_ir_graph = irg; + entry_t *entry; + bool changed = false; obstack_init(&env.obst); env.max_size = max_size; @@ -177,8 +177,12 @@ void lower_CopyB(ir_graph *irg, unsigned max_size, unsigned native_mode_bytes) list_for_each_entry(entry_t, entry, &env.list, list) { lower_copyb_nodes(entry->copyb, native_mode_bytes); + changed = true; + } + + if (changed) { + set_irg_outs_inconsistent(irg); } obstack_free(&env.obst, NULL); - current_ir_graph = rem; }