Skip to content

Commit

Permalink
cmd/compile: repaired loop-finder to handle trickier nesting
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dr2chase committed Feb 23, 2017
1 parent 8ca68c3 commit abdb2c3
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 6 deletions.
23 changes: 17 additions & 6 deletions src/cmd/compile/internal/ssa/likelyadjust.go
Expand Up @@ -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()
}
}

Expand Down
39 changes: 39 additions & 0 deletions test/fixedbugs/issue19217.go
@@ -0,0 +1,39 @@
// compile

// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package foo

import (
"encoding/binary"
)

type DbBuilder struct {
arr []int
}

func (bld *DbBuilder) Finish() error {
defer bld.Finish()

var hash []byte
for _, ixw := range bld.arr {
for {
if ixw != 0 {
panic("ixw != 0")
}
ixw--
insertOne:
for {
for i := 0; i < 1; i++ {
if binary.LittleEndian.Uint16(hash[i:]) == 0 {
break insertOne
}
}
}
}
}

return nil
}

0 comments on commit abdb2c3

Please sign in to comment.