[dev.ssa] cmd/compile: move addEdge function to ssa
addEdge had two identical implementations so make it an exported method
on Block.
Change-Id: I8c21655a9dc5074fefd7f63b2f5b51897571e608
Reviewed-on: https://go-review.googlesource.com/14040
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index 08a3ac2..c00ab59 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -114,7 +114,7 @@
// fallthrough to exit
if b := s.endBlock(); b != nil {
- addEdge(b, s.exit)
+ b.AddEdgeTo(s.exit)
}
// Finish up exit block
@@ -487,7 +487,7 @@
// go to that label (we pretend "label:" is preceded by "goto label")
b := s.endBlock()
- addEdge(b, lab.target)
+ b.AddEdgeTo(lab.target)
s.startBlock(lab.target)
case OGOTO:
@@ -508,7 +508,7 @@
}
b := s.endBlock()
- addEdge(b, lab.target)
+ b.AddEdgeTo(lab.target)
case OAS, OASWB:
// Check whether we can generate static data rather than code.
@@ -536,25 +536,25 @@
var bElse *ssa.Block
if n.Rlist == nil {
- addEdge(b, bThen)
- addEdge(b, bEnd)
+ b.AddEdgeTo(bThen)
+ b.AddEdgeTo(bEnd)
} else {
bElse = s.f.NewBlock(ssa.BlockPlain)
- addEdge(b, bThen)
- addEdge(b, bElse)
+ b.AddEdgeTo(bThen)
+ b.AddEdgeTo(bElse)
}
s.startBlock(bThen)
s.stmtList(n.Nbody)
if b := s.endBlock(); b != nil {
- addEdge(b, bEnd)
+ b.AddEdgeTo(bEnd)
}
if n.Rlist != nil {
s.startBlock(bElse)
s.stmtList(n.Rlist)
if b := s.endBlock(); b != nil {
- addEdge(b, bEnd)
+ b.AddEdgeTo(bEnd)
}
}
s.startBlock(bEnd)
@@ -562,7 +562,7 @@
case ORETURN:
s.stmtList(n.List)
b := s.endBlock()
- addEdge(b, s.exit)
+ b.AddEdgeTo(s.exit)
case OCONTINUE, OBREAK:
var op string
@@ -614,7 +614,7 @@
}
b := s.endBlock()
- addEdge(b, to)
+ b.AddEdgeTo(to)
case OFOR:
// OFOR: for Ninit; Left; Right { Nbody }
@@ -625,7 +625,7 @@
// first, jump to condition test
b := s.endBlock()
- addEdge(b, bCond)
+ b.AddEdgeTo(bCond)
// generate code to test condition
s.startBlock(bCond)
@@ -639,8 +639,8 @@
b.Kind = ssa.BlockIf
b.Control = cond
b.Likely = ssa.BranchLikely
- addEdge(b, bBody)
- addEdge(b, bEnd)
+ b.AddEdgeTo(bBody)
+ b.AddEdgeTo(bEnd)
// set up for continue/break in body
prevContinue := s.continueTo
@@ -668,7 +668,7 @@
// done with body, goto incr
if b := s.endBlock(); b != nil {
- addEdge(b, bIncr)
+ b.AddEdgeTo(bIncr)
}
// generate incr
@@ -677,7 +677,7 @@
s.stmt(n.Right)
}
if b := s.endBlock(); b != nil {
- addEdge(b, bCond)
+ b.AddEdgeTo(bCond)
}
s.startBlock(bEnd)
@@ -703,7 +703,7 @@
}
if b := s.endBlock(); b != nil {
- addEdge(b, bEnd)
+ b.AddEdgeTo(bEnd)
}
s.startBlock(bEnd)
@@ -1447,11 +1447,11 @@
bRight := s.f.NewBlock(ssa.BlockPlain)
bResult := s.f.NewBlock(ssa.BlockPlain)
if n.Op == OANDAND {
- addEdge(b, bRight)
- addEdge(b, bResult)
+ b.AddEdgeTo(bRight)
+ b.AddEdgeTo(bResult)
} else if n.Op == OOROR {
- addEdge(b, bResult)
- addEdge(b, bRight)
+ b.AddEdgeTo(bResult)
+ b.AddEdgeTo(bRight)
}
s.startBlock(bRight)
@@ -1459,7 +1459,7 @@
s.vars[n] = er
b = s.endBlock()
- addEdge(b, bResult)
+ b.AddEdgeTo(bResult)
s.startBlock(bResult)
return s.variable(n, Types[TBOOL])
@@ -1599,15 +1599,15 @@
// Generate code for non-zero length slice case.
nz := s.f.NewBlock(ssa.BlockPlain)
- addEdge(b, nz)
+ b.AddEdgeTo(nz)
s.startBlock(nz)
s.vars[n] = s.newValue2(ssa.OpAddPtr, Ptrto(Types[TUINT8]), ptr, low)
s.endBlock()
// All done.
merge := s.f.NewBlock(ssa.BlockPlain)
- addEdge(b, merge)
- addEdge(nz, merge)
+ b.AddEdgeTo(merge)
+ nz.AddEdgeTo(merge)
s.startBlock(merge)
return s.newValue2(ssa.OpStringMake, Types[TSTRING], s.variable(n, Ptrto(Types[TUINT8])), rlen)
@@ -1654,8 +1654,8 @@
b := s.endBlock()
b.Kind = ssa.BlockCall
b.Control = call
- addEdge(b, bNext)
- addEdge(b, s.exit)
+ b.AddEdgeTo(bNext)
+ b.AddEdgeTo(s.exit)
// read result from stack at the start of the fallthrough block
s.startBlock(bNext)
@@ -1928,9 +1928,9 @@
b.Likely = ssa.BranchLikely
bNext := s.f.NewBlock(ssa.BlockPlain)
bPanic := s.f.NewBlock(ssa.BlockPlain)
- addEdge(b, bNext)
- addEdge(b, bPanic)
- addEdge(bPanic, s.exit)
+ b.AddEdgeTo(bNext)
+ b.AddEdgeTo(bPanic)
+ bPanic.AddEdgeTo(s.exit)
s.startBlock(bPanic)
// TODO: implicit nil checks somehow?
s.vars[&memvar] = s.newValue2(ssa.OpPanicNilCheck, ssa.TypeMem, ptr, s.mem())
@@ -1974,9 +1974,9 @@
b.Likely = ssa.BranchLikely
bNext := s.f.NewBlock(ssa.BlockPlain)
bPanic := s.f.NewBlock(ssa.BlockPlain)
- addEdge(b, bNext)
- addEdge(b, bPanic)
- addEdge(bPanic, s.exit)
+ b.AddEdgeTo(bNext)
+ b.AddEdgeTo(bPanic)
+ bPanic.AddEdgeTo(s.exit)
s.startBlock(bPanic)
// The panic check takes/returns memory to ensure that the right
// memory state is observed if the panic happens.
@@ -2068,14 +2068,14 @@
bElse := s.f.NewBlock(ssa.BlockPlain)
bAfter := s.f.NewBlock(ssa.BlockPlain)
- addEdge(b, bThen)
+ b.AddEdgeTo(bThen)
s.startBlock(bThen)
a0 := s.newValue1(cvttab.cvt2F, tt, x)
s.vars[n] = a0
s.endBlock()
- addEdge(bThen, bAfter)
+ bThen.AddEdgeTo(bAfter)
- addEdge(b, bElse)
+ b.AddEdgeTo(bElse)
s.startBlock(bElse)
one := cvttab.one(s, ft, 1)
y := s.newValue2(cvttab.and, ft, x, one)
@@ -2085,7 +2085,7 @@
a1 := s.newValue2(cvttab.add, tt, a, a)
s.vars[n] = a1
s.endBlock()
- addEdge(bElse, bAfter)
+ bElse.AddEdgeTo(bAfter)
s.startBlock(bAfter)
return s.variable(n, n.Type)
@@ -2117,13 +2117,13 @@
bAfter := s.f.NewBlock(ssa.BlockPlain)
// length/capacity of a nil map/chan is zero
- addEdge(b, bThen)
+ b.AddEdgeTo(bThen)
s.startBlock(bThen)
s.vars[n] = s.zeroVal(lenType)
s.endBlock()
- addEdge(bThen, bAfter)
+ bThen.AddEdgeTo(bAfter)
- addEdge(b, bElse)
+ b.AddEdgeTo(bElse)
s.startBlock(bElse)
if n.Op == OLEN {
// length is stored in the first word for map/chan
@@ -2136,7 +2136,7 @@
s.Fatalf("op must be OLEN or OCAP")
}
s.endBlock()
- addEdge(bElse, bAfter)
+ bElse.AddEdgeTo(bAfter)
s.startBlock(bAfter)
return s.variable(n, lenType)
@@ -2187,14 +2187,14 @@
bElse := s.f.NewBlock(ssa.BlockPlain)
bAfter := s.f.NewBlock(ssa.BlockPlain)
- addEdge(b, bThen)
+ b.AddEdgeTo(bThen)
s.startBlock(bThen)
a0 := s.newValue1(cvttab.cvt2U, tt, x)
s.vars[n] = a0
s.endBlock()
- addEdge(bThen, bAfter)
+ bThen.AddEdgeTo(bAfter)
- addEdge(b, bElse)
+ b.AddEdgeTo(bElse)
s.startBlock(bElse)
y := s.newValue2(cvttab.subf, ft, x, twoToThe63)
y = s.newValue1(cvttab.cvt2U, tt, y)
@@ -2202,7 +2202,7 @@
a1 := s.newValue2(ssa.OpOr64, tt, y, z)
s.vars[n] = a1
s.endBlock()
- addEdge(bElse, bAfter)
+ bElse.AddEdgeTo(bAfter)
s.startBlock(bAfter)
return s.variable(n, n.Type)
@@ -2366,12 +2366,6 @@
// TODO: the above mutually recursive functions can lead to very deep stacks. Fix that.
-// addEdge adds an edge from b to c.
-func addEdge(b, c *ssa.Block) {
- b.Succs = append(b.Succs, c)
- c.Preds = append(c.Preds, b)
-}
-
// an unresolved branch
type branch struct {
p *obj.Prog // branch instruction