Judging by only the C diff you provided, I'm very certain that the compiler PR
causing you trouble is [this](https://github.com/nim-lang/Nim/pull/23769) one.
It fixed an evaluation-order issue that your code seems to have relied on.
In Nim, evaluation order is strictly left-to-right, inside-to-outside (at least
in theory, there were still some issues last time I checked, but they might
have been fixed already). This also applies to assignments - again, in theory.
A `push(stack.pop())` template invocation expands to:
Stack[SP] = ((SP -= 1; move stack[SP]))
Run
which, in your case, gets transformed into:
`=sink`(Stack[SP], (SP -= 1; move Stack[SP]))
Run
Prior to the aforementioned PR, the call was effectively evaluated like this
(when using the C backend):
SP -= 1
let tmp = move Stack[SP]
`=sink`(Stack[sp], tmp)
Run
which is incorrect (according to the language rules), whereas now it is
(correctly) evaluated like this:
let tmp1 = addr Stack[SP]
SP -= 1
let tmp2 = move Stack[SP]
`=sink`(tmp1[], tmp2)
Run
Fortunately, the fix is simple. In your `push` template, simply assign the `v`
template parameter to a temporary first, like so:
template push(v: Value) =
let tmp = v
Stack[PC] = ensureMove tmp
PC += 1
Run
Alternatively, you could also assign `PC` to a temporary, which might result in
slightly more efficient code.