blob: 4d67864a6d5baf77ec30d5a392d8261ee0fe5a3e [file] [log] [blame]
// run
// Copyright 2015 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.
// Tests load/store ordering
package main
import "fmt"
// testLoadStoreOrder tests for reordering of stores/loads.
func testLoadStoreOrder() {
z := uint32(1000)
if testLoadStoreOrder_ssa(&z, 100) == 0 {
println("testLoadStoreOrder failed")
failed = true
}
}
//go:noinline
func testLoadStoreOrder_ssa(z *uint32, prec uint) int {
old := *z // load
*z = uint32(prec) // store
if *z < old { // load
return 1
}
return 0
}
func testStoreSize() {
a := [4]uint16{11, 22, 33, 44}
testStoreSize_ssa(&a[0], &a[2], 77)
want := [4]uint16{77, 22, 33, 44}
if a != want {
fmt.Println("testStoreSize failed. want =", want, ", got =", a)
failed = true
}
}
//go:noinline
func testStoreSize_ssa(p *uint16, q *uint16, v uint32) {
// Test to make sure that (Store ptr (Trunc32to16 val) mem)
// does not end up as a 32-bit store. It must stay a 16 bit store
// even when Trunc32to16 is rewritten to be a nop.
// To ensure that we get rewrite the Trunc32to16 before
// we rewrite the Store, we force the truncate into an
// earlier basic block by using it on both branches.
w := uint16(v)
if p != nil {
*p = w
} else {
*q = w
}
}
var failed = false
//go:noinline
func testExtStore_ssa(p *byte, b bool) int {
x := *p
*p = 7
if b {
return int(x)
}
return 0
}
func testExtStore() {
const start = 8
var b byte = start
if got := testExtStore_ssa(&b, true); got != start {
fmt.Println("testExtStore failed. want =", start, ", got =", got)
failed = true
}
}
var b int
// testDeadStorePanic_ssa ensures that we don't optimize away stores
// that could be read by after recover(). Modeled after fixedbugs/issue1304.
//go:noinline
func testDeadStorePanic_ssa(a int) (r int) {
defer func() {
recover()
r = a
}()
a = 2 // store
b := a - a // optimized to zero
c := 4
a = c / b // store, but panics
a = 3 // store
r = a
return
}
func testDeadStorePanic() {
if want, got := 2, testDeadStorePanic_ssa(1); want != got {
fmt.Println("testDeadStorePanic failed. want =", want, ", got =", got)
failed = true
}
}
func main() {
testLoadStoreOrder()
testStoreSize()
testExtStore()
testDeadStorePanic()
if failed {
panic("failed")
}
}