aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/gc/testdata/loadstore_ssa.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/compile/internal/gc/testdata/loadstore_ssa.go')
-rw-r--r--src/cmd/compile/internal/gc/testdata/loadstore_ssa.go117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/gc/testdata/loadstore_ssa.go b/src/cmd/compile/internal/gc/testdata/loadstore_ssa.go
new file mode 100644
index 0000000000..e0b0b4dfab
--- /dev/null
+++ b/src/cmd/compile/internal/gc/testdata/loadstore_ssa.go
@@ -0,0 +1,117 @@
+// 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
+ }
+}
+func testLoadStoreOrder_ssa(z *uint32, prec uint) int {
+ switch {
+ }
+ 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
+ }
+}
+func testStoreSize_ssa(p *uint16, q *uint16, v uint32) {
+ switch {
+ }
+ // 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
+
+func testExtStore_ssa(p *byte, b bool) int {
+ switch {
+ }
+ 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.
+func testDeadStorePanic_ssa(a int) (r int) {
+ switch {
+ }
+ 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")
+ }
+}