aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/likelyadjust.go
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2017-02-23 13:49:25 -0500
committerDavid Chase <drchase@google.com>2017-02-23 22:28:44 +0000
commitabdb2c35b6a0684b3eabe9892ff9e3518d2f4e78 (patch)
treeb9e734ecf659a4a0c98963794cfeedcc9fe4ade8 /src/cmd/compile/internal/ssa/likelyadjust.go
parent8ca68c3fec18bec7739ceac0f55681f915baa7f9 (diff)
downloadgo-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.go23
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()
}
}