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) {
for _, b := range f.Blocks {
out:
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
}
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