From e7704c8d005a07bfc90f0f6d280a0399f3d36495 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Fri, 29 Aug 2025 14:16:15 +0200 Subject: [PATCH] Fixed infinite loop during liveness analysis --- src/codegen/markAlive.go | 10 ++++++++-- tests/loop-infinite-lifetime.q | 9 +++++++++ tests/tests_test.go | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 tests/loop-infinite-lifetime.q diff --git a/src/codegen/markAlive.go b/src/codegen/markAlive.go index 625afa4..8f10adb 100644 --- a/src/codegen/markAlive.go +++ b/src/codegen/markAlive.go @@ -46,8 +46,14 @@ func (f *Function) markAlive(live *Step, block *ssa.Block, use *Step) { } for _, pre := range block.Predecessors { - if pre.CanReachPredecessor(live.Block) { - f.markAlive(live, pre, use) + if pre == block { + continue + } + + if !pre.CanReachPredecessor(live.Block) { + continue } + + f.markAlive(live, pre, use) } } \ No newline at end of file diff --git a/tests/loop-infinite-lifetime.q b/tests/loop-infinite-lifetime.q new file mode 100644 index 0000000..fb68bcc --- /dev/null +++ b/tests/loop-infinite-lifetime.q @@ -0,0 +1,9 @@ +main() { + x := 0 + + loop { + f(x) + } +} + +f(_ int) {} \ No newline at end of file diff --git a/tests/tests_test.go b/tests/tests_test.go index 349619d..53ee956 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -61,6 +61,7 @@ var tests = []run{ {"loop-copy-from", "", "", 0}, {"loop-copy-until", "", "", 0}, {"loop-modify-struct", "", "12345", 0}, + {"loop-infinite-lifetime", "", "", -1}, {"factorial", "", "", 0}, {"fibonacci", "", "", 0}, {"memory", "", "Hello\n", 0}, -- 2.51.2