Fixed incorrect register lifetime in for loops

This commit is contained in:
2025-03-09 17:51:24 +01:00
parent 947a8db937
commit 016938932f
4 changed files with 32 additions and 2 deletions

View File

@ -90,7 +90,8 @@ func (c *compiler) compileX86(x asm.Instruction) {
c.jump(x)
case asm.LABEL:
c.codeLabels[x.Data.(*asm.Label).Name] = Address(len(c.code))
label := x.Data.(*asm.Label)
c.codeLabels[label.Name] = Address(len(c.code))
case asm.LOAD:
c.load(x)

View File

@ -81,11 +81,13 @@ func (f *Function) CompileFor(loop *ast.For) error {
case *eval.Register:
if value.IsAlive() {
tmp := f.NewRegister()
f.RegisterRegister(asm.MOVE, tmp, value.Register)
defer f.FreeRegister(tmp)
f.RegisterRegister(asm.MOVE, tmp, value.Register)
f.AddLabel(label)
f.RegisterRegister(asm.COMPARE, counter, tmp)
} else {
f.UseRegister(value.Register)
defer f.FreeRegister(value.Register)
f.AddLabel(label)
f.RegisterRegister(asm.COMPARE, counter, value.Register)
}

View File

@ -0,0 +1,26 @@
main() {
for i := 0..10 {
assert fib1(i) == fib2(i)
}
}
fib1(n int) -> int {
b := 0
c := 1
for 0..n {
a := b
b = c
c = a + b
}
return b
}
fib2(n int) -> int {
if n <= 1 {
return n
}
return fib2(n - 1) + fib2(n - 2)
}

View File

@ -62,6 +62,7 @@ var programs = []struct {
{"loop-lifetime", 0},
{"loop-in-loop", 0},
{"for", 0},
{"fibonacci", 0},
{"memory-free", 0},
{"out-of-memory", 0},
{"index-static", 0},