pass: some basic allocator test cases

This commit is contained in:
Michael McLoughlin
2018-12-28 15:48:37 -08:00
parent 238771f86f
commit a1440c51a4
2 changed files with 51 additions and 1 deletions

View File

@@ -64,11 +64,15 @@ func (a *Allocator) Add(r reg.Register) {
} }
func (a *Allocator) Allocate() (reg.Allocation, error) { func (a *Allocator) Allocate() (reg.Allocation, error) {
for a.remaining() > 0 { for {
if err := a.update(); err != nil { if err := a.update(); err != nil {
return nil, err return nil, err
} }
if a.remaining() == 0 {
break
}
v := a.mostrestricted() v := a.mostrestricted()
if err := a.alloc(v); err != nil { if err := a.alloc(v); err != nil {
return nil, err return nil, err

46
pass/alloc_test.go Normal file
View File

@@ -0,0 +1,46 @@
package pass
import (
"testing"
"github.com/mmcloughlin/avo/reg"
)
func TestAllocatorSimple(t *testing.T) {
c := reg.NewCollection()
x, y := c.Xv(), c.Yv()
a, err := NewAllocatorForKind(reg.SSEAVX)
if err != nil {
t.Fatal(err)
}
a.Add(x)
a.Add(y)
a.AddInterference(x, y)
alloc, err := a.Allocate()
if err != nil {
t.Fatal(err)
}
t.Log(alloc)
if alloc[x] != reg.X0 || alloc[y] != reg.Y1 {
t.Fatalf("unexpected allocation")
}
}
func TestAllocatorImpossible(t *testing.T) {
a, err := NewAllocatorForKind(reg.SSEAVX)
if err != nil {
t.Fatal(err)
}
a.AddInterference(reg.X7, reg.Z7)
_, err = a.Allocate()
if err == nil {
t.Fatal("expected allocation error")
}
}