committed by
GitHub
parent
b0ac74488c
commit
cde7e9483b
31
pass/isa.go
Normal file
31
pass/isa.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package pass
|
||||
|
||||
import (
|
||||
"sort"
|
||||
|
||||
"github.com/mmcloughlin/avo/ir"
|
||||
)
|
||||
|
||||
// RequiredISAExtensions determines ISA extensions required for the given
|
||||
// function. Populates the ISA field.
|
||||
func RequiredISAExtensions(fn *ir.Function) error {
|
||||
// Collect ISA set.
|
||||
set := map[string]bool{}
|
||||
for _, i := range fn.Instructions() {
|
||||
for _, isa := range i.ISA {
|
||||
set[isa] = true
|
||||
}
|
||||
}
|
||||
|
||||
if len(set) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Populate the function's ISA field with the unique sorted list.
|
||||
for isa := range set {
|
||||
fn.ISA = append(fn.ISA, isa)
|
||||
}
|
||||
sort.Strings(fn.ISA)
|
||||
|
||||
return nil
|
||||
}
|
||||
25
pass/isa_test.go
Normal file
25
pass/isa_test.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package pass
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/mmcloughlin/avo/ir"
|
||||
)
|
||||
|
||||
func TestRequiredISAExtensions(t *testing.T) {
|
||||
f := ir.NewFunction("ISAs")
|
||||
f.AddInstruction(&ir.Instruction{ISA: nil})
|
||||
f.AddInstruction(&ir.Instruction{ISA: []string{"B", "A"}})
|
||||
f.AddInstruction(&ir.Instruction{ISA: []string{"A", "C"}})
|
||||
|
||||
err := RequiredISAExtensions(f)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expect := []string{"A", "B", "C"}
|
||||
if !reflect.DeepEqual(f.ISA, expect) {
|
||||
t.FailNow()
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ var Compile = Concat(
|
||||
FunctionPass(VerifyAllocation),
|
||||
Func(IncludeTextFlagHeader),
|
||||
FunctionPass(PruneSelfMoves),
|
||||
FunctionPass(RequiredISAExtensions),
|
||||
)
|
||||
|
||||
// Interface for a processing pass.
|
||||
|
||||
Reference in New Issue
Block a user