Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / linear-scan.c
index 4be9f982e5eba95e346f9c0a38b5f79fd25c8ce2..998c082c284b93d6b6d56e00c040f5c20d32aab5 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * liveness.c: liveness analysis
+/**
+ * \file
+ * liveness analysis
  *
  * Author:
  *   Dietmar Maurer (dietmar@ximian.com)
@@ -9,6 +10,9 @@
 
 #include "mini.h"
 #include <mono/metadata/debug-helpers.h>
+#include <mono/utils/mono-compiler.h>
+
+#ifndef DISABLE_JIT
 
 static void mono_linear_scan2 (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_mask);
 
@@ -21,7 +25,7 @@ mono_varlist_insert_sorted (MonoCompile *cfg, GList *list, MonoMethodVar *mv, in
                return g_list_prepend (NULL, mv);
 
        for (l = list; l; l = l->next) {
-               MonoMethodVar *v1 = l->data;
+               MonoMethodVar *v1 = (MonoMethodVar *)l->data;
                
                if (sort_type == 2) {
                        if (mv->spill_costs >= v1->spill_costs) {
@@ -78,10 +82,12 @@ mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_ma
        regmask_t used_regs = 0;
        gboolean cost_driven;
 
-       if (vars && (((MonoMethodVar*)vars->data)->interval != NULL)) {
-               mono_linear_scan2 (cfg, vars, regs, used_mask);
-               return;
-       }
+       if (!cfg->disable_reuse_registers && vars && (((MonoMethodVar*)vars->data)->interval != NULL)) {
+               mono_linear_scan2 (cfg, vars, regs, used_mask);
+               g_list_free (regs);
+               g_list_free (vars);
+               return;
+       }
 
        cost_driven = TRUE;
 
@@ -106,7 +112,7 @@ mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_ma
 
        /* linear scan */
        for (l = vars; l; l = l->next) {
-               vmv = l->data;
+               vmv = (MonoMethodVar *)l->data;
 
 #ifdef DEBUG_LSCAN
                printf ("START  %2d %08x %08x\n",  vmv->idx, vmv->range.first_use.abs_pos, 
@@ -197,7 +203,7 @@ mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_ma
 
        n_regvars = 0;
        for (l = vars; l; l = l->next) {
-               vmv = l->data;
+               vmv = (MonoMethodVar *)l->data;
                
                if (vmv->reg >= 0)  {
                        if ((gains [vmv->reg] > mono_arch_regalloc_cost (cfg, vmv)) && (cfg->varinfo [vmv->idx]->opcode != OP_REGVAR)) {
@@ -220,12 +226,12 @@ mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_ma
                }
        }
 
-       mono_jit_stats.regvars += n_regvars;
+       cfg->stat_n_regvars = n_regvars;
 
        /* Compute used regs */
        used_regs = 0;
        for (l = vars; l; l = l->next) {
-               vmv = l->data;
+               vmv = (MonoMethodVar *)l->data;
                
                if (vmv->reg >= 0)
                        used_regs |= 1LL << vmv->reg;
@@ -286,7 +292,7 @@ mono_linear_scan2 (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_m
        int n_regs, n_regvars, i;
 
        for (l = vars; l; l = l->next) {
-               vmv = l->data;
+               vmv = (MonoMethodVar *)l->data;
                LSCAN_DEBUG (printf ("VAR R%d %08x %08x C%d\n", cfg->varinfo [vmv->idx]->dreg, vmv->range.first_use.abs_pos, 
                                                         vmv->range.last_use.abs_pos, vmv->spill_costs));
        }
@@ -300,7 +306,7 @@ mono_linear_scan2 (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_m
        inactive = NULL;
 
        while (unhandled) {
-               MonoMethodVar *current = unhandled->data;
+               MonoMethodVar *current = (MonoMethodVar *)unhandled->data;
                int pos, reg, max_free_pos;
                gboolean changed;
 
@@ -468,7 +474,7 @@ mono_linear_scan2 (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_m
        /* Do the actual register assignment */
        n_regvars = 0;
        for (l = vars; l; l = l->next) {
-               vmv = l->data;
+               vmv = (MonoMethodVar *)l->data;
 
                if (vmv->reg >= 0) {
                        int reg_index = vmv->reg;
@@ -491,12 +497,12 @@ mono_linear_scan2 (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_m
                }
        }
 
-       mono_jit_stats.regvars += n_regvars;
+       cfg->stat_n_regvars = n_regvars;
 
        /* Compute used regs */
        used_regs = 0;
        for (l = vars; l; l = l->next) {
-               vmv = l->data;
+               vmv = (MonoMethodVar *)l->data;
                
                if (vmv->reg >= 0)
                        used_regs |= 1LL << vmv->reg;
@@ -507,3 +513,9 @@ mono_linear_scan2 (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_m
        g_list_free (active);
        g_list_free (inactive);
 }
+
+#else /* !DISABLE_JIT */
+
+MONO_EMPTY_SOURCE_FILE (linear_scan);
+
+#endif /* !DISABLE_JIT */