From b77d876ebbd2fd27cfbdb90481548c8249777a9f Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Thu, 3 Jul 2025 20:12:11 +0200 Subject: [PATCH] Reduced interface bloat --- src/core/CheckDeadCode.go | 11 +++++++++-- src/core/Evaluate.go | 2 +- src/ssa/Block.go | 2 +- src/ssa/HasLiveness.go | 6 ++++++ src/ssa/HasSource.go | 8 ++++++++ src/ssa/Liveness.go | 4 ++-- src/ssa/NoLiveness.go | 6 ------ src/ssa/Return.go | 1 - src/ssa/Source.go | 12 ++++-------- src/ssa/Value.go | 17 ++--------------- src/ssa2asm/GenerateAssembly.go | 4 +++- 11 files changed, 36 insertions(+), 37 deletions(-) create mode 100644 src/ssa/HasLiveness.go create mode 100644 src/ssa/HasSource.go delete mode 100644 src/ssa/NoLiveness.go diff --git a/src/core/CheckDeadCode.go b/src/core/CheckDeadCode.go index 3016dfd..66abd02 100644 --- a/src/core/CheckDeadCode.go +++ b/src/core/CheckDeadCode.go @@ -2,14 +2,21 @@ package core import ( "git.urbach.dev/cli/q/src/errors" + "git.urbach.dev/cli/q/src/ssa" ) // CheckDeadCode checks for dead values. func (f *Function) CheckDeadCode() error { for instr := range f.Values { - if instr.IsConst() && instr.CountUsers() == 0 { - return errors.New(&UnusedValue{Value: instr.String()}, f.File, instr.Start()) + if !instr.IsConst() { + continue } + + if len(instr.(ssa.HasLiveness).Users()) > 0 { + continue + } + + return errors.New(&UnusedValue{Value: instr.String()}, f.File, instr.(ssa.HasSource).Start()) } return nil diff --git a/src/core/Evaluate.go b/src/core/Evaluate.go index 81ffac0..378f28e 100644 --- a/src/core/Evaluate.go +++ b/src/core/Evaluate.go @@ -144,7 +144,7 @@ func (f *Function) Evaluate(expr *expression.Expression) (ssa.Value, error) { Encountered: param.Type().Name(), Expected: fn.Input[i].Typ.Name(), ParameterName: fn.Input[i].Name, - }, f.File, param.Start()) + }, f.File, param.(ssa.HasSource).Start()) } } diff --git a/src/ssa/Block.go b/src/ssa/Block.go index f0ff1e3..975e809 100644 --- a/src/ssa/Block.go +++ b/src/ssa/Block.go @@ -8,7 +8,7 @@ type Block struct { // Append adds a new instruction to the block. func (block *Block) Append(instr Value) Value { for _, dep := range instr.Dependencies() { - dep.AddUser(instr) + dep.(HasLiveness).AddUser(instr) } block.Instructions = append(block.Instructions, instr) diff --git a/src/ssa/HasLiveness.go b/src/ssa/HasLiveness.go new file mode 100644 index 0000000..52528bf --- /dev/null +++ b/src/ssa/HasLiveness.go @@ -0,0 +1,6 @@ +package ssa + +type HasLiveness interface { + AddUser(Value) + Users() []Value +} \ No newline at end of file diff --git a/src/ssa/HasSource.go b/src/ssa/HasSource.go new file mode 100644 index 0000000..5b614d4 --- /dev/null +++ b/src/ssa/HasSource.go @@ -0,0 +1,8 @@ +package ssa + +import "git.urbach.dev/cli/q/src/token" + +type HasSource interface { + Start() token.Position + End() token.Position +} \ No newline at end of file diff --git a/src/ssa/Liveness.go b/src/ssa/Liveness.go index 8cfd8cd..9ce8774 100644 --- a/src/ssa/Liveness.go +++ b/src/ssa/Liveness.go @@ -8,6 +8,6 @@ func (v *Liveness) AddUser(user Value) { v.users = append(v.users, user) } -func (v *Liveness) CountUsers() int { - return len(v.users) +func (v *Liveness) Users() []Value { + return v.users } \ No newline at end of file diff --git a/src/ssa/NoLiveness.go b/src/ssa/NoLiveness.go deleted file mode 100644 index 01f0b6e..0000000 --- a/src/ssa/NoLiveness.go +++ /dev/null @@ -1,6 +0,0 @@ -package ssa - -type NoLiveness struct{} - -func (a *NoLiveness) AddUser(user Value) { panic("value does not have liveness") } -func (a *NoLiveness) CountUsers() int { return 0 } \ No newline at end of file diff --git a/src/ssa/Return.go b/src/ssa/Return.go index 7735165..51f3484 100644 --- a/src/ssa/Return.go +++ b/src/ssa/Return.go @@ -11,7 +11,6 @@ type Return struct { Id Arguments Source - NoLiveness } func (a *Return) Equals(v Value) bool { diff --git a/src/ssa/Source.go b/src/ssa/Source.go index 8f6f031..28330f2 100644 --- a/src/ssa/Source.go +++ b/src/ssa/Source.go @@ -4,14 +4,10 @@ import "git.urbach.dev/cli/q/src/token" type Source token.List -func (v Source) End() token.Position { - return v[len(v)-1].End() -} - -func (v *Source) SetSource(source token.List) { - *v = Source(source) -} - func (v Source) Start() token.Position { return v[0].Position +} + +func (v Source) End() token.Position { + return v[len(v)-1].End() } \ No newline at end of file diff --git a/src/ssa/Value.go b/src/ssa/Value.go index c839f01..74c2e86 100644 --- a/src/ssa/Value.go +++ b/src/ssa/Value.go @@ -1,29 +1,16 @@ package ssa import ( - "git.urbach.dev/cli/q/src/token" "git.urbach.dev/cli/q/src/types" ) type Value interface { - // Essentials Debug(bool) string + Dependencies() []Value + Equals(Value) bool ID() int IsConst() bool SetID(int) String() string Type() types.Type - - // Arguments - Dependencies() []Value - Equals(Value) bool - - // Liveness - AddUser(Value) - CountUsers() int - - // Source - SetSource(token.List) - Start() token.Position - End() token.Position } \ No newline at end of file diff --git a/src/ssa2asm/GenerateAssembly.go b/src/ssa2asm/GenerateAssembly.go index 1781ccf..a0e3d9f 100644 --- a/src/ssa2asm/GenerateAssembly.go +++ b/src/ssa2asm/GenerateAssembly.go @@ -16,7 +16,9 @@ func (f *Compiler) GenerateAssembly(ir ssa.IR, isLeaf bool) { } for instr := range ir.Values { - if instr.CountUsers() != 0 { + live, isLive := instr.(ssa.HasLiveness) + + if isLive && len(live.Users()) > 0 { continue }