/
githubmirror
/
go
Обзор
Документация
Войти
/
githubmirror
/
go
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
test/escape_bloop.go
64 строки
2 KB
thepudds
cmd/compile/internal/bloop: avoid extraneous heap allocs in b.Loop body due to autotmp variable scope
30 янв 2026, 02:51
30 янв 2026, 02:51
bae9486
Код
Авторство
О чём код?
// errorcheck -0 -m // Copyright 2026 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 b.Loop escape analysis behavior. package bloop import ( "testing" ) // An example where mid-stack inlining allows stack allocation of a slice. // This is from the example in go.dev/issue/73137. func NewX(x int) []byte { // ERROR "can inline NewX" out := make([]byte, 8) // ERROR "make\(\[\]byte, 8\) escapes to heap" return use1(out) } //go:noinline func use1(out []byte) []byte { // ERROR "leaking param: out to result ~r0 level=0" return out } //go:noinline func BenchmarkBloop(b *testing.B) { // ERROR "leaking param: b" for b.Loop() { // ERROR "inlining call to testing.\(\*B\).Loop" NewX(42) // ERROR "make\(\[\]byte, 8\) does not escape" "inlining call to NewX" } } // A traditional b.N benchmark using a sink variable for comparison, // also from the example in go.dev/issue/73137. var sink byte //go:noinline func BenchmarkBN(b *testing.B) { // ERROR "b does not escape" for i := 0; i < b.N; i++ { out := NewX(42) // ERROR "make\(\[\]byte, 8\) does not escape" "inlining call to NewX" sink = out[0] } } // An example showing behavior of a simple function argument in the b.Loop body. //go:noinline func use2(x any) {} // ERROR "x does not escape" //go:noinline func BenchmarkBLoopFunctionArg(b *testing.B) { // ERROR "leaking param: b" for b.Loop() { // ERROR "inlining call to testing.\(\*B\).Loop" use2(42) // ERROR "42 does not escape" } } // A similar call outside of b.Loop for comparison. func simpleFunctionArg() { // ERROR "can inline simpleFunctionArg" use2(42) // ERROR "42 does not escape" }