1
0
mirror of https://github.com/golang/go synced 2024-10-05 21:21:21 -06:00

[dev.ssa] cmd/compile: refactor assign

Move the AST to SSA conversion to the caller.
This enables it to be used in contexts in which
the RHS is already an *ssa.Value.

Change-Id: Ibb87210fb9fda095a9b7c7f4ad1264a7cbd269bf
Reviewed-on: https://go-review.googlesource.com/14521
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2015-08-29 14:54:45 -07:00
parent 9552295833
commit 0726931c10

View File

@ -461,7 +461,8 @@ func (s *state) stmt(n *Node) {
palloc = callnew(n.Left.Type) palloc = callnew(n.Left.Type)
prealloc[n.Left] = palloc prealloc[n.Left] = palloc
} }
s.assign(OAS, n.Left.Name.Heapaddr, palloc) r := s.expr(palloc)
s.assign(n.Left.Name.Heapaddr, r, false)
case OLABEL: case OLABEL:
sym := n.Left.Sym sym := n.Left.Sym
@ -530,7 +531,11 @@ func (s *state) stmt(n *Node) {
s.f.StaticData = append(data, n) s.f.StaticData = append(data, n)
return return
} }
s.assign(n.Op, n.Left, n.Right) var r *ssa.Value
if n.Right != nil {
r = s.expr(n.Right)
}
s.assign(n.Left, r, n.Op == OASWB)
case OIF: case OIF:
cond := s.expr(n.Left) cond := s.expr(n.Left)
@ -1864,18 +1869,14 @@ func (s *state) expr(n *Node) *ssa.Value {
} }
} }
func (s *state) assign(op uint8, left *Node, right *Node) { func (s *state) assign(left *Node, right *ssa.Value, wb bool) {
if left.Op == ONAME && isblank(left) { if left.Op == ONAME && isblank(left) {
if right != nil {
s.expr(right)
}
return return
} }
// TODO: do write barrier // TODO: do write barrier
// if op == OASWB // if wb
t := left.Type t := left.Type
dowidth(t) dowidth(t)
var val *ssa.Value
if right == nil { if right == nil {
// right == nil means use the zero value of the assigned type. // right == nil means use the zero value of the assigned type.
if !canSSA(left) { if !canSSA(left) {
@ -1887,13 +1888,11 @@ func (s *state) assign(op uint8, left *Node, right *Node) {
s.vars[&memvar] = s.newValue2I(ssa.OpZero, ssa.TypeMem, t.Size(), addr, s.mem()) s.vars[&memvar] = s.newValue2I(ssa.OpZero, ssa.TypeMem, t.Size(), addr, s.mem())
return return
} }
val = s.zeroVal(t) right = s.zeroVal(t)
} else {
val = s.expr(right)
} }
if left.Op == ONAME && canSSA(left) { if left.Op == ONAME && canSSA(left) {
// Update variable assignment. // Update variable assignment.
s.vars[left] = val s.vars[left] = right
return return
} }
// not ssa-able. Treat as a store. // not ssa-able. Treat as a store.
@ -1901,7 +1900,7 @@ func (s *state) assign(op uint8, left *Node, right *Node) {
if left.Op == ONAME { if left.Op == ONAME {
s.vars[&memvar] = s.newValue1A(ssa.OpVarDef, ssa.TypeMem, left, s.mem()) s.vars[&memvar] = s.newValue1A(ssa.OpVarDef, ssa.TypeMem, left, s.mem())
} }
s.vars[&memvar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, t.Size(), addr, val, s.mem()) s.vars[&memvar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, t.Size(), addr, right, s.mem())
} }
// zeroVal returns the zero value for type t. // zeroVal returns the zero value for type t.