mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
![Matthew Dempsky](/assets/img/avatar_default.png)
Currently, during walk we rewrite PAUTOHEAP uses into derefs of their corresponding Heapaddr, but we can easily do this instead during SSA construction. This does involve updating two test cases: * nilptr3.go This file had a test that we emit a "removed nil check" diagnostic for the implicit dereference from accessing a PAUTOHEAP variable. This CL removes this diagnostic, since it's not really useful to end users: from the user's point of view, there's no pointer anyway, so they needn't care about whether we check for nil or not. That's a purely internal detail. And with the PAUTOHEAP dereference handled during SSA construction, we can more robustly ensure this happens, rather than relying on setting a flag in walk and hoping that SSA sees it. * issue20780.go Previously, when PAUTOHEAPs were dereferenced during walk, it had a consequence that when they're passed as a function call argument, they would first get copied to the stack before being copied to their actual destination. Moving the dereferencing to SSA had a side-effect of eliminating this unnecessary temporary, and copying directly to the destination parameter. The test is updated to instead call "g(h(), h())" where h() returns a large value, as the first result will always need to be spilled somewhere will calling the second function. Maybe eventually we're smart enough to realize it can be spilled to the heap, but we don't do that today. Because I'm concerned that the direct copy-to-parameter optimization could interfere with race-detector instrumentation (e.g., maybe the copies were previously necessary to ensure they're not clobbered by inserted raceread calls?), I've also added issue20780b.go to exercise this in a few different ways. Change-Id: I720598cb32b17518bc10a03e555620c0f25fd28d Reviewed-on: https://go-review.googlesource.com/c/go/+/281293 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
63 lines
852 B
Go
63 lines
852 B
Go
// +build cgo,linux,amd64
|
|
// run -race
|
|
|
|
// Copyright 2021 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.
|
|
|
|
// Test that CL 281293 doesn't interfere with race detector
|
|
// instrumentation.
|
|
|
|
package main
|
|
|
|
import "fmt"
|
|
|
|
const N = 2e6
|
|
|
|
type Big = [N]int
|
|
|
|
var sink interface{}
|
|
|
|
func main() {
|
|
g(0, f(0))
|
|
|
|
x1 := f(1)
|
|
sink = &x1
|
|
g(1, x1)
|
|
g(7, f(7))
|
|
g(1, x1)
|
|
|
|
x3 := f(3)
|
|
sink = &x3
|
|
g(1, x1)
|
|
g(3, x3)
|
|
|
|
h(f(0), x1, f(2), x3, f(4))
|
|
}
|
|
|
|
//go:noinline
|
|
func f(k int) (x Big) {
|
|
for i := range x {
|
|
x[i] = k*N + i
|
|
}
|
|
return
|
|
}
|
|
|
|
//go:noinline
|
|
func g(k int, x Big) {
|
|
for i := range x {
|
|
if x[i] != k*N+i {
|
|
panic(fmt.Sprintf("x%d[%d] = %d", k, i, x[i]))
|
|
}
|
|
}
|
|
}
|
|
|
|
//go:noinline
|
|
func h(x0, x1, x2, x3, x4 Big) {
|
|
g(0, x0)
|
|
g(1, x1)
|
|
g(2, x2)
|
|
g(3, x3)
|
|
g(4, x4)
|
|
}
|