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:
David Chase 2023-10-10 12:18:43 -04:00
parent f34964a5cf
commit 1493dd3cfc
3 changed files with 50 additions and 0 deletions

View file

@ -7,6 +7,8 @@
// types. These rules work together with the decomposeBuiltIn
// pass which handles phis of these types.
(Store {t} _ _ mem) && t.Size() == 0 => mem
// complex ops
(ComplexReal (ComplexMake real _ )) => real
(ComplexImag (ComplexMake _ imag )) => imag

View file

@ -583,6 +583,18 @@ func rewriteValuedec_OpStore(v *Value) bool {
b := v.Block
config := b.Func.Config
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)
// cond: t.Size() == 8
// result: (Store {typ.Float32} (OffPtr <typ.Float32Ptr> [4] dst) imag (Store {typ.Float32} dst real mem))

View 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()
}