| // 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") | 
 | 	} | 
 | } |