From 4d5da123b34ebbf9b7960aea9b5925419a4b064a Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 1 Mar 2022 21:19:56 -0500 Subject: [PATCH] [mono][jit] Fix an assert in the local register allocator. The assertion is hit when an instruction has a fixed sreg (like shifts on x86) which was spilled to the stack. --- src/mono/mono/mini/mini-codegen.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/mono/mono/mini/mini-codegen.c b/src/mono/mono/mini/mini-codegen.c index 171520d2818c1..b79910c13d9c4 100644 --- a/src/mono/mono/mini/mini-codegen.c +++ b/src/mono/mono/mini/mini-codegen.c @@ -1436,6 +1436,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb) continue; } + gboolean need_assign = FALSE; if (rs->ifree_mask & (regmask (dest_sreg))) { if (is_global_ireg (sreg)) { int k; @@ -1454,8 +1455,8 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb) DEBUG (printf ("\tshortcut assignment of R%d to %s\n", sreg, mono_arch_regname (dest_sreg))); assign_reg (cfg, rs, sreg, dest_sreg, 0); } else if (val < -1) { - /* FIXME: */ - g_assert_not_reached (); + /* sreg is spilled, it can be assigned to dest_sreg */ + need_assign = TRUE; } else { /* Argument already in hard reg, need to copy */ MonoInst *copy = create_copy_ins (cfg, bb, tmp, dest_sreg, val, NULL, ip, 0); @@ -1476,9 +1477,9 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb) } } else { gboolean need_spill = TRUE; - gboolean need_assign = TRUE; int k; + need_assign = TRUE; dreg_mask &= ~ (regmask (dest_sreg)); for (k = 0; k < num_sregs; ++k) { if (k != j) @@ -1538,18 +1539,17 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb) if (need_spill) { free_up_hreg (cfg, bb, tmp, ins, dest_sreg, 0); } + } + if (need_assign) { + if (rs->vassign [sreg] < -1) { + int spill; - if (need_assign) { - if (rs->vassign [sreg] < -1) { - int spill; - - /* Need to emit a spill store */ - spill = - rs->vassign [sreg] - 1; - create_spilled_store (cfg, bb, spill, dest_sreg, sreg, tmp, NULL, ins, bank); - } - /* force-set sreg2 */ - assign_reg (cfg, rs, sregs [j], dest_sreg, 0); + /* Need to emit a spill store */ + spill = - rs->vassign [sreg] - 1; + create_spilled_store (cfg, bb, spill, dest_sreg, sreg, tmp, NULL, ins, bank); } + /* force-set sreg */ + assign_reg (cfg, rs, sregs [j], dest_sreg, 0); } sregs [j] = dest_sreg; }