From 52ad63bc22ade72f682bb30e35acdbbf71977fc4 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Mon, 26 Oct 2020 10:13:37 +0200 Subject: [PATCH] fix #15704 #15597 wrong VM register was freed (#15705) (cherry picked from commit d4c2e2c53ffe86a78c302d7002f6baf346540d17) --- compiler/vmgen.nim | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index f7d3aabdbf..3db143280c 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -247,6 +247,8 @@ proc freeTemp(c: PCtx; r: TRegister) = proc getTempRange(cc: PCtx; n: int; kind: TSlotKind): TRegister = # if register pressure is high, we re-use more aggressively: let c = cc.prc + # we could also customize via the following (with proper caching in ConfigRef): + # let highRegisterPressure = cc.config.getConfigVar("vm.highRegisterPressure", "40").parseInt if c.maxSlots >= HighRegisterPressure or c.maxSlots+n >= high(TRegister): for i in 0 .. c.maxSlots-n: if not c.slots[i].inUse: @@ -1533,14 +1535,14 @@ proc genAsgn(c: PCtx; le, ri: PNode; requiresCopy: bool) = let tmp = c.genx(ri) c.preventFalseAlias(le[0], opcWrObj, objR, idx, tmp) c.freeTemp(tmp) - c.freeTemp(idx) + # c.freeTemp(idx) # BUGFIX, see nkDotExpr c.freeTemp(objR) of nkDotExpr: let dest = c.genx(le.sons[0], {gfNode}) let idx = genField(c, le.sons[1]) let tmp = c.genx(ri) c.preventFalseAlias(le, opcWrObj, dest, idx, tmp) - c.freeTemp(idx) + # c.freeTemp(idx) # BUGFIX: idx is an immediate (field position), not a register c.freeTemp(tmp) c.freeTemp(dest) of nkDerefExpr, nkHiddenDeref: