]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: use standard dom tree in nilcheckelim
authorKeith Randall <khr@golang.org>
Fri, 7 Oct 2016 17:08:10 +0000 (10:08 -0700)
committerKeith Randall <khr@golang.org>
Fri, 7 Oct 2016 20:02:47 +0000 (20:02 +0000)
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 <khr@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/ssa/nilcheck.go

index dd94611e37a9792187908704eecaa3b834dc9ebc..a89132e65883ee21a3ebe195b556f3cc269fee28 100644 (file)
@@ -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})
                        }