From: Keith Randall Date: Fri, 7 Oct 2016 17:08:10 +0000 (-0700) Subject: cmd/compile: use standard dom tree in nilcheckelim X-Git-Tag: go1.8beta1~974 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f4e37c8ec5f54964221fc950c2f0260140f438d8;p=gostls13.git cmd/compile: use standard dom tree in nilcheckelim No need to build a bespoke dom tree here when we might have one cached already. The allocations for the dom tree were also more expensive than they needed to be. Fixes #12021 Change-Id: I6a967880aee03660ad6fc293f8fc783779cae11d Reviewed-on: https://go-review.googlesource.com/30671 Run-TryBot: Keith Randall Reviewed-by: Brad Fitzpatrick --- diff --git a/src/cmd/compile/internal/ssa/nilcheck.go b/src/cmd/compile/internal/ssa/nilcheck.go index dd94611e37..a89132e658 100644 --- a/src/cmd/compile/internal/ssa/nilcheck.go +++ b/src/cmd/compile/internal/ssa/nilcheck.go @@ -10,15 +10,7 @@ func nilcheckelim(f *Func) { // A nil check is redundant if the same nil check was successful in a // dominating block. The efficacy of this pass depends heavily on the // efficacy of the cse pass. - idom := f.idom() - domTree := make([][]*Block, f.NumBlocks()) - - // Create a block ID -> [dominees] mapping - for _, b := range f.Blocks { - if dom := idom[b.ID]; dom != nil { - domTree[dom.ID] = append(domTree[dom.ID], b) - } - } + sdom := f.sdom() // TODO: Eliminate more nil checks. // We can recursively remove any chain of fixed offset calculations, @@ -128,7 +120,7 @@ func nilcheckelim(f *Func) { b.Values = b.Values[:i] // Add all dominated blocks to the work list. - for _, w := range domTree[node.block.ID] { + for w := sdom[node.block.ID].child; w != nil; w = sdom[w.ID].sibling { work = append(work, bp{op: Work, block: w}) }