diff options
author | David Chase <drchase@google.com> | 2017-02-23 13:49:25 -0500 |
---|---|---|
committer | David Chase <drchase@google.com> | 2017-02-23 22:28:44 +0000 |
commit | abdb2c35b6a0684b3eabe9892ff9e3518d2f4e78 (patch) | |
tree | b9e734ecf659a4a0c98963794cfeedcc9fe4ade8 /src/cmd/compile/internal/ssa/likelyadjust.go | |
parent | 8ca68c3fec18bec7739ceac0f55681f915baa7f9 (diff) | |
download | go-abdb2c35b6a0684b3eabe9892ff9e3518d2f4e78.tar.gz go-abdb2c35b6a0684b3eabe9892ff9e3518d2f4e78.zip |
cmd/compile: repaired loop-finder to handle trickier nesting
The loop-A-encloses-loop-C code did not properly handle the
case where really C was already known to be enclosed by B,
and A was nearest-outer to B, not C.
Fixes #19217.
Change-Id: I755dd768e823cb707abdc5302fed39c11cdb34d4
Reviewed-on: https://go-review.googlesource.com/37340
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/likelyadjust.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/likelyadjust.go | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/cmd/compile/internal/ssa/likelyadjust.go b/src/cmd/compile/internal/ssa/likelyadjust.go index 5d3d258104..15fecde201 100644 --- a/src/cmd/compile/internal/ssa/likelyadjust.go +++ b/src/cmd/compile/internal/ssa/likelyadjust.go @@ -33,13 +33,24 @@ type loop struct { // outerinner records that outer contains inner func (sdom SparseTree) outerinner(outer, inner *loop) { + // There could be other outer loops found in some random order, + // locate the new outer loop appropriately among them. oldouter := inner.outer - if oldouter == nil || sdom.isAncestorEq(oldouter.header, outer.header) { - inner.outer = outer - outer.isInner = false - if inner.containsCall { - outer.setContainsCall() - } + for oldouter != nil && sdom.isAncestor(outer.header, oldouter.header) { + inner = oldouter + oldouter = inner.outer + } + if outer == oldouter { + return + } + if oldouter != nil { + outer.outer = oldouter + } + + inner.outer = outer + outer.isInner = false + if inner.containsCall { + outer.setContainsCall() } } |