cmd/compile: handle DOT STRUCTLIT for zero-valued struct in SSA

CL 35261 makes SSA handle zero-valued STRUCTLIT, but DOT operation
was not handled.

Fixes #18994.

Change-Id: Ic7976036acca1523b0b14afac4d170797e8aee20
Reviewed-on: https://go-review.googlesource.com/36565
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Cherry Zhang 2017-02-08 15:31:24 -05:00
parent e3efdffacd
commit a146dd3a2f
2 changed files with 31 additions and 0 deletions

View file

@ -1956,6 +1956,15 @@ func (s *state) expr(n *Node) *ssa.Value {
v := s.expr(n.Left)
return s.newValue1I(ssa.OpStructSelect, n.Type, int64(fieldIdx(n)), v)
}
if n.Left.Op == OSTRUCTLIT {
// All literals with nonzero fields have already been
// rewritten during walk. Any that remain are just T{}
// or equivalents. Use the zero value.
if !iszero(n.Left) {
Fatalf("literal with nonzero value in SSA: %v", n.Left)
}
return s.zeroVal(n.Type)
}
p, _ := s.addr(n, false)
return s.newValue2(ssa.OpLoad, n.Type, p, s.mem())

View file

@ -0,0 +1,22 @@
// run
// Copyright 2017 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.
// Issue 18994: SSA didn't handle DOT STRUCTLIT for zero-valued
// STRUCTLIT.
package main
// large struct - not SSA-able
type T struct {
a, b, c, d, e, f, g, h int
}
func main() {
x := T{}.a
if x != 0 {
panic("FAIL")
}
}