- Added 2 new blockschedulers, a greedy algorithm and an "optimal" ILP that
[libfirm] / ir / be / bechordal_main.c
index 6b376b0..d2ebfa3 100644 (file)
@@ -346,9 +346,12 @@ static void memory_operand_walker(ir_node *irn, void *env) {
        if (! be_is_Reload(irn))
                return;
 
-       // only use memory operands, if the reload is only used by 1 node
+       /* always use addressmode, it's good for x86 */
+#if 0
+       /* only use memory operands, if the reload is only used by 1 node */
        if(get_irn_n_edges(irn) > 1)
                return;
+#endif
 
        spill = be_get_Reload_mem(irn);
        block = get_nodes_block(irn);
@@ -387,8 +390,10 @@ static INLINE void check_for_memory_operands(be_chordal_env_t *chordal_env) {
 typedef struct _node_stat_t {
        unsigned int n_phis;      /**< Phis of the current register class. */
        unsigned int n_mem_phis;  /**< Memory Phis (Phis with spill operands). */
+       unsigned int n_copies;    /**< Copies */
+       unsigned int n_perms;     /**< Perms */
        unsigned int n_spills;    /**< Spill nodes */
-       unsigned int n_reloads;   /**< Reloads. */
+       unsigned int n_reloads;   /**< Reloads */
 } node_stat_t;
 
 struct node_stat_walker {
@@ -414,6 +419,11 @@ static void node_stat_walker(ir_node *irn, void *data)
                else if(arch_irn_classify(aenv, irn) & arch_irn_class_reload)
                        ++env->stat->n_reloads;
 
+               else if(arch_irn_classify(aenv, irn) & arch_irn_class_copy)
+                       ++env->stat->n_copies;
+
+               else if(arch_irn_classify(aenv, irn) & arch_irn_class_perm)
+                       ++env->stat->n_perms;
        }
 
        /* a mem phi is a PhiM with a mem phi operand or a Spill operand */
@@ -716,27 +726,37 @@ static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
 
                if(stat_file) {
                        be_ifg_stat_t stat;
-                       be_ifg_stat(chordal_env.ifg, irg, &stat);
+                       be_ifg_stat(&chordal_env, &stat);
                        be_stat_ev("ifg_nodes", stat.n_nodes);
                        be_stat_ev("ifg_edges", stat.n_edges);
+                       be_stat_ev("ifg_comps", stat.n_comps);
                }
 
                BE_TIMER_PUSH(ra_timer.t_verify);
-               if (options.vrfy_option != BE_CH_VRFY_OFF)
-                       be_ra_chordal_check(&chordal_env);
+               if (options.vrfy_option != BE_CH_VRFY_OFF) {
+                       //be_ra_chordal_check(&chordal_env);
+               }
 
                BE_TIMER_POP(ra_timer.t_verify);
 
+               if(stat_file) {
+                       node_stats(&chordal_env, &node_stat);
+                       be_stat_ev("perms_before_coal", node_stat.n_perms);
+                       be_stat_ev("copies_before_coal", node_stat.n_copies);
+               }
+
                /* copy minimization */
                BE_TIMER_PUSH(ra_timer.t_copymin);
                co_driver(&chordal_env);
                BE_TIMER_POP(ra_timer.t_copymin);
+
                dump(BE_CH_DUMP_COPYMIN, irg, chordal_env.cls, "-copymin", dump_ir_block_graph_sched);
 
                BE_TIMER_PUSH(ra_timer.t_verify);
 
-               if (options.vrfy_option != BE_CH_VRFY_OFF)
-                       be_ra_chordal_check(&chordal_env);
+               if (options.vrfy_option != BE_CH_VRFY_OFF) {
+                       //be_ra_chordal_check(&chordal_env);
+               }
 
                BE_TIMER_POP(ra_timer.t_verify);
                BE_TIMER_PUSH(ra_timer.t_ssa);
@@ -751,7 +771,7 @@ static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
                BE_TIMER_PUSH(ra_timer.t_verify);
                if (options.vrfy_option != BE_CH_VRFY_OFF) {
                        be_ssa_destruction_check(&chordal_env);
-                       be_ra_chordal_check(&chordal_env);
+                       //be_ra_chordal_check(&chordal_env);
                }
                BE_TIMER_POP(ra_timer.t_verify);
 
@@ -759,13 +779,18 @@ static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
                pmap_destroy(chordal_env.border_heads);
                bitset_free(chordal_env.ignore_colors);
 
+               if(stat_file) {
+                       node_stats(&chordal_env, &node_stat);
+                       be_stat_ev("perms_after_coal", node_stat.n_perms);
+                       be_stat_ev("copies_after_coal", node_stat.n_copies);
+               }
+
                be_stat_ev_pop();
        }
 
        BE_TIMER_PUSH(ra_timer.t_spillslots);
 
-       if(coalesce_spill_slots)
-       be_coalesce_spillslots(&chordal_env);
+       be_coalesce_spillslots(&chordal_env, coalesce_spill_slots);
        dump(BE_CH_DUMP_SPILLSLOTS, irg, NULL, "-spillslots", dump_ir_block_graph_sched);
 
        BE_TIMER_POP(ra_timer.t_spillslots);