mirror of
https://github.com/golang/go
synced 2024-11-24 22:37:56 -07:00
[dev.ssa] cmd/compile: use sparsetree in checkFunc
Modify the simple domCheck to use the sparse tree code. This speeds up compilation of one of the generated test cases from 1m48s to 17s. Change-Id: If577410ee77b54918147a66917a8e3721297ee0a Reviewed-on: https://go-review.googlesource.com/19187 Run-TryBot: Todd Neal <todd@tneal.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
955749c45f
commit
c58c20f30f
@ -253,6 +253,7 @@ func checkFunc(f *Func) {
|
|||||||
// Note: regalloc introduces non-dominating args.
|
// Note: regalloc introduces non-dominating args.
|
||||||
// See TODO in regalloc.go.
|
// See TODO in regalloc.go.
|
||||||
idom := dominators(f)
|
idom := dominators(f)
|
||||||
|
sdom := newSparseTree(f, idom)
|
||||||
for _, b := range f.Blocks {
|
for _, b := range f.Blocks {
|
||||||
for _, v := range b.Values {
|
for _, v := range b.Values {
|
||||||
for i, arg := range v.Args {
|
for i, arg := range v.Args {
|
||||||
@ -261,12 +262,12 @@ func checkFunc(f *Func) {
|
|||||||
if v.Op == OpPhi {
|
if v.Op == OpPhi {
|
||||||
y = b.Preds[i]
|
y = b.Preds[i]
|
||||||
}
|
}
|
||||||
if !domCheck(f, idom, x, y) {
|
if !domCheck(f, sdom, x, y) {
|
||||||
f.Fatalf("arg %d of value %s does not dominate, arg=%s", i, v.LongString(), arg.LongString())
|
f.Fatalf("arg %d of value %s does not dominate, arg=%s", i, v.LongString(), arg.LongString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if b.Control != nil && !domCheck(f, idom, b.Control.Block, b) {
|
if b.Control != nil && !domCheck(f, sdom, b.Control.Block, b) {
|
||||||
f.Fatalf("control value %s for %s doesn't dominate", b.Control, b)
|
f.Fatalf("control value %s for %s doesn't dominate", b.Control, b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -274,18 +275,10 @@ func checkFunc(f *Func) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// domCheck reports whether x dominates y (including x==y).
|
// domCheck reports whether x dominates y (including x==y).
|
||||||
func domCheck(f *Func, idom []*Block, x, y *Block) bool {
|
func domCheck(f *Func, sdom sparseTree, x, y *Block) bool {
|
||||||
if y != f.Entry && idom[y.ID] == nil {
|
if !sdom.isAncestorEq(y, f.Entry) {
|
||||||
// unreachable - ignore
|
// unreachable - ignore
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for {
|
return sdom.isAncestorEq(x, y)
|
||||||
if x == y {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
y = idom[y.ID]
|
|
||||||
if y == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user