diff --git a/src/core/errors_test.go b/src/core/errors_test.go index 9b677ee..cff2d5b 100644 --- a/src/core/errors_test.go +++ b/src/core/errors_test.go @@ -115,7 +115,7 @@ var errs = []struct { {"UnusedValue2.q", &core.UnusedValue{Value: "2 + 3"}}, {"UnusedValue3.q", &core.UnusedValue{Value: "\"not used\""}}, {"UnusedValue4.q", &core.UnusedValue{Value: "1"}}, - {"UnusedValue5.q", &core.UnusedValue{Value: "x + 1"}}, + {"UnusedValue5.q", &core.UnusedValue{Value: "x - 1"}}, {"UnusedValue6.q", &core.UnusedValue{Value: "x2"}}, {"VariableAlreadyExists.q", &core.VariableAlreadyExists{Name: "x"}}, {"VariableAlreadyExists2.q", &core.VariableAlreadyExists{Name: "x"}}, diff --git a/src/core/removeDeadValue.go b/src/core/removeDeadValue.go index b7aeca8..a5ec706 100644 --- a/src/core/removeDeadValue.go +++ b/src/core/removeDeadValue.go @@ -23,25 +23,11 @@ func (f *Function) removeDeadValue(block *ssa.Block, i int, value ssa.Value, fol return nil } - phi, isPhi := value.(*ssa.Phi) - deadPhi := phi + _, isPhi := value.(*ssa.Phi) - for isPhi { - if phi.IsPartiallyUndefined() { - block.RemoveAt(i) - return nil - } - - value = phi.FirstDefined() - phi, isPhi = value.(*ssa.Phi) - } - - if deadPhi != nil { - for _, user := range value.Users() { - if user != deadPhi { - return nil - } - } + if isPhi { + block.RemoveAt(i) + return nil } structure, isFieldOfStruct := f.valueToStruct[value] diff --git a/tests/phi-dead.q b/tests/phi-dead.q new file mode 100644 index 0000000..d5bb0c3 --- /dev/null +++ b/tests/phi-dead.q @@ -0,0 +1,19 @@ +main() { + assert f(-42) == -42 +} + +f(b int) -> int { + a := 1 + + if b >= 0 { + // ... + } else { + if a <= 1 { + a = 0 + } else { + b = -21 + } + } + + return b +} \ No newline at end of file diff --git a/tests/tests_test.go b/tests/tests_test.go index bc6dee5..4bfd7e9 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -60,6 +60,7 @@ var tests = []run{ {"phi-reassign-copy", nil, "", "", 0}, {"phi-move-cycle", nil, "", "0\n14\n0\n", 0}, {"phi-move-reorder", nil, "", "0\n14\n0\n", 0}, + {"phi-dead", nil, "", "", 0}, {"min", nil, "", "", 0}, {"max", nil, "", "", 0}, {"hello", nil, "", "Hello\nHello\nHello\n", 0},