| // 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) |
| } |
| } |