pass: first attempt at register allocation
This commit is contained in:
27
reg/set.go
27
reg/set.go
@@ -1,7 +1,7 @@
|
||||
package reg
|
||||
|
||||
// Set is a set of registers.
|
||||
type Set map[ID]Register
|
||||
type Set map[Register]bool
|
||||
|
||||
// NewEmptySet builds an empty register set.
|
||||
func NewEmptySet() Set {
|
||||
@@ -20,7 +20,7 @@ func NewSetFromSlice(rs []Register) Set {
|
||||
// Clone returns a copy of s.
|
||||
func (s Set) Clone() Set {
|
||||
c := NewEmptySet()
|
||||
for _, r := range s {
|
||||
for r := range s {
|
||||
c.Add(r)
|
||||
}
|
||||
return c
|
||||
@@ -28,17 +28,17 @@ func (s Set) Clone() Set {
|
||||
|
||||
// Add r to s.
|
||||
func (s Set) Add(r Register) {
|
||||
s[r.ID()] = r
|
||||
s[r] = true
|
||||
}
|
||||
|
||||
// Discard removes r from s, if present.
|
||||
func (s Set) Discard(r Register) {
|
||||
delete(s, r.ID())
|
||||
delete(s, r)
|
||||
}
|
||||
|
||||
// Update adds every register in t to s.
|
||||
func (s Set) Update(t Set) {
|
||||
for _, r := range t {
|
||||
for r := range t {
|
||||
s.Add(r)
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,7 @@ func (s Set) Difference(t Set) Set {
|
||||
|
||||
// DifferenceUpdate removes every element of t from s.
|
||||
func (s Set) DifferenceUpdate(t Set) {
|
||||
for _, r := range t {
|
||||
for r := range t {
|
||||
s.Discard(r)
|
||||
}
|
||||
}
|
||||
@@ -62,10 +62,21 @@ func (s Set) Equals(t Set) bool {
|
||||
if len(s) != len(t) {
|
||||
return false
|
||||
}
|
||||
for _, r := range s {
|
||||
if _, found := t[r.ID()]; !found {
|
||||
for r := range s {
|
||||
if _, found := t[r]; !found {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// OfKind returns the set of elements of s with kind k.
|
||||
func (s Set) OfKind(k Kind) Set {
|
||||
t := NewEmptySet()
|
||||
for r := range s {
|
||||
if r.Kind() == k {
|
||||
t.Add(r)
|
||||
}
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user