fixed bug in irgopt -- optimize_cf
authorGötz Lindenmaier <goetz@ipd.info.uni-karlsruhe.de>
Thu, 19 Dec 2002 11:14:02 +0000 (11:14 +0000)
committerGötz Lindenmaier <goetz@ipd.info.uni-karlsruhe.de>
Thu, 19 Dec 2002 11:14:02 +0000 (11:14 +0000)
[r569]

ir/ir/irgopt.c
ir/ir/irgopt.h
ir/ir/irnode.h

index 2dc1e27..ad770d9 100644 (file)
@@ -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);
   }
index b34ecae..f03fcee 100644 (file)
@@ -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);
 
index a8a9b04..34542ea 100644 (file)
@@ -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_ */