mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
cmd/compile: get rid of zero-sized values in call expansion
Do this by removing all stores of zero-sized anything. Fixes #63433. Change-Id: I5d8271edab992d15d02005fa3fe31835f2eff8fa Reviewed-on: https://go-review.googlesource.com/c/go/+/534296 Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: David Chase <drchase@google.com> Reviewed-by: Keith Randall <khr@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
f34964a5cf
commit
1493dd3cfc
@ -7,6 +7,8 @@
|
|||||||
// types. These rules work together with the decomposeBuiltIn
|
// types. These rules work together with the decomposeBuiltIn
|
||||||
// pass which handles phis of these types.
|
// pass which handles phis of these types.
|
||||||
|
|
||||||
|
(Store {t} _ _ mem) && t.Size() == 0 => mem
|
||||||
|
|
||||||
// complex ops
|
// complex ops
|
||||||
(ComplexReal (ComplexMake real _ )) => real
|
(ComplexReal (ComplexMake real _ )) => real
|
||||||
(ComplexImag (ComplexMake _ imag )) => imag
|
(ComplexImag (ComplexMake _ imag )) => imag
|
||||||
|
@ -583,6 +583,18 @@ func rewriteValuedec_OpStore(v *Value) bool {
|
|||||||
b := v.Block
|
b := v.Block
|
||||||
config := b.Func.Config
|
config := b.Func.Config
|
||||||
typ := &b.Func.Config.Types
|
typ := &b.Func.Config.Types
|
||||||
|
// match: (Store {t} _ _ mem)
|
||||||
|
// cond: t.Size() == 0
|
||||||
|
// result: mem
|
||||||
|
for {
|
||||||
|
t := auxToType(v.Aux)
|
||||||
|
mem := v_2
|
||||||
|
if !(t.Size() == 0) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v.copyOf(mem)
|
||||||
|
return true
|
||||||
|
}
|
||||||
// match: (Store {t} dst (ComplexMake real imag) mem)
|
// match: (Store {t} dst (ComplexMake real imag) mem)
|
||||||
// cond: t.Size() == 8
|
// cond: t.Size() == 8
|
||||||
// result: (Store {typ.Float32} (OffPtr <typ.Float32Ptr> [4] dst) imag (Store {typ.Float32} dst real mem))
|
// result: (Store {typ.Float32} (OffPtr <typ.Float32Ptr> [4] dst) imag (Store {typ.Float32} dst real mem))
|
||||||
|
36
test/fixedbugs/issue63490.go
Normal file
36
test/fixedbugs/issue63490.go
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// compile
|
||||||
|
|
||||||
|
// Copyright 2023 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 main
|
||||||
|
|
||||||
|
type ResourceFunc struct {
|
||||||
|
junk [8]int
|
||||||
|
base assignmentBaseResource
|
||||||
|
}
|
||||||
|
|
||||||
|
type SubscriptionAssignmentResource struct {
|
||||||
|
base assignmentBaseResource
|
||||||
|
}
|
||||||
|
|
||||||
|
type assignmentBaseResource struct{}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func (a assignmentBaseResource) f(s string) ResourceFunc {
|
||||||
|
println(s)
|
||||||
|
return ResourceFunc{}
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func (r SubscriptionAssignmentResource) Hi() ResourceFunc {
|
||||||
|
rf := r.base.f("Hello world")
|
||||||
|
rf.base = r.base
|
||||||
|
return rf
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var r SubscriptionAssignmentResource
|
||||||
|
r.Hi()
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user