X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbetranshlp.c;h=638d40c0015afb3d86a6388eb833ce8d9496cb52;hb=4614f17999007f93c7be926c2a2db232c78073ba;hp=9a9ed4defcec92e4063fb7e8f3212f68b923e8fe;hpb=d935aa267d00966c360931d2f0f43008030c0592;p=libfirm diff --git a/ir/be/betranshlp.c b/ir/be/betranshlp.c index 9a9ed4def..638d40c00 100644 --- a/ir/be/betranshlp.c +++ b/ir/be/betranshlp.c @@ -46,8 +46,6 @@ typedef struct be_transform_env_t { ir_graph *irg; /**< The irg, the node should be created in */ - int visited; /**< visited count that indicates whether a - node is already transformed */ waitq *worklist; /**< worklist of nodes that still need to be transformed */ ir_node *old_anchor; /**< the old anchor node in the old irg */ @@ -56,8 +54,10 @@ typedef struct be_transform_env_t { static be_transform_env_t env; -void be_set_transformed_node(ir_node *old_node, ir_node *new_node) { +void be_set_transformed_node(ir_node *old_node, ir_node *new_node) +{ set_irn_link(old_node, new_node); + mark_irn_visited(old_node); } int be_is_transformed(const ir_node *node) { @@ -85,6 +85,14 @@ void be_duplicate_deps(ir_node *old_node, ir_node *new_node) { } } +void be_dep_on_frame(ir_node *const node) +{ + ir_graph *const irg = current_ir_graph; + + if (get_irg_start_block(irg) == get_nodes_block(node)) + add_irn_dep(node, get_irg_frame(irg)); +} + ir_node *be_duplicate_node(ir_node *node) { ir_node *block = be_transform_node(get_nodes_block(node)); ir_graph *irg = env.irg; @@ -132,7 +140,6 @@ ir_node *be_transform_node(ir_node *node) { if (new_node != NULL) return new_node; - mark_irn_visited(node); DEBUG_ONLY(be_set_transformed_node(node, NULL)); op = get_irn_op(node); @@ -146,7 +153,6 @@ ir_node *be_transform_node(ir_node *node) { } be_set_transformed_node(node, new_node); - mark_irn_visited(new_node); hook_dead_node_elim_subst(current_ir_graph, node, new_node); return new_node; } @@ -236,11 +242,6 @@ ir_node *be_pre_transform_node(ir_node *place) { return be_transform_node(place); } -ir_node *be_get_old_anchor(int anchor) -{ - return get_irn_n(env.old_anchor, anchor); -} - static void pre_transform_anchor(int anchor) { ir_node *old_anchor_node = get_irn_n(env.old_anchor, anchor); @@ -260,8 +261,7 @@ static void kill_unused_anchor(int anchor) /** * Transforms all nodes. Deletes the old obstack and creates a new one. */ -static void transform_nodes(ir_graph *irg, arch_pretrans_nodes *pre_transform, - void *cg) +static void transform_nodes(ir_graph *irg, arch_pretrans_nodes *pre_transform) { int i; ir_node *old_end, *new_anchor; @@ -271,7 +271,6 @@ static void transform_nodes(ir_graph *irg, arch_pretrans_nodes *pre_transform, inc_irg_visited(irg); env.irg = irg; - env.visited = get_irg_visited(irg); env.worklist = new_waitq(); env.old_anchor = irg->anchor; @@ -299,7 +298,7 @@ static void transform_nodes(ir_graph *irg, arch_pretrans_nodes *pre_transform, kill_unused_anchor(anchor_tls); if (pre_transform) - (*pre_transform)(cg); + pre_transform(); /* process worklist (this should transform all nodes in the graph) */ while (! waitq_empty(env.worklist)) { @@ -360,8 +359,6 @@ static ir_node *gen_Block(ir_node *node) { set_Block_MacroBlock(block, macroblock); } - be_set_transformed_node(node, block); - /* put the preds in the worklist */ be_enqueue_preds(node); @@ -381,7 +378,6 @@ static ir_node *gen_End(ir_node *node) { be_duplicate_deps(node, new_end); set_irg_end(irg, new_end); - be_set_transformed_node(new_end, new_end); /* transform preds */ arity = get_irn_arity(node); @@ -395,7 +391,7 @@ static ir_node *gen_End(ir_node *node) { return new_end; } -void be_transform_graph(be_irg_t *birg, arch_pretrans_nodes *func, void *cg) +void be_transform_graph(be_irg_t *birg, arch_pretrans_nodes *func) { ir_graph *irg = birg->irg; ir_graph *old_current_ir_graph = current_ir_graph; @@ -420,7 +416,7 @@ void be_transform_graph(be_irg_t *birg, arch_pretrans_nodes *func, void *cg) op_End->ops.generic = (op_func)gen_End; /* do the main transformation */ - transform_nodes(irg, func, cg); + transform_nodes(irg, func); /* free the old obstack */ obstack_free(old_obst, 0);