X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgmod.c;h=d19b21a6ee38c5341ae3937e5cacc214cd6d5ed6;hb=9be70b7ef6120836707d76050372a89247cec2a6;hp=bdd782af6a4f887ae17d19803eda188338754bdf;hpb=e3e22fa6f927847099c0bff62457003aa81f2518;p=libfirm diff --git a/ir/ir/irgmod.c b/ir/ir/irgmod.c index bdd782af6..d19b21a6e 100644 --- a/ir/ir/irgmod.c +++ b/ir/ir/irgmod.c @@ -13,6 +13,9 @@ # include #endif +# include "irvrfy.h" +# include "irflag.h" +# include "irgwalk.h" # include "irnode_t.h" # include "irgraph_t.h" # include "irgmod.h" @@ -41,20 +44,19 @@ turn_into_tuple (ir_node *node, int arity) /* Insert irnode `new' in place of irnode `old' Since `new' may be bigger than `old' replace `old' by an op_Id which is smaller than everything */ -inline void -exchange (ir_node *old, ir_node *new) +INLINE void +exchange (ir_node *old, ir_node *nw) { ir_node *block = old->in[0]; old->op = op_Id; old->in = NEW_ARR_D (ir_node *, current_ir_graph->obst, 2); old->in[0] = block; - old->in[1] = new; + old->in[1] = nw; } - /**********************************************************************/ -/* Funcionality for collect_phis */ +/* Functionality for collect_phis */ /**********************************************************************/ void @@ -130,6 +132,10 @@ void part_block(ir_node *node) { ir_node *old_block; ir_node *phi; + /* Turn off optimizations so that blocks are not merged again. */ + int rem_opt = get_optimize(); + set_optimize(0); + /* Transform the control flow */ old_block = get_nodes_Block(node); new_block = new_Block(get_Block_n_cfgpreds(old_block), @@ -150,7 +156,12 @@ void part_block(ir_node *node) { set_irn_link(new_block, phi); set_irn_link(old_block, NULL); while (phi) { - set_nodes_Block(phi, new_block); + if(get_nodes_Block(phi) == old_block); /* @@@ inlinening chokes on phis that don't + obey this condition. How do they get into + the list??? Example: InterfaceIII */ + set_nodes_Block(phi, new_block); phi = get_irn_link(phi); } + + set_optimize(rem_opt); }