From 016938932f3ea02cc2709b07144799bc0604d91a Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Sun, 9 Mar 2025 17:51:24 +0100 Subject: [PATCH] Fixed incorrect register lifetime in for loops --- src/asmc/compileX86.go | 3 ++- src/core/CompileFor.go | 4 +++- tests/programs/fibonacci.q | 26 ++++++++++++++++++++++++++ tests/programs_test.go | 1 + 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 tests/programs/fibonacci.q diff --git a/src/asmc/compileX86.go b/src/asmc/compileX86.go index b4279de..13ee381 100644 --- a/src/asmc/compileX86.go +++ b/src/asmc/compileX86.go @@ -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) diff --git a/src/core/CompileFor.go b/src/core/CompileFor.go index 973c6f6..0d1530f 100644 --- a/src/core/CompileFor.go +++ b/src/core/CompileFor.go @@ -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) } diff --git a/tests/programs/fibonacci.q b/tests/programs/fibonacci.q new file mode 100644 index 0000000..a930713 --- /dev/null +++ b/tests/programs/fibonacci.q @@ -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) +} \ No newline at end of file diff --git a/tests/programs_test.go b/tests/programs_test.go index a1e76ce..cfb6d2a 100644 --- a/tests/programs_test.go +++ b/tests/programs_test.go @@ -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},