From 74180dd7dad42b800f2408340ad17cb62c6c11fb Mon Sep 17 00:00:00 2001 From: Todd Neal Date: Tue, 27 Oct 2015 21:35:48 -0500 Subject: [PATCH] [dev.ssa] cmd/compile/internal/ssa: reuse Aux values for PEXTERN This improves cse and works correctly now that divide by zero is checked explicitly. Change-Id: If54fbe403ed5230b897afc5def644ba9f0056dfd Reviewed-on: https://go-review.googlesource.com/16454 Run-TryBot: Todd Neal Reviewed-by: Keith Randall TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/ssa.go | 2 +- .../internal/gc/testdata/loadstore_ssa.go | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 4b4dc09f11..b96661d15e 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -2265,7 +2265,7 @@ func (s *state) addr(n *Node, bounded bool) *ssa.Value { switch n.Class { case PEXTERN: // global variable - aux := &ssa.ExternSymbol{n.Type, n.Sym} + aux := s.lookupSymbol(n, &ssa.ExternSymbol{n.Type, n.Sym}) v := s.entryNewValue1A(ssa.OpAddr, t, aux, s.sb) // TODO: Make OpAddr use AuxInt as well as Aux. if n.Xoffset != 0 { diff --git a/src/cmd/compile/internal/gc/testdata/loadstore_ssa.go b/src/cmd/compile/internal/gc/testdata/loadstore_ssa.go index e986f53bc6..e0b0b4dfab 100644 --- a/src/cmd/compile/internal/gc/testdata/loadstore_ssa.go +++ b/src/cmd/compile/internal/gc/testdata/loadstore_ssa.go @@ -77,11 +77,39 @@ func testExtStore() { } } +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") -- 2.48.1