Commit 4c5459da authored by Keith Randall's avatar Keith Randall

[dev.ssa] cmd/compile: fix build

Some tests make multiple Funcs per Config at once.
With value & block caching, we can't do that any more.

Change-Id: Ibdb60aa2fcf478f1726b3be0fcaa06b04433eb67
Reviewed-on: https://go-review.googlesource.com/19081Reviewed-by: default avatarKeith Randall <khr@golang.org>
parent 2f57d0fe
...@@ -224,6 +224,7 @@ func buildssa(fn *Node) *ssa.Func { ...@@ -224,6 +224,7 @@ func buildssa(fn *Node) *ssa.Func {
} }
if nerrors > 0 { if nerrors > 0 {
s.f.Free()
return nil return nil
} }
......
...@@ -139,8 +139,7 @@ type fun struct { ...@@ -139,8 +139,7 @@ type fun struct {
// supplied to one of the Bloc functions. Each of the bloc names and // supplied to one of the Bloc functions. Each of the bloc names and
// valu names should be unique across the Fun. // valu names should be unique across the Fun.
func Fun(c *Config, entry string, blocs ...bloc) fun { func Fun(c *Config, entry string, blocs ...bloc) fun {
f := new(Func) f := c.NewFunc()
f.Config = c
blocks := make(map[string]*Block) blocks := make(map[string]*Block)
values := make(map[string]*Value) values := make(map[string]*Value)
// Create all the blocks and values. // Create all the blocks and values.
...@@ -282,11 +281,10 @@ func TestArgs(t *testing.T) { ...@@ -282,11 +281,10 @@ func TestArgs(t *testing.T) {
} }
func TestEquiv(t *testing.T) { func TestEquiv(t *testing.T) {
c := testConfig(t)
equivalentCases := []struct{ f, g fun }{ equivalentCases := []struct{ f, g fun }{
// simple case // simple case
{ {
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("a", OpConst64, TypeInt64, 14, nil), Valu("a", OpConst64, TypeInt64, 14, nil),
Valu("b", OpConst64, TypeInt64, 26, nil), Valu("b", OpConst64, TypeInt64, 26, nil),
...@@ -295,7 +293,7 @@ func TestEquiv(t *testing.T) { ...@@ -295,7 +293,7 @@ func TestEquiv(t *testing.T) {
Goto("exit")), Goto("exit")),
Bloc("exit", Bloc("exit",
Exit("mem"))), Exit("mem"))),
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("a", OpConst64, TypeInt64, 14, nil), Valu("a", OpConst64, TypeInt64, 14, nil),
Valu("b", OpConst64, TypeInt64, 26, nil), Valu("b", OpConst64, TypeInt64, 26, nil),
...@@ -307,7 +305,7 @@ func TestEquiv(t *testing.T) { ...@@ -307,7 +305,7 @@ func TestEquiv(t *testing.T) {
}, },
// block order changed // block order changed
{ {
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("a", OpConst64, TypeInt64, 14, nil), Valu("a", OpConst64, TypeInt64, 14, nil),
Valu("b", OpConst64, TypeInt64, 26, nil), Valu("b", OpConst64, TypeInt64, 26, nil),
...@@ -316,7 +314,7 @@ func TestEquiv(t *testing.T) { ...@@ -316,7 +314,7 @@ func TestEquiv(t *testing.T) {
Goto("exit")), Goto("exit")),
Bloc("exit", Bloc("exit",
Exit("mem"))), Exit("mem"))),
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("exit", Bloc("exit",
Exit("mem")), Exit("mem")),
Bloc("entry", Bloc("entry",
...@@ -338,26 +336,26 @@ func TestEquiv(t *testing.T) { ...@@ -338,26 +336,26 @@ func TestEquiv(t *testing.T) {
differentCases := []struct{ f, g fun }{ differentCases := []struct{ f, g fun }{
// different shape // different shape
{ {
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Goto("exit")), Goto("exit")),
Bloc("exit", Bloc("exit",
Exit("mem"))), Exit("mem"))),
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Exit("mem"))), Exit("mem"))),
}, },
// value order changed // value order changed
{ {
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Valu("b", OpConst64, TypeInt64, 26, nil), Valu("b", OpConst64, TypeInt64, 26, nil),
Valu("a", OpConst64, TypeInt64, 14, nil), Valu("a", OpConst64, TypeInt64, 14, nil),
Exit("mem"))), Exit("mem"))),
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Valu("a", OpConst64, TypeInt64, 14, nil), Valu("a", OpConst64, TypeInt64, 14, nil),
...@@ -366,12 +364,12 @@ func TestEquiv(t *testing.T) { ...@@ -366,12 +364,12 @@ func TestEquiv(t *testing.T) {
}, },
// value auxint different // value auxint different
{ {
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Valu("a", OpConst64, TypeInt64, 14, nil), Valu("a", OpConst64, TypeInt64, 14, nil),
Exit("mem"))), Exit("mem"))),
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Valu("a", OpConst64, TypeInt64, 26, nil), Valu("a", OpConst64, TypeInt64, 26, nil),
...@@ -379,12 +377,12 @@ func TestEquiv(t *testing.T) { ...@@ -379,12 +377,12 @@ func TestEquiv(t *testing.T) {
}, },
// value aux different // value aux different
{ {
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Valu("a", OpConst64, TypeInt64, 0, 14), Valu("a", OpConst64, TypeInt64, 0, 14),
Exit("mem"))), Exit("mem"))),
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Valu("a", OpConst64, TypeInt64, 0, 26), Valu("a", OpConst64, TypeInt64, 0, 26),
...@@ -392,14 +390,14 @@ func TestEquiv(t *testing.T) { ...@@ -392,14 +390,14 @@ func TestEquiv(t *testing.T) {
}, },
// value args different // value args different
{ {
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Valu("a", OpConst64, TypeInt64, 14, nil), Valu("a", OpConst64, TypeInt64, 14, nil),
Valu("b", OpConst64, TypeInt64, 26, nil), Valu("b", OpConst64, TypeInt64, 26, nil),
Valu("sum", OpAdd64, TypeInt64, 0, nil, "a", "b"), Valu("sum", OpAdd64, TypeInt64, 0, nil, "a", "b"),
Exit("mem"))), Exit("mem"))),
Fun(c, "entry", Fun(testConfig(t), "entry",
Bloc("entry", Bloc("entry",
Valu("mem", OpInitMem, TypeMem, 0, ".mem"), Valu("mem", OpInitMem, TypeMem, 0, ".mem"),
Valu("a", OpConst64, TypeInt64, 0, nil), Valu("a", OpConst64, TypeInt64, 0, nil),
......
...@@ -12,16 +12,22 @@ func TestShiftConstAMD64(t *testing.T) { ...@@ -12,16 +12,22 @@ func TestShiftConstAMD64(t *testing.T) {
c := testConfig(t) c := testConfig(t)
fun := makeConstShiftFunc(c, 18, OpLsh64x64, TypeUInt64) fun := makeConstShiftFunc(c, 18, OpLsh64x64, TypeUInt64)
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHLQconst: 1, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0}) checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHLQconst: 1, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0})
fun.f.Free()
fun = makeConstShiftFunc(c, 66, OpLsh64x64, TypeUInt64) fun = makeConstShiftFunc(c, 66, OpLsh64x64, TypeUInt64)
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHLQconst: 0, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0}) checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHLQconst: 0, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0})
fun.f.Free()
fun = makeConstShiftFunc(c, 18, OpRsh64Ux64, TypeUInt64) fun = makeConstShiftFunc(c, 18, OpRsh64Ux64, TypeUInt64)
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHRQconst: 1, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0}) checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHRQconst: 1, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0})
fun.f.Free()
fun = makeConstShiftFunc(c, 66, OpRsh64Ux64, TypeUInt64) fun = makeConstShiftFunc(c, 66, OpRsh64Ux64, TypeUInt64)
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHRQconst: 0, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0}) checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHRQconst: 0, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0})
fun.f.Free()
fun = makeConstShiftFunc(c, 18, OpRsh64x64, TypeInt64) fun = makeConstShiftFunc(c, 18, OpRsh64x64, TypeInt64)
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SARQconst: 1, OpAMD64CMPQconst: 0}) checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SARQconst: 1, OpAMD64CMPQconst: 0})
fun.f.Free()
fun = makeConstShiftFunc(c, 66, OpRsh64x64, TypeInt64) fun = makeConstShiftFunc(c, 66, OpRsh64x64, TypeInt64)
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SARQconst: 1, OpAMD64CMPQconst: 0}) checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SARQconst: 1, OpAMD64CMPQconst: 0})
fun.f.Free()
} }
func makeConstShiftFunc(c *Config, amount int64, op Op, typ Type) fun { func makeConstShiftFunc(c *Config, amount int64, op Op, typ Type) fun {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment