- BugFix: use remove_irp_irg() instead of free_ir_graph() to prevent
[libfirm] / ir / be / bemain.c
index a44121f..c470ae3 100644 (file)
@@ -473,6 +473,7 @@ static void initialize_birg(be_irg_t *birg, ir_graph *irg, be_main_env_t *env)
        edges_assure(irg);
 
        set_irg_phase_state(irg, phase_backend);
+       be_info_init_irg(irg);
 
        dump(DUMP_INITIAL, irg, "-prepared", dump_ir_block_graph);
 }
@@ -513,14 +514,14 @@ ir_timer_t *t_ra_other;
  */
 static void be_main_loop(FILE *file_handle, const char *cup_name)
 {
-       int i;
-       be_main_env_t env;
-       char prof_filename[256];
        static const char suffix[] = ".prof";
-       be_irg_t *birgs;
-       int num_birgs;
-       ir_graph **irg_list, **backend_irg_list;
-       arch_env_t *arch_env;
+
+       int           i, num_birgs, stat_active = 0;
+       be_main_env_t env;
+       char          prof_filename[256];
+       be_irg_t      *birgs;
+       ir_graph      **irg_list, **backend_irg_list;
+       arch_env_t    *arch_env;
 
        be_timing = (be_options.timing == BE_TIME_ON);
 
@@ -567,11 +568,14 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
        num_birgs = backend_irg_list ? ARR_LEN(backend_irg_list) : get_irp_n_irgs();
        birgs     = ALLOCAN(be_irg_t, num_birgs + 1);
 
+       be_info_init();
+
        /* First: initialize all birgs */
        for(i = 0; i < num_birgs; ++i) {
                ir_graph *irg = backend_irg_list ? backend_irg_list[i] : get_irp_irg(i);
                initialize_birg(&birgs[i], irg, &env);
        }
+       arch_env_handle_intrinsics(arch_env);
        DEL_ARR_F(irg_list);
 
        /*
@@ -594,6 +598,10 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                ir_profile_read(prof_filename);
        }
 
+#ifdef FIRM_STATISTICS
+       stat_active = stat_is_active();
+#endif /* FIRM_STATISTICS */
+
        /* For all graphs */
        for (i = 0; i < num_birgs; ++i) {
                be_irg_t *birg = &birgs[i];
@@ -604,8 +612,6 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                /* set the current graph (this is important for several firm functions) */
                current_ir_graph = irg;
 
-               be_sched_init_phase(irg);
-
                /* reset the phi handler. */
                be_phi_handler_reset();
 
@@ -859,13 +865,19 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                );
 #undef LC_EMIT
 
-               be_sched_free_phase(irg);
-
                be_free_birg(birg);
+
+        /* switched off due to statistics (statistic module needs all irgs) */
+#ifdef FIRM_STATISTICS
+               if (! stat_active)
+#endif /* FIRM_STATISTICS */
+                       remove_irp_irg(irg);
                stat_ev_ctx_pop("bemain_irg");
        }
        ir_profile_free();
        be_done_env(&env);
+
+       be_info_free();
 }
 
 /* Main interface to the frontend. */