| // run | |
| // Copyright 2018 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. | |
| package main | |
| import ( | |
| "sync/atomic" | |
| ) | |
| var cnt32 int32 | |
| //go:noinline | |
| func test32(a, b []int) bool { | |
| // Try to generate flag value, issue atomic | |
| // adds and then re-use the flag value to see if | |
| // the atomic add has clobbered them. | |
| atomic.AddInt32(&cnt32, 1) | |
| if len(a) == len(b) { | |
| atomic.AddInt32(&cnt32, 2) | |
| } | |
| atomic.AddInt32(&cnt32, 4) | |
| if len(a) >= len(b) { | |
| atomic.AddInt32(&cnt32, 8) | |
| } | |
| if len(a) <= len(b) { | |
| atomic.AddInt32(&cnt32, 16) | |
| } | |
| return atomic.LoadInt32(&cnt32) == 31 | |
| } | |
| var cnt64 int64 | |
| //go:noinline | |
| func test64(a, b []int) bool { | |
| // Try to generate flag value, issue atomic | |
| // adds and then re-use the flag value to see if | |
| // the atomic add has clobbered them. | |
| atomic.AddInt64(&cnt64, 1) | |
| if len(a) == len(b) { | |
| atomic.AddInt64(&cnt64, 2) | |
| } | |
| atomic.AddInt64(&cnt64, 4) | |
| if len(a) >= len(b) { | |
| atomic.AddInt64(&cnt64, 8) | |
| } | |
| if len(a) <= len(b) { | |
| atomic.AddInt64(&cnt64, 16) | |
| } | |
| return atomic.LoadInt64(&cnt64) == 31 | |
| } | |
| func main() { | |
| if !test32([]int{}, []int{}) { | |
| panic("test32") | |
| } | |
| if !test64([]int{}, []int{}) { | |
| panic("test64") | |
| } | |
| } |