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
amv->range.last_use.abs_pos, amv->spill_costs, amv->reg);
#endif
active = g_list_delete_link (active, active);
- regs = g_list_prepend (regs, (gpointer)amv->reg);
+ 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 */
g_assert (regs);
- vmv->reg = (int)regs->data;
+ vmv->reg = GPOINTER_TO_INT (regs->data);
used_regs |= 1LL << vmv->reg;
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)