github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/test/testdata/phi_test.go (about) 1 // Copyright 2016 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 main 6 7 // Test to make sure spills of cast-shortened values 8 // don't end up spilling the pre-shortened size instead 9 // of the post-shortened size. 10 11 import ( 12 "runtime" 13 "testing" 14 ) 15 16 var data1 [26]int32 17 var data2 [26]int64 18 19 func init() { 20 for i := 0; i < 26; i++ { 21 // If we spill all 8 bytes of this datum, the 1 in the high-order 4 bytes 22 // will overwrite some other variable in the stack frame. 23 data2[i] = 0x100000000 24 } 25 } 26 27 func foo() int32 { 28 var a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z int32 29 if always { 30 a = data1[0] 31 b = data1[1] 32 c = data1[2] 33 d = data1[3] 34 e = data1[4] 35 f = data1[5] 36 g = data1[6] 37 h = data1[7] 38 i = data1[8] 39 j = data1[9] 40 k = data1[10] 41 l = data1[11] 42 m = data1[12] 43 n = data1[13] 44 o = data1[14] 45 p = data1[15] 46 q = data1[16] 47 r = data1[17] 48 s = data1[18] 49 t = data1[19] 50 u = data1[20] 51 v = data1[21] 52 w = data1[22] 53 x = data1[23] 54 y = data1[24] 55 z = data1[25] 56 } else { 57 a = int32(data2[0]) 58 b = int32(data2[1]) 59 c = int32(data2[2]) 60 d = int32(data2[3]) 61 e = int32(data2[4]) 62 f = int32(data2[5]) 63 g = int32(data2[6]) 64 h = int32(data2[7]) 65 i = int32(data2[8]) 66 j = int32(data2[9]) 67 k = int32(data2[10]) 68 l = int32(data2[11]) 69 m = int32(data2[12]) 70 n = int32(data2[13]) 71 o = int32(data2[14]) 72 p = int32(data2[15]) 73 q = int32(data2[16]) 74 r = int32(data2[17]) 75 s = int32(data2[18]) 76 t = int32(data2[19]) 77 u = int32(data2[20]) 78 v = int32(data2[21]) 79 w = int32(data2[22]) 80 x = int32(data2[23]) 81 y = int32(data2[24]) 82 z = int32(data2[25]) 83 } 84 // Lots of phis of the form phi(int32,int64) of type int32 happen here. 85 // Some will be stack phis. For those stack phis, make sure the spill 86 // of the second argument uses the phi's width (4 bytes), not its width 87 // (8 bytes). Otherwise, a random stack slot gets clobbered. 88 89 runtime.Gosched() 90 return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z 91 } 92 93 func TestPhi(t *testing.T) { 94 want := int32(0) 95 got := foo() 96 if got != want { 97 t.Fatalf("want %d, got %d\n", want, got) 98 } 99 }