mirror of
https://github.com/golang/go
synced 2024-11-26 23:21:22 -07:00
63d72f6901
Based on cmd/9g/peep.go. Go 1 benchmark comparison: benchmark old ns/op new ns/op delta BenchmarkBinaryTree17 24328574000 18351639000 -24.57% BenchmarkFannkuch11 17029365000 10817758000 -36.48% BenchmarkFmtFprintfEmpty 291 223 -23.37% BenchmarkFmtFprintfString 1073 799 -25.54% BenchmarkFmtFprintfInt 1024 778 -24.02% BenchmarkFmtFprintfIntInt 1654 1277 -22.79% BenchmarkFmtFprintfPrefixedInt 1360 1083 -20.37% BenchmarkFmtFprintfFloat 2272 1415 -37.72% BenchmarkFmtManyArgs 5933 4742 -20.07% BenchmarkGobDecode 53166003 38584736 -27.43% BenchmarkGobEncode 37930156 30074874 -20.71% BenchmarkGzip 1880638900 1286832100 -31.57% BenchmarkGunzip 386343633 292194480 -24.37% BenchmarkHTTPClientServer 237077 179776 -24.17% BenchmarkJSONEncode 101731690 73116925 -28.13% BenchmarkJSONDecode 344655360 241277600 -29.99% BenchmarkMandelbrot200 28329778 12950809 -54.29% BenchmarkGoParse 21670755 16554244 -23.61% BenchmarkRegexpMatchEasy0_32 557 484 -13.11% BenchmarkRegexpMatchEasy0_1K 4687 4832 +3.09% BenchmarkRegexpMatchEasy1_32 539 483 -10.39% BenchmarkRegexpMatchEasy1_1K 5100 5080 -0.39% BenchmarkRegexpMatchMedium_32 796 651 -18.22% BenchmarkRegexpMatchMedium_1K 233099 182047 -21.90% BenchmarkRegexpMatchHard_32 13202 9897 -25.03% BenchmarkRegexpMatchHard_1K 401027 303602 -24.29% BenchmarkRevcomp 3837679666 2816546600 -26.61% BenchmarkTemplate 440608300 324831040 -26.28% BenchmarkTimeParse 1460 1019 -30.21% BenchmarkTimeFormat 1609 1174 -27.04% benchmark old MB/s new MB/s speedup BenchmarkGobDecode 14.44 19.89 1.38x BenchmarkGobEncode 20.24 25.52 1.26x BenchmarkGzip 10.32 15.08 1.46x BenchmarkGunzip 50.23 66.41 1.32x BenchmarkJSONEncode 19.07 26.54 1.39x BenchmarkJSONDecode 5.63 8.04 1.43x BenchmarkGoParse 2.67 3.50 1.31x BenchmarkRegexpMatchEasy0_32 57.38 66.05 1.15x BenchmarkRegexpMatchEasy0_1K 218.47 211.91 0.97x BenchmarkRegexpMatchEasy1_32 59.29 66.21 1.12x BenchmarkRegexpMatchEasy1_1K 200.76 201.54 1.00x BenchmarkRegexpMatchMedium_32 1.26 1.53 1.21x BenchmarkRegexpMatchMedium_1K 4.39 5.62 1.28x BenchmarkRegexpMatchHard_32 2.42 3.23 1.33x BenchmarkRegexpMatchHard_1K 2.55 3.37 1.32x BenchmarkRevcomp 66.23 90.24 1.36x BenchmarkTemplate 4.40 5.97 1.36x Fixes #10105. Change-Id: I353cc9fdf922e431821508c9dbbe4d9a85d64bd4 Signed-off-by: Shenghou Ma <minux@golang.org> Reviewed-on: https://go-review.googlesource.com/8471 Reviewed-by: Dave Cheney <dave@cheney.net>
195 lines
4.5 KiB
Go
195 lines
4.5 KiB
Go
// errorcheck -0 -d=nil
|
|
// Fails on ppc64x because of incomplete optimization.
|
|
// See issues 9058.
|
|
// +build !ppc64,!ppc64le
|
|
|
|
// Copyright 2013 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.
|
|
|
|
// Test that nil checks are removed.
|
|
// Optimization is enabled.
|
|
|
|
package p
|
|
|
|
type Struct struct {
|
|
X int
|
|
Y float64
|
|
}
|
|
|
|
type BigStruct struct {
|
|
X int
|
|
Y float64
|
|
A [1 << 20]int
|
|
Z string
|
|
}
|
|
|
|
type Empty struct {
|
|
}
|
|
|
|
type Empty1 struct {
|
|
Empty
|
|
}
|
|
|
|
var (
|
|
intp *int
|
|
arrayp *[10]int
|
|
array0p *[0]int
|
|
bigarrayp *[1 << 26]int
|
|
structp *Struct
|
|
bigstructp *BigStruct
|
|
emptyp *Empty
|
|
empty1p *Empty1
|
|
)
|
|
|
|
func f1() {
|
|
_ = *intp // ERROR "generated nil check"
|
|
|
|
// This one should be removed but the block copy needs
|
|
// to be turned into its own pseudo-op in order to see
|
|
// the indirect.
|
|
_ = *arrayp // ERROR "generated nil check"
|
|
|
|
// 0-byte indirect doesn't suffice.
|
|
// we don't registerize globals, so there are no removed repeated nil checks.
|
|
_ = *array0p // ERROR "generated nil check"
|
|
_ = *array0p // ERROR "generated nil check"
|
|
|
|
_ = *intp // ERROR "generated nil check"
|
|
_ = *arrayp // ERROR "generated nil check"
|
|
_ = *structp // ERROR "generated nil check"
|
|
_ = *emptyp // ERROR "generated nil check"
|
|
_ = *arrayp // ERROR "generated nil check"
|
|
}
|
|
|
|
func f2() {
|
|
var (
|
|
intp *int
|
|
arrayp *[10]int
|
|
array0p *[0]int
|
|
bigarrayp *[1 << 20]int
|
|
structp *Struct
|
|
bigstructp *BigStruct
|
|
emptyp *Empty
|
|
empty1p *Empty1
|
|
)
|
|
|
|
_ = *intp // ERROR "generated nil check"
|
|
_ = *arrayp // ERROR "generated nil check"
|
|
_ = *array0p // ERROR "generated nil check"
|
|
_ = *array0p // ERROR "removed repeated nil check"
|
|
_ = *intp // ERROR "removed repeated nil check"
|
|
_ = *arrayp // ERROR "removed repeated nil check"
|
|
_ = *structp // ERROR "generated nil check"
|
|
_ = *emptyp // ERROR "generated nil check"
|
|
_ = *arrayp // ERROR "removed repeated nil check"
|
|
_ = *bigarrayp // ERROR "generated nil check" ARM removed nil check before indirect!!
|
|
_ = *bigstructp // ERROR "generated nil check"
|
|
_ = *empty1p // ERROR "generated nil check"
|
|
}
|
|
|
|
func fx10k() *[10000]int
|
|
|
|
var b bool
|
|
|
|
func f3(x *[10000]int) {
|
|
// Using a huge type and huge offsets so the compiler
|
|
// does not expect the memory hardware to fault.
|
|
_ = x[9999] // ERROR "generated nil check"
|
|
|
|
for {
|
|
if x[9999] != 0 { // ERROR "generated nil check"
|
|
break
|
|
}
|
|
}
|
|
|
|
x = fx10k()
|
|
_ = x[9999] // ERROR "generated nil check"
|
|
if b {
|
|
_ = x[9999] // ERROR "removed repeated nil check"
|
|
} else {
|
|
_ = x[9999] // ERROR "removed repeated nil check"
|
|
}
|
|
_ = x[9999] // ERROR "generated nil check"
|
|
|
|
x = fx10k()
|
|
if b {
|
|
_ = x[9999] // ERROR "generated nil check"
|
|
} else {
|
|
_ = x[9999] // ERROR "generated nil check"
|
|
}
|
|
_ = x[9999] // ERROR "generated nil check"
|
|
|
|
fx10k()
|
|
// This one is a bit redundant, if we figured out that
|
|
// x wasn't going to change across the function call.
|
|
// But it's a little complex to do and in practice doesn't
|
|
// matter enough.
|
|
_ = x[9999] // ERROR "generated nil check"
|
|
}
|
|
|
|
func f3a() {
|
|
x := fx10k()
|
|
y := fx10k()
|
|
z := fx10k()
|
|
_ = &x[9] // ERROR "generated nil check"
|
|
y = z
|
|
_ = &x[9] // ERROR "removed repeated nil check"
|
|
x = y
|
|
_ = &x[9] // ERROR "generated nil check"
|
|
}
|
|
|
|
func f3b() {
|
|
x := fx10k()
|
|
y := fx10k()
|
|
_ = &x[9] // ERROR "generated nil check"
|
|
y = x
|
|
_ = &x[9] // ERROR "removed repeated nil check"
|
|
x = y
|
|
_ = &x[9] // ERROR "removed repeated nil check"
|
|
}
|
|
|
|
func fx10() *[10]int
|
|
|
|
func f4(x *[10]int) {
|
|
// Most of these have no checks because a real memory reference follows,
|
|
// and the offset is small enough that if x is nil, the address will still be
|
|
// in the first unmapped page of memory.
|
|
|
|
_ = x[9] // ERROR "removed nil check before indirect"
|
|
|
|
for {
|
|
if x[9] != 0 { // ERROR "removed nil check before indirect"
|
|
break
|
|
}
|
|
}
|
|
|
|
x = fx10()
|
|
_ = x[9] // ERROR "removed nil check before indirect"
|
|
if b {
|
|
_ = x[9] // ERROR "removed nil check before indirect"
|
|
} else {
|
|
_ = x[9] // ERROR "removed nil check before indirect"
|
|
}
|
|
_ = x[9] // ERROR "removed nil check before indirect"
|
|
|
|
x = fx10()
|
|
if b {
|
|
_ = x[9] // ERROR "removed nil check before indirect"
|
|
} else {
|
|
_ = &x[9] // ERROR "generated nil check"
|
|
}
|
|
_ = x[9] // ERROR "removed nil check before indirect"
|
|
|
|
fx10()
|
|
_ = x[9] // ERROR "removed nil check before indirect"
|
|
|
|
x = fx10()
|
|
y := fx10()
|
|
_ = &x[9] // ERROR "generated nil check"
|
|
y = x
|
|
_ = &x[9] // ERROR "removed repeated nil check"
|
|
x = y
|
|
_ = &x[9] // ERROR "removed repeated nil check"
|
|
}
|