mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
![Cherry Zhang](/assets/img/avatar_default.png)
In expand_calls, when rewriting OpArg to OpArgIntReg/OpArgFloatReg, avoid generating duplicates. Otherwise it will confuse the register allocator: it would think the second occurance clobbers the first's register, causing it to generate copies, which may clobber other args. Change-Id: I4f1dc0519afb77500eae1c0e6ac8745e51f7aa4e Reviewed-on: https://go-review.googlesource.com/c/go/+/306029 Trust: Cherry Zhang <cherryyz@google.com> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: David Chase <drchase@google.com>
30 lines
587 B
Go
30 lines
587 B
Go
// run
|
|
|
|
// 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.
|
|
|
|
// When the function Store an Arg and also use it in another place,
|
|
// be sure not to generate duplicated OpArgXXXReg values, which confuses
|
|
// the register allocator.
|
|
|
|
package main
|
|
|
|
//go:noinline
|
|
//go:registerparams
|
|
func F(x, y float32) {
|
|
if x < 0 {
|
|
panic("FAIL")
|
|
}
|
|
g = [4]float32{x, y, x, y}
|
|
}
|
|
|
|
var g [4]float32
|
|
|
|
func main() {
|
|
F(1, 2)
|
|
if g[0] != 1 || g[1] != 2 || g[2] != 1 || g[3] != 2 {
|
|
panic("FAIL")
|
|
}
|
|
}
|