aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2019-09-03 23:24:35 +0700
committerMatthew Dempsky <mdempsky@google.com>2019-09-03 19:33:04 +0000
commitd2f958d8d11bcf62fe572885133bfaef41307a14 (patch)
tree043de28a03afa2f716e8bdfb8e226f8bc9e31c53 /src
parent9da7abd2ebd07d32484277adac75c45b66f504c1 (diff)
downloadgo-d2f958d8d11bcf62fe572885133bfaef41307a14.tar.xz
cmd/compile: extend ssa.go to handle 1-element array and 1-field struct
Assinging to 1-element array/1-field struct variable is considered clobbering the whole variable. By emitting OpVarDef in this case, liveness analysis can now know the variable is redefined. Also, the isfat is not necessary anymore, and will be removed in follow up CL. Fixes #33916 Change-Id: Iece0d90b05273f333d59d6ee5b12ee7dc71908c2 Reviewed-on: https://go-review.googlesource.com/c/go/+/192979 Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/gc/ssa.go20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index ac7f3eb22b..0706d95937 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -2767,10 +2767,14 @@ func (s *state) assign(left *Node, right *ssa.Value, deref bool, skip skipMask)
s.addNamedValue(left, right)
return
}
- // Left is not ssa-able. Compute its address.
- if left.Op == ONAME && left.Class() != PEXTERN && skip == 0 {
- s.vars[&memVar] = s.newValue1Apos(ssa.OpVarDef, types.TypeMem, left, s.mem(), !left.IsAutoTmp())
+
+ // If this assignment clobbers an entire local variable, then emit
+ // OpVarDef so liveness analysis knows the variable is redefined.
+ if base := clobberBase(left); base.Op == ONAME && base.Class() != PEXTERN && skip == 0 {
+ s.vars[&memVar] = s.newValue1Apos(ssa.OpVarDef, types.TypeMem, base, s.mem(), !base.IsAutoTmp())
}
+
+ // Left is not ssa-able. Compute its address.
addr := s.addr(left, false)
if isReflectHeaderDataField(left) {
// Package unsafe's documentation says storing pointers into
@@ -6210,3 +6214,13 @@ func (n *Node) StorageClass() ssa.StorageClass {
return 0
}
}
+
+func clobberBase(n *Node) *Node {
+ if n.Op == ODOT && n.Left.Type.NumFields() == 1 {
+ return clobberBase(n.Left)
+ }
+ if n.Op == OINDEX && n.Left.Type.IsArray() && n.Left.Type.NumElem() == 1 {
+ return clobberBase(n.Left)
+ }
+ return n
+}