Skip to content

Commit

Permalink
cmd/compiler: make decompose shortcuts apply for PtrShaped, not just Ptr
Browse files Browse the repository at this point in the history
The immediate-data interface shortcuts also apply to pointer-shaped
things like maps, channels, and functions.

Fixes #63505.

Change-Id: I43982441bf523f53e9e5d183e95aea7c6655dd6b
Reviewed-on: https://go-review.googlesource.com/c/go/+/534657
TryBot-Result: Gopher Robot <[email protected]>
Run-TryBot: David Chase <[email protected]>
Auto-Submit: David Chase <[email protected]>
Reviewed-by: Cuong Manh Le <[email protected]>
Reviewed-by: Cherry Mui <[email protected]>
  • Loading branch information
dr2chase authored and gopherbot committed Oct 12, 2023
1 parent 872d718 commit eb832af
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 12 deletions.
8 changes: 4 additions & 4 deletions src/cmd/compile/internal/ssa/_gen/dec.rules
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,12 @@
// More annoying case: (ArraySelect[0] (StructSelect[0] isAPtr))
// There, result of the StructSelect is an Array (not a pointer) and
// the pre-rewrite input to the ArraySelect is a struct, not a pointer.
(StructSelect [0] x) && x.Type.IsPtr() => x
(ArraySelect [0] x) && x.Type.IsPtr() => x
(StructSelect [0] x) && x.Type.IsPtrShaped() => x
(ArraySelect [0] x) && x.Type.IsPtrShaped() => x

// These, too. Bits is bits.
(ArrayMake1 x) && x.Type.IsPtr() => x
(StructMake1 x) && x.Type.IsPtr() => x
(ArrayMake1 x) && x.Type.IsPtrShaped() => x
(StructMake1 x) && x.Type.IsPtrShaped() => x

(Store dst (StructMake1 <t> f0) mem) =>
(Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem)
Expand Down
16 changes: 8 additions & 8 deletions src/cmd/compile/internal/ssa/rewritedec.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

45 changes: 45 additions & 0 deletions test/fixedbugs/issue63505.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// 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 explainer struct {
m map[string]string
}

func init() {
RegisterExplainer(newExplainer())
}

type Explainer interface {
Name() string
Map() map[string]string
}

func (e explainer) Name() string {
return "HelloWorldExplainer"
}

func (e explainer) Map() map[string]string {
return e.m
}

//go:noinline
func newExplainer() explainer {
m := make(map[string]string)
m["Hello"] = "World!"
return explainer{m}
}

var explainers = make(map[string]Explainer)

func RegisterExplainer(e Explainer) {
explainers[e.Name()] = e
}

func main() {

}

0 comments on commit eb832af

Please sign in to comment.