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:
Michael McLoughlin
2019-04-14 14:26:28 -07:00
committed by GitHub
parent 5d3176b111
commit 57c23b967e
10 changed files with 196 additions and 25 deletions

View File

@@ -3,7 +3,6 @@ package pass_test
import (
"testing"
"github.com/mmcloughlin/avo/internal/test"
"github.com/mmcloughlin/avo/ir"
"github.com/mmcloughlin/avo/reg"
@@ -58,28 +57,5 @@ func AssertRegistersMatchSet(t *testing.T, rs []reg.Register, s reg.Set) {
}
func ConstructLiveness(t *testing.T, ctx *build.Context) *ir.Function {
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]
passes := []func(*ir.Function) error{
pass.LabelTarget,
pass.CFG,
pass.Liveness,
}
for _, p := range passes {
if err := p(fn); err != nil {
t.Fatal(err)
}
}
return fn
return BuildFunction(t, ctx, pass.LabelTarget, pass.CFG, pass.Liveness)
}