aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2019-07-17 16:23:43 +0800
committerFelix Lange <fjl@twurst.com>2019-07-17 16:23:43 +0800
commit31a1f164d96b9ca09e55c86075ce0adb2589227a (patch)
treed7764c9267c1593ee572e238862b8e1e9f3c6eb3
parent6bd896a97f0c86fdb6d0538f5f839d7ea104e888 (diff)
downloadgo-tangerine-31a1f164d96b9ca09e55c86075ce0adb2589227a.tar
go-tangerine-31a1f164d96b9ca09e55c86075ce0adb2589227a.tar.gz
go-tangerine-31a1f164d96b9ca09e55c86075ce0adb2589227a.tar.bz2
go-tangerine-31a1f164d96b9ca09e55c86075ce0adb2589227a.tar.lz
go-tangerine-31a1f164d96b9ca09e55c86075ce0adb2589227a.tar.xz
go-tangerine-31a1f164d96b9ca09e55c86075ce0adb2589227a.tar.zst
go-tangerine-31a1f164d96b9ca09e55c86075ce0adb2589227a.zip
common/bitutil: use result of TestBytes to prevent dead code elimination (#19846)
Gollvm has very aggressive dead code elimination that completely removes one of these two benchmarks. To prevent this, use the result of the benchmark (a boolean), and to be "fair", make the transformation to both benchmarks. To be reliably assured of not removing the code, "use" means assigning to an exported global. Non-exported globals and //go:noinline functions are possibly subject to this optimization.
-rw-r--r--common/bitutil/bitutil_test.go10
1 files changed, 8 insertions, 2 deletions
diff --git a/common/bitutil/bitutil_test.go b/common/bitutil/bitutil_test.go
index 93647031e..307bf731f 100644
--- a/common/bitutil/bitutil_test.go
+++ b/common/bitutil/bitutil_test.go
@@ -190,6 +190,8 @@ func benchmarkBaseOR(b *testing.B, size int) {
}
}
+var GloBool bool // Exported global will not be dead-code eliminated, at least not yet.
+
// Benchmarks the potentially optimized bit testing performance.
func BenchmarkFastTest1KB(b *testing.B) { benchmarkFastTest(b, 1024) }
func BenchmarkFastTest2KB(b *testing.B) { benchmarkFastTest(b, 2048) }
@@ -197,9 +199,11 @@ func BenchmarkFastTest4KB(b *testing.B) { benchmarkFastTest(b, 4096) }
func benchmarkFastTest(b *testing.B, size int) {
p := make([]byte, size)
+ a := false
for i := 0; i < b.N; i++ {
- TestBytes(p)
+ a = a != TestBytes(p)
}
+ GloBool = a // Use of benchmark "result" to prevent total dead code elimination.
}
// Benchmarks the baseline bit testing performance.
@@ -209,7 +213,9 @@ func BenchmarkBaseTest4KB(b *testing.B) { benchmarkBaseTest(b, 4096) }
func benchmarkBaseTest(b *testing.B, size int) {
p := make([]byte, size)
+ a := false
for i := 0; i < b.N; i++ {
- safeTestBytes(p)
+ a = a != safeTestBytes(p)
}
+ GloBool = a // Use of benchmark "result" to prevent total dead code elimination.
}