pass: add PruneSelfMoves cleanup pass (#80)
In some cases natural use of abstraction in avo programs can lead to redundant move instructions, specifically self-moves such as MOVQ AX, AX. This does not produce incorrect code but it is incorrect and inelegant. This diff introduces a PruneSelfMoves pass that removes such unnecessary instructions. Closes #76
This commit is contained in:
committed by
GitHub
parent
5d3176b111
commit
57c23b967e
36
pass/util_test.go
Normal file
36
pass/util_test.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package pass_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mmcloughlin/avo/build"
|
||||
"github.com/mmcloughlin/avo/internal/test"
|
||||
"github.com/mmcloughlin/avo/ir"
|
||||
"github.com/mmcloughlin/avo/pass"
|
||||
)
|
||||
|
||||
// BuildFunction is a helper to compile a build context containing a single
|
||||
// function and (optionally) apply a list of FunctionPasses to it.
|
||||
func BuildFunction(t *testing.T, ctx *build.Context, passes ...pass.FunctionPass) *ir.Function {
|
||||
t.Helper()
|
||||
|
||||
f, err := ctx.Result()
|
||||
if err != nil {
|
||||
build.LogError(test.Logger(t), err, 0)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
fns := f.Functions()
|
||||
if len(fns) != 1 {
|
||||
t.Fatalf("expect 1 function")
|
||||
}
|
||||
fn := fns[0]
|
||||
|
||||
for _, p := range passes {
|
||||
if err := p(fn); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
return fn
|
||||
}
|
||||
Reference in New Issue
Block a user