inst,ir: cancelling inputs (#92)

Adds support for a `CancellingInputs` instruction flag, to indicate cases like `XORQ R10, R10` where the instruction actually does not depend on the value of `R10` at all.

Closes #89
This commit is contained in:
Michael McLoughlin
2019-07-28 17:58:49 -07:00
committed by GitHub
parent 8f97788836
commit d43efabdbe
16 changed files with 970 additions and 392 deletions

View File

@@ -0,0 +1,22 @@
// +build ignore
package main
import (
. "github.com/mmcloughlin/avo/build"
. "github.com/mmcloughlin/avo/operand"
)
func main() {
TEXT("Issue89", NOSPLIT, "func() uint64")
x := GP64()
MOVQ(U32(42), x)
for i := 0; i < 100; i++ {
zero := GP64()
XORQ(zero, zero)
ADDQ(zero, x)
}
Store(x, ReturnIndex(0))
RET()
Generate()
}

View File

@@ -0,0 +1,2 @@
// Package issue89 tests register allocation with self-cancelling inputs.
package issue89

View File

@@ -0,0 +1,209 @@
// Code generated by command: go run asm.go -out issue89.s -stubs stub.go. DO NOT EDIT.
#include "textflag.h"
// func Issue89() uint64
TEXT ·Issue89(SB), NOSPLIT, $0-8
MOVQ $0x0000002a, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
XORQ CX, CX
ADDQ CX, AX
MOVQ AX, ret+0(FP)
RET

View File

@@ -0,0 +1,13 @@
package issue89
import (
"testing"
)
//go:generate go run asm.go -out issue89.s -stubs stub.go
func TestIssue89(t *testing.T) {
if Issue89() != 42 {
t.FailNow()
}
}

View File

@@ -0,0 +1,5 @@
// Code generated by command: go run asm.go -out issue89.s -stubs stub.go. DO NOT EDIT.
package issue89
func Issue89() uint64