From c58c20f30f5b34af6b36b21b1348a5d8011612ac Mon Sep 17 00:00:00 2001 From: Todd Neal Date: Wed, 3 Feb 2016 21:06:21 -0500 Subject: [PATCH] [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 TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/check.go | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/cmd/compile/internal/ssa/check.go b/src/cmd/compile/internal/ssa/check.go index 220877242cd..796d899f7cf 100644 --- a/src/cmd/compile/internal/ssa/check.go +++ b/src/cmd/compile/internal/ssa/check.go @@ -253,6 +253,7 @@ func checkFunc(f *Func) { // Note: regalloc introduces non-dominating args. // See TODO in regalloc.go. idom := dominators(f) + sdom := newSparseTree(f, idom) for _, b := range f.Blocks { for _, v := range b.Values { for i, arg := range v.Args { @@ -261,12 +262,12 @@ func checkFunc(f *Func) { if v.Op == OpPhi { 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()) } } } - 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) } } @@ -274,18 +275,10 @@ func checkFunc(f *Func) { } // domCheck reports whether x dominates y (including x==y). -func domCheck(f *Func, idom []*Block, x, y *Block) bool { - if y != f.Entry && idom[y.ID] == nil { +func domCheck(f *Func, sdom sparseTree, x, y *Block) bool { + if !sdom.isAncestorEq(y, f.Entry) { // unreachable - ignore return true } - for { - if x == y { - return true - } - y = idom[y.ID] - if y == nil { - return false - } - } + return sdom.isAncestorEq(x, y) }