From d87ad00b5f32e5b5eb836a078dbcb6f0bc40fc71 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Thu, 27 Aug 2026 22:56:14 +0200 Subject: [PATCH] Fixed orphaned values during dead code removal --- src/core/removeDeadCode.go | 30 ++++++++++++++++++------------ tests/dead-value-orphan.q | 13 +++++++++++++ tests/tests_test.go | 1 + 3 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 tests/dead-value-orphan.q diff --git a/src/core/removeDeadCode.go b/src/core/removeDeadCode.go index 61d0f3f..59bd52a 100644 --- a/src/core/removeDeadCode.go +++ b/src/core/removeDeadCode.go @@ -8,23 +8,29 @@ import ( // removeDeadCode checks for dead values and also removes the ones that are partially allowed. func (f *Function) removeDeadCode(folded map[ssa.Value]struct{}) error { - var errors []error + for { + count := f.CountValues() - for _, block := range f.Blocks { - for i, value := range slices.Backward(block.Instructions) { - err := f.removeDeadValue(block, i, value, folded) + for _, block := range slices.Backward(f.Blocks) { + var errors []error - if err != nil { - errors = append(errors, err) + for i, value := range slices.Backward(block.Instructions) { + err := f.removeDeadValue(block, i, value, folded) + + if err != nil { + errors = append(errors, err) + } + } + + if len(errors) > 0 { + return errors[len(errors)-1] } - } - if len(errors) > 0 { - return errors[len(errors)-1] + block.RemoveNilValues() } - block.RemoveNilValues() + if f.CountValues() == count { + return nil + } } - - return nil } \ No newline at end of file diff --git a/tests/dead-value-orphan.q b/tests/dead-value-orphan.q new file mode 100644 index 0000000..5c4e3a5 --- /dev/null +++ b/tests/dead-value-orphan.q @@ -0,0 +1,13 @@ +main() { + total := 0 + + loop i := 0..4 { + total += i + } + + total += 1 + total += 2 + assert 1 == 1 + total += 3 + total += 4 +} \ No newline at end of file diff --git a/tests/tests_test.go b/tests/tests_test.go index 405410c..df76895 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -195,6 +195,7 @@ var tests = []run{ {"spill-operands", nil, "", "70", 0}, {"dead-value", nil, "", "", 0}, {"dead-value-load", nil, "", "", 0}, + {"dead-value-orphan", nil, "", "", 0}, } func TestTests(t *testing.T) { -- 2.51.2