mirror of
https://github.com/golang/go
synced 2024-11-18 10:14:45 -07:00
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 <khr@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
433be563b6
commit
f4e37c8ec5
@ -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})
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user