From 56c751e7ec94e8dc9cc4b50aa196f156d6047cd1 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Fri, 3 Jul 2026 21:01:58 +0200 Subject: [PATCH] Refactored ssa value interface --- src/ssa/HasUsers.go | 12 ++++++++++++ src/ssa/Liveness.go | 3 +++ src/ssa/Value.go | 10 ++-------- src/ssa/Void.go | 3 +++ 4 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 src/ssa/HasUsers.go diff --git a/src/ssa/HasUsers.go b/src/ssa/HasUsers.go new file mode 100644 index 0000000..67dace9 --- /dev/null +++ b/src/ssa/HasUsers.go @@ -0,0 +1,12 @@ +package ssa + +type HasUsers interface { + // AddUser adds a new user of this value. + AddUser(Value) + + // RemoveUser removes an existing user of this value. + RemoveUser(Value) + + // Users returns all values that reference this value as an input. + Users() []Value +} \ No newline at end of file diff --git a/src/ssa/Liveness.go b/src/ssa/Liveness.go index 9e93578..368b6f7 100644 --- a/src/ssa/Liveness.go +++ b/src/ssa/Liveness.go @@ -5,6 +5,9 @@ type Liveness struct { users []Value } +// Force interface implementation. +var _ HasUsers = (*Liveness)(nil) + // AddUser adds a new user of the value. func (l *Liveness) AddUser(user Value) { l.users = append(l.users, user) diff --git a/src/ssa/Value.go b/src/ssa/Value.go index f514d39..81a1825 100644 --- a/src/ssa/Value.go +++ b/src/ssa/Value.go @@ -3,9 +3,6 @@ package ssa import "git.urbach.dev/cli/q/src/types" type Value interface { - // AddUser adds a new user of this value. - AddUser(Value) - // Equals check for equality which is useful for common subexpression elimination. Equals(Value) bool @@ -15,9 +12,6 @@ type Value interface { // IsPure returns true if the calculation of the value has no side effects. IsPure() bool - // RemoveUser removes an existing user of this value. - RemoveUser(Value) - // Replace replaces the uses of a value with another value. Replace(Value, Value) @@ -27,6 +21,6 @@ type Value interface { // Type returns the data type of the value. Type() types.Type - // Users returns all values that reference this value as an input. - Users() []Value + // HasUsers is an interface to track where this value is used. + HasUsers } \ No newline at end of file diff --git a/src/ssa/Void.go b/src/ssa/Void.go index c741ac5..293e818 100644 --- a/src/ssa/Void.go +++ b/src/ssa/Void.go @@ -5,6 +5,9 @@ import "git.urbach.dev/cli/q/src/types" // Void is the absence of a value. type Void struct{} +// Force interface implementation. +var _ HasUsers = (*Void)(nil) + // AddUser does nothing because a void value cannot be used as a dependency. func (v *Void) AddUser(Value) {} -- 2.51.2