pass: some basic allocator test cases
This commit is contained in:
@@ -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
46
pass/alloc_test.go
Normal 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")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user