return NULL;
}
-//#define DEBUG_LSCAN
+// #define DEBUG_LSCAN
void
mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_mask)
max_regs = g_list_length (regs);
for (l = regs; l; l = l->next) {
- int regnum = (int)l->data;
+ int regnum = GPOINTER_TO_INT (l->data);
g_assert (regnum < G_N_ELEMENTS (gains));
gains [regnum] = 0;
}
while (active) {
amv = (MonoMethodVar *)active->data;
- if (amv->range.last_use.abs_pos >= vmv->range.first_use.abs_pos)
+ if (amv->range.last_use.abs_pos > vmv->range.first_use.abs_pos)
break;
#ifdef DEBUG_LSCAN
printf ("EXPIR %2d %08x %08x C%d R%d\n", amv->idx, amv->range.first_use.abs_pos,
amv->range.last_use.abs_pos, amv->spill_costs, amv->reg);
#endif
- active = g_list_remove_link (active, active);
- regs = g_list_prepend (regs, (gpointer)amv->reg);
+ active = g_list_delete_link (active, active);
+ regs = g_list_prepend (regs, GINT_TO_POINTER (amv->reg));
gains [amv->reg] += amv->spill_costs;
}
-
+
if (active && g_list_length (active) == max_regs) {
/* Spill */
(!cost_driven && amv->range.last_use.abs_pos > vmv->range.last_use.abs_pos)) {
vmv->reg = amv->reg;
amv->reg = -1;
- active = g_list_remove_link (active, a);
+ active = g_list_delete_link (active, a);
if (cost_driven)
active = mono_varlist_insert_sorted (cfg, active, vmv, 2);
g_assert (regs);
- vmv->reg = (int)regs->data;
+ vmv->reg = GPOINTER_TO_INT (regs->data);
used_regs |= 1LL << vmv->reg;
- regs = g_list_remove_link (regs, regs);
+ regs = g_list_delete_link (regs, regs);
#ifdef DEBUG_LSCAN
printf ("ADD %2d %08x %08x C%d R%d\n", vmv->idx,
vmv = l->data;
if (vmv->reg >= 0) {
- if (gains [vmv->reg] > mono_arch_regalloc_cost (cfg, vmv)) {
+ if ((gains [vmv->reg] > mono_arch_regalloc_cost (cfg, vmv)) && (cfg->varinfo [vmv->idx]->opcode != OP_REGVAR)) {
cfg->varinfo [vmv->idx]->opcode = OP_REGVAR;
cfg->varinfo [vmv->idx]->dreg = vmv->reg;
if (cfg->verbose_level > 2)
*used_mask |= used_regs;
+#ifdef DEBUG_LSCAN
+ if (cfg->verbose_level > 2)
+ printf ("EXIT: final used mask: %08x\n", *used_mask);
+#endif
+
g_list_free (regs);
g_list_free (active);
g_list_free (vars);