blob: 76f1ad491e8832425e52385ced354631f401e693 [file] [log] [blame]
Dan Willemsen38f2dba2016-07-08 14:54:35 -07001// run
2
3// Copyright 2016 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Check that we do loads exactly once. The SSA backend
8// once tried to do the load in f twice, once sign extended
9// and once zero extended. This can cause problems in
10// racy code, particularly sync/mutex.
11
12package main
13
14func f(p *byte) bool {
15 x := *p
16 a := int64(int8(x))
17 b := int64(uint8(x))
18 return a == b
19}
20
21func main() {
22 var x byte
23 const N = 1000000
24 c := make(chan struct{})
25 go func() {
26 for i := 0; i < N; i++ {
27 x = 1
28 }
29 c <- struct{}{}
30 }()
31 go func() {
32 for i := 0; i < N; i++ {
33 x = 2
34 }
35 c <- struct{}{}
36 }()
37
38 for i := 0; i < N; i++ {
39 if !f(&x) {
40 panic("non-atomic load!")
41 }
42 }
43 <-c
44 <-c
45}