phase handling
[libfirm] / ir / ir / ircgopt.c
index aef6c90..06cef83 100644 (file)
@@ -24,7 +24,8 @@
 #include "array.h"
 #include "irprog.h"
 #include "irgwalk.h"
-
+#include "irloop.h"
+#include "irflag_t.h"
 
 static void clear_link(ir_node * node, void * env) {
   set_irn_link(node, NULL);
@@ -46,6 +47,8 @@ void gc_irgs(int n_keep, entity ** keep_arr) {
   void * MARK = &MARK;
   int i;
 
+  if (!get_opt_dead_method_elimination()) return;
+
   /* mark */
   if (n_keep > 0) {
     entity ** marked = NEW_ARR_F(entity *, n_keep);
@@ -81,9 +84,15 @@ void gc_irgs(int n_keep, entity ** keep_arr) {
   for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
     ir_graph * irg = get_irp_irg(i);
     entity * ent = get_irg_ent(irg);
+    /* Removing any graph invalidates all interprocedural loop trees. */
+    if (get_irg_loopinfo_state(irg) == loopinfo_ip_consistent ||
+       get_irg_loopinfo_state(irg) == loopinfo_ip_inconsistent)
+      free_loop_information(irg);
     if (get_entity_link(ent) != MARK) {
       remove_irp_irg(irg);
       set_entity_peculiarity(ent, peculiarity_description);
+      if (get_opt_dead_method_elimination_verbose())
+       printf("dead method elimination: freeing method %s\n", get_entity_ld_name(ent));
     }
     set_entity_link(ent, NULL);
   }