Source file src/cmd/compile/internal/test/locals_test.go

     1  // Copyright 2025 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package test
     6  
     7  import (
     8  	"sync/atomic"
     9  	"testing"
    10  )
    11  
    12  func locals() {
    13  	var x int64
    14  	var y int32
    15  	var z int16
    16  	var w int8
    17  	sink64 = &x
    18  	sink32 = &y
    19  	sink16 = &z
    20  	sink8 = &w
    21  }
    22  
    23  //go:noinline
    24  func args(x int64, y int32, z int16, w int8) {
    25  	sink64 = &x
    26  	sink32 = &y
    27  	sink16 = &z
    28  	sink8 = &w
    29  
    30  }
    31  
    32  //go:noinline
    33  func half(x int64, y int16) {
    34  	var z int32
    35  	var w int8
    36  	sink64 = &x
    37  	sink16 = &y
    38  	sink32 = &z
    39  	sink8 = &w
    40  }
    41  
    42  //go:noinline
    43  func closure() func() {
    44  	var x int64
    45  	var y int32
    46  	var z int16
    47  	var w int8
    48  	_, _, _, _ = x, y, z, w
    49  	return func() {
    50  		x = 1
    51  		y = 2
    52  		z = 3
    53  		w = 4
    54  	}
    55  }
    56  
    57  //go:noinline
    58  func atomicFn() {
    59  	var x int32
    60  	var y int64
    61  	var z int16
    62  	var w int8
    63  	sink32 = &x
    64  	sink64 = &y
    65  	sink16 = &z
    66  	sink8 = &w
    67  	atomic.StoreInt64(&y, 7)
    68  }
    69  
    70  var sink64 *int64
    71  var sink32 *int32
    72  var sink16 *int16
    73  var sink8 *int8
    74  
    75  func TestLocalAllocations(t *testing.T) {
    76  	type test struct {
    77  		name string
    78  		f    func()
    79  		want int
    80  	}
    81  	for _, tst := range []test{
    82  		{"locals", locals, 1},
    83  		{"args", func() { args(1, 2, 3, 4) }, 1},
    84  		{"half", func() { half(1, 2) }, 1},
    85  		{"closure", func() { _ = closure() }, 2},
    86  		{"atomic", atomicFn, 1},
    87  	} {
    88  		allocs := testing.AllocsPerRun(100, tst.f)
    89  		if allocs != float64(tst.want) {
    90  			t.Errorf("test %s uses %v allocs, want %d", tst.name, allocs, tst.want)
    91  		}
    92  	}
    93  }
    94  

View as plain text