Commit a34fddf4 authored by Philip Hofer's avatar Philip Hofer Committed by Cherry Zhang

cmd/compile: in cse, allow for new ssa values

The table of rewrites in ssa/cse is not sized appropriately for
ssa IDs that are created during copying of selects into new blocks.

Fixes #17918

Change-Id: I65fe86c6aab5efa679aa473aadc4ee6ea882cd41
Reviewed-on: https://go-review.googlesource.com/33240Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
Reviewed-by: 's avatarDavid Chase <drchase@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 277bcbbd
...@@ -188,7 +188,10 @@ func cse(f *Func) { ...@@ -188,7 +188,10 @@ func cse(f *Func) {
for _, b := range f.Blocks { for _, b := range f.Blocks {
out: out:
for _, v := range b.Values { for _, v := range b.Values {
if rewrite[v.ID] != nil { // New values are created when selectors are copied to
// a new block. We can safely ignore those new values,
// since they have already been copied (issue 17918).
if int(v.ID) >= len(rewrite) || rewrite[v.ID] != nil {
continue continue
} }
if v.Op != OpSelect0 && v.Op != OpSelect1 { if v.Op != OpSelect0 && v.Op != OpSelect1 {
......
// compile
// Copyright 2016 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.
// Issue 17918: slice out-of-bounds in ssa/cse
package dead
import (
"fmt"
"time"
)
var (
units = []struct {
divisor time.Duration
unit rune
}{
{1000000, 's'},
{60, 'm'},
{60, 'h'},
{24, 'd'},
{7, 'w'},
}
)
func foobar(d time.Duration) string {
d /= time.Microsecond
unit := 'u'
for _, f := range units {
if d%f.divisor != 0 {
break
}
d /= f.divisor
unit = f.unit
}
return fmt.Sprintf("%d%c", d, unit)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment