diff options
Diffstat (limited to 'src/cmd/compile/internal/ssa/sparsetree.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/sparsetree.go | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/ssa/sparsetree.go b/src/cmd/compile/internal/ssa/sparsetree.go index 7c82a60d0f..8e5b9f3e5b 100644 --- a/src/cmd/compile/internal/ssa/sparsetree.go +++ b/src/cmd/compile/internal/ssa/sparsetree.go @@ -4,7 +4,10 @@ package ssa -import "fmt" +import ( + "fmt" + "strings" +) type SparseTreeNode struct { child *Block @@ -67,6 +70,34 @@ func newSparseTree(f *Func, parentOf []*Block) SparseTree { return t } +// treestructure provides a string description of the dominator +// tree and flow structure of block b and all blocks that it +// dominates. +func (t SparseTree) treestructure(b *Block) string { + return t.treestructure1(b, 0) +} +func (t SparseTree) treestructure1(b *Block, i int) string { + s := "\n" + strings.Repeat("\t", i) + b.String() + "->[" + for i, e := range b.Succs { + if i > 0 { + s = s + "," + } + s = s + e.b.String() + } + s += "]" + if c0 := t[b.ID].child; c0 != nil { + s += "(" + for c := c0; c != nil; c = t[c.ID].sibling { + if c != c0 { + s += " " + } + s += t.treestructure1(c, i+1) + } + s += ")" + } + return s +} + // numberBlock assigns entry and exit numbers for b and b's // children in an in-order walk from a gappy sequence, where n // is the first number not yet assigned or reserved. N should |