tests/fixedbugs: regression test for issue 100 (#129)

Adds a regression test based on klauspost/compress#186. This necessitated some related changes:

* Mark "RET" as a terminal instruction
* printer refactor to maintain compatibility with asmfmt
* Tweaks to other regression tests to ensure they are run correctly in CI

Updates #100 #65 #8
This commit is contained in:
Michael McLoughlin
2020-01-27 21:05:33 -08:00
committed by GitHub
parent 5a144d9b53
commit e089a6c93c
24 changed files with 11711 additions and 92 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("Issue100", NOSPLIT, "func() uint64")
x := GP64()
XORQ(x, x)
for i := 1; i <= 100; i++ {
t := GP64()
MOVQ(U32(i), t)
ADDQ(t.As64(), x)
}
Store(x, ReturnIndex(0))
RET()
Generate()
}

View File

@@ -0,0 +1,2 @@
// Package minrepro contains a minimal reproducer for the aliased register allocation bug in issue 100.
package minrepro

View File

@@ -0,0 +1,209 @@
// Code generated by command: go run asm.go -out minrepro.s -stubs stub.go. DO NOT EDIT.
#include "textflag.h"
// func Issue100() uint64
TEXT ·Issue100(SB), NOSPLIT, $0-8
XORQ AX, AX
MOVQ $0x00000001, CX
ADDQ CX, AX
MOVQ $0x00000002, CX
ADDQ CX, AX
MOVQ $0x00000003, CX
ADDQ CX, AX
MOVQ $0x00000004, CX
ADDQ CX, AX
MOVQ $0x00000005, CX
ADDQ CX, AX
MOVQ $0x00000006, CX
ADDQ CX, AX
MOVQ $0x00000007, CX
ADDQ CX, AX
MOVQ $0x00000008, CX
ADDQ CX, AX
MOVQ $0x00000009, CX
ADDQ CX, AX
MOVQ $0x0000000a, CX
ADDQ CX, AX
MOVQ $0x0000000b, CX
ADDQ CX, AX
MOVQ $0x0000000c, CX
ADDQ CX, AX
MOVQ $0x0000000d, CX
ADDQ CX, AX
MOVQ $0x0000000e, CX
ADDQ CX, AX
MOVQ $0x0000000f, CX
ADDQ CX, AX
MOVQ $0x00000010, CX
ADDQ CX, AX
MOVQ $0x00000011, CX
ADDQ CX, AX
MOVQ $0x00000012, CX
ADDQ CX, AX
MOVQ $0x00000013, CX
ADDQ CX, AX
MOVQ $0x00000014, CX
ADDQ CX, AX
MOVQ $0x00000015, CX
ADDQ CX, AX
MOVQ $0x00000016, CX
ADDQ CX, AX
MOVQ $0x00000017, CX
ADDQ CX, AX
MOVQ $0x00000018, CX
ADDQ CX, AX
MOVQ $0x00000019, CX
ADDQ CX, AX
MOVQ $0x0000001a, CX
ADDQ CX, AX
MOVQ $0x0000001b, CX
ADDQ CX, AX
MOVQ $0x0000001c, CX
ADDQ CX, AX
MOVQ $0x0000001d, CX
ADDQ CX, AX
MOVQ $0x0000001e, CX
ADDQ CX, AX
MOVQ $0x0000001f, CX
ADDQ CX, AX
MOVQ $0x00000020, CX
ADDQ CX, AX
MOVQ $0x00000021, CX
ADDQ CX, AX
MOVQ $0x00000022, CX
ADDQ CX, AX
MOVQ $0x00000023, CX
ADDQ CX, AX
MOVQ $0x00000024, CX
ADDQ CX, AX
MOVQ $0x00000025, CX
ADDQ CX, AX
MOVQ $0x00000026, CX
ADDQ CX, AX
MOVQ $0x00000027, CX
ADDQ CX, AX
MOVQ $0x00000028, CX
ADDQ CX, AX
MOVQ $0x00000029, CX
ADDQ CX, AX
MOVQ $0x0000002a, CX
ADDQ CX, AX
MOVQ $0x0000002b, CX
ADDQ CX, AX
MOVQ $0x0000002c, CX
ADDQ CX, AX
MOVQ $0x0000002d, CX
ADDQ CX, AX
MOVQ $0x0000002e, CX
ADDQ CX, AX
MOVQ $0x0000002f, CX
ADDQ CX, AX
MOVQ $0x00000030, CX
ADDQ CX, AX
MOVQ $0x00000031, CX
ADDQ CX, AX
MOVQ $0x00000032, CX
ADDQ CX, AX
MOVQ $0x00000033, CX
ADDQ CX, AX
MOVQ $0x00000034, CX
ADDQ CX, AX
MOVQ $0x00000035, CX
ADDQ CX, AX
MOVQ $0x00000036, CX
ADDQ CX, AX
MOVQ $0x00000037, CX
ADDQ CX, AX
MOVQ $0x00000038, CX
ADDQ CX, AX
MOVQ $0x00000039, CX
ADDQ CX, AX
MOVQ $0x0000003a, CX
ADDQ CX, AX
MOVQ $0x0000003b, CX
ADDQ CX, AX
MOVQ $0x0000003c, CX
ADDQ CX, AX
MOVQ $0x0000003d, CX
ADDQ CX, AX
MOVQ $0x0000003e, CX
ADDQ CX, AX
MOVQ $0x0000003f, CX
ADDQ CX, AX
MOVQ $0x00000040, CX
ADDQ CX, AX
MOVQ $0x00000041, CX
ADDQ CX, AX
MOVQ $0x00000042, CX
ADDQ CX, AX
MOVQ $0x00000043, CX
ADDQ CX, AX
MOVQ $0x00000044, CX
ADDQ CX, AX
MOVQ $0x00000045, CX
ADDQ CX, AX
MOVQ $0x00000046, CX
ADDQ CX, AX
MOVQ $0x00000047, CX
ADDQ CX, AX
MOVQ $0x00000048, CX
ADDQ CX, AX
MOVQ $0x00000049, CX
ADDQ CX, AX
MOVQ $0x0000004a, CX
ADDQ CX, AX
MOVQ $0x0000004b, CX
ADDQ CX, AX
MOVQ $0x0000004c, CX
ADDQ CX, AX
MOVQ $0x0000004d, CX
ADDQ CX, AX
MOVQ $0x0000004e, CX
ADDQ CX, AX
MOVQ $0x0000004f, CX
ADDQ CX, AX
MOVQ $0x00000050, CX
ADDQ CX, AX
MOVQ $0x00000051, CX
ADDQ CX, AX
MOVQ $0x00000052, CX
ADDQ CX, AX
MOVQ $0x00000053, CX
ADDQ CX, AX
MOVQ $0x00000054, CX
ADDQ CX, AX
MOVQ $0x00000055, CX
ADDQ CX, AX
MOVQ $0x00000056, CX
ADDQ CX, AX
MOVQ $0x00000057, CX
ADDQ CX, AX
MOVQ $0x00000058, CX
ADDQ CX, AX
MOVQ $0x00000059, CX
ADDQ CX, AX
MOVQ $0x0000005a, CX
ADDQ CX, AX
MOVQ $0x0000005b, CX
ADDQ CX, AX
MOVQ $0x0000005c, CX
ADDQ CX, AX
MOVQ $0x0000005d, CX
ADDQ CX, AX
MOVQ $0x0000005e, CX
ADDQ CX, AX
MOVQ $0x0000005f, CX
ADDQ CX, AX
MOVQ $0x00000060, CX
ADDQ CX, AX
MOVQ $0x00000061, CX
ADDQ CX, AX
MOVQ $0x00000062, CX
ADDQ CX, AX
MOVQ $0x00000063, CX
ADDQ CX, AX
MOVQ $0x00000064, CX
ADDQ CX, AX
MOVQ AX, ret+0(FP)
RET

View File

@@ -0,0 +1,15 @@
package minrepro
import (
"testing"
)
//go:generate go run asm.go -out minrepro.s -stubs stub.go
func TestIssue100(t *testing.T) {
n := uint64(100)
expect := n * (n + 1) / 2
if got := Issue100(); got != expect {
t.Fatalf("Issue100() = %v; expect %v", got, expect)
}
}

View File

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