| // Copyright 2016 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package ssa | |
| import ( | |
| "cmd/compile/internal/types" | |
| "fmt" | |
| "testing" | |
| ) | |
| func BenchmarkCopyElim1(b *testing.B) { benchmarkCopyElim(b, 1) } | |
| func BenchmarkCopyElim10(b *testing.B) { benchmarkCopyElim(b, 10) } | |
| func BenchmarkCopyElim100(b *testing.B) { benchmarkCopyElim(b, 100) } | |
| func BenchmarkCopyElim1000(b *testing.B) { benchmarkCopyElim(b, 1000) } | |
| func BenchmarkCopyElim10000(b *testing.B) { benchmarkCopyElim(b, 10000) } | |
| func BenchmarkCopyElim100000(b *testing.B) { benchmarkCopyElim(b, 100000) } | |
| func benchmarkCopyElim(b *testing.B, n int) { | |
| c := testConfig(b) | |
| values := make([]interface{}, 0, n+2) | |
| values = append(values, Valu("mem", OpInitMem, types.TypeMem, 0, nil)) | |
| last := "mem" | |
| for i := 0; i < n; i++ { | |
| name := fmt.Sprintf("copy%d", i) | |
| values = append(values, Valu(name, OpCopy, types.TypeMem, 0, nil, last)) | |
| last = name | |
| } | |
| values = append(values, Exit(last)) | |
| // Reverse values array to make it hard | |
| for i := 0; i < len(values)/2; i++ { | |
| values[i], values[len(values)-1-i] = values[len(values)-1-i], values[i] | |
| } | |
| for i := 0; i < b.N; i++ { | |
| fun := c.Fun("entry", Bloc("entry", values...)) | |
| Copyelim(fun.f) | |
| } | |
| } |