From: Götz Lindenmaier Date: Thu, 19 Dec 2002 11:14:02 +0000 (+0000) Subject: fixed bug in irgopt -- optimize_cf X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=83ac77db9f8768ed047b2060347951c65a7249ca;p=libfirm fixed bug in irgopt -- optimize_cf [r569] --- diff --git a/ir/ir/irgopt.c b/ir/ir/irgopt.c index 2dc1e2766..ad770d917 100644 --- a/ir/ir/irgopt.c +++ b/ir/ir/irgopt.c @@ -1296,19 +1296,18 @@ static void optimize_blocks(ir_node *b, void *env) { } n_preds++; } - /* The Phi_pred node is replaced now if it is a Phi. Remove it so - that it is removed from keep_alives. */ - if (get_nodes_Block(phi_pred) == pred) - exchange (phi_pred, new_Bad()); -#if 0 - /* @@@ hier brauche ich Schleifeninformation!!! Wenn keine Rueckwaertskante - dann darfs auch keine Verwendung geben. */ + /* The Phi_pred node is replaced now if it is a Phi. + In Schleifen kann offenbar der entfernte Phi Knoten legal verwendet werden. + Daher muss der Phiknoten durch den neuen ersetzt werden. + Weiter muss der alte Phiknoten entfernt werden (durch ersetzen oder + durch einen Bad) damit er aus den keep_alive verschwinden kann. + Man sollte also, falls keine Schleife vorliegt, exchange mit new_Bad + aufrufen. */ if (get_nodes_Block(phi_pred) == pred) { /* remove the Phi as it might be kept alive. Further there might be other users. */ - exchange(phi_pred, phi); /* geht, ist aber doch semantisch falsch! */ + exchange(phi_pred, phi); /* geht, ist aber doch semantisch falsch! Warum?? */ } -#endif } else { in[n_preds] = get_Phi_pred(phi, i); n_preds ++; @@ -1316,7 +1315,6 @@ static void optimize_blocks(ir_node *b, void *env) { } /* Fix the node */ set_irn_in(phi, n_preds, in); - //clear_backedges (phi); phi = get_irn_link(phi); } diff --git a/ir/ir/irgopt.h b/ir/ir/irgopt.h index b34ecae9c..f03fceec8 100644 --- a/ir/ir/irgopt.h +++ b/ir/ir/irgopt.h @@ -96,6 +96,7 @@ void place_code(ir_graph *irg); /* and propagates dead control flow by calling equivalent_node. */ /* Independent of compiler flag it removes Tuples from cf edges, */ /* Bad predecessors form blocks and unnecessary predecessors of End.*/ +/* @@@ So far destroys backedge information. */ /********************************************************************/ void optimize_cf(ir_graph *irg); diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index a8a9b049b..34542ea21 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -561,6 +561,7 @@ ir_node *get_fragile_op_mem(ir_node *node); #define DDMNB(X) xprintf("%I%I: %ld (in block %ld)\n", get_irn_opident(X), get_irn_modeident(X), get_irn_node_nr(X), get_irn_node_nr(get_nodes_Block(X))) #define DDMT(X) xprintf("%s(l.%i) %I %I: %p\n", __FUNCTION__, __LINE__, get_type_tpop_nameid(X), get_type_ident(X), (X)) #define DDME(X) xprintf("%s(l.%i) %I: %p\n", __FUNCTION__, __LINE__, get_entity_ident(X), (X)) +#define DDMG(X) xprintf("%s(l.%i) %I: %p\n", __FUNCTION__, __LINE__, get_irg_ent(get_entity_ident(X)), (X)) # endif /* _IRNODE_H_ */