Skip to content

Commit 52ad63b

Browse files
timotheecournarimiran
authored andcommitted
fix #15704 #15597 wrong VM register was freed (#15705)
(cherry picked from commit d4c2e2c)
1 parent 9807362 commit 52ad63b

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

compiler/vmgen.nim

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@ proc freeTemp(c: PCtx; r: TRegister) =
247247
proc getTempRange(cc: PCtx; n: int; kind: TSlotKind): TRegister =
248248
# if register pressure is high, we re-use more aggressively:
249249
let c = cc.prc
250+
# we could also customize via the following (with proper caching in ConfigRef):
251+
# let highRegisterPressure = cc.config.getConfigVar("vm.highRegisterPressure", "40").parseInt
250252
if c.maxSlots >= HighRegisterPressure or c.maxSlots+n >= high(TRegister):
251253
for i in 0 .. c.maxSlots-n:
252254
if not c.slots[i].inUse:
@@ -1533,14 +1535,14 @@ proc genAsgn(c: PCtx; le, ri: PNode; requiresCopy: bool) =
15331535
let tmp = c.genx(ri)
15341536
c.preventFalseAlias(le[0], opcWrObj, objR, idx, tmp)
15351537
c.freeTemp(tmp)
1536-
c.freeTemp(idx)
1538+
# c.freeTemp(idx) # BUGFIX, see nkDotExpr
15371539
c.freeTemp(objR)
15381540
of nkDotExpr:
15391541
let dest = c.genx(le.sons[0], {gfNode})
15401542
let idx = genField(c, le.sons[1])
15411543
let tmp = c.genx(ri)
15421544
c.preventFalseAlias(le, opcWrObj, dest, idx, tmp)
1543-
c.freeTemp(idx)
1545+
# c.freeTemp(idx) # BUGFIX: idx is an immediate (field position), not a register
15441546
c.freeTemp(tmp)
15451547
c.freeTemp(dest)
15461548
of nkDerefExpr, nkHiddenDeref:

0 commit comments

Comments
 (0)