]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[release-branch.go1.22] cmd/compile: fix copying SSA-able variables optimization
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Thu, 7 Mar 2024 07:49:30 +0000 (14:49 +0700)
committerThan McIntosh <thanm@google.com>
Tue, 26 Mar 2024 19:24:40 +0000 (19:24 +0000)
CL 541715 added an optimization to copy SSA-able variables.

When handling m[k] = append(m[k], ...) case, it uses ir.SameSafeExpr to
check that m[k] expressions are the same, then doing type assertion to
convert the map index to ir.IndexExpr node. However, this assertion is
not safe for m[k] expression in append(m[k], ...), since it may be
wrapped by ir.OCONVNOP node.

Fixing this by un-wrapping any ir.OCONVNOP before doing type assertion.

Fixes #66178

Change-Id: I9ff7165ab97bc7f88d0e9b7b31604da19a8ca206
Reviewed-on: https://go-review.googlesource.com/c/go/+/569716
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/569818
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/walk/order.go
test/fixedbugs/issue66096.go [new file with mode: 0644]

index 179fbdb99e9872e89f28c28e5401ce3b17b55530..de180a4a8d77978861c938c43e07e2bedfb99b9e 100644 (file)
@@ -643,7 +643,12 @@ func (o *orderState) stmt(n ir.Node) {
                        indexLHS.Index = o.cheapExpr(indexLHS.Index)
 
                        call := n.Y.(*ir.CallExpr)
-                       indexRHS := call.Args[0].(*ir.IndexExpr)
+                       arg0 := call.Args[0]
+                       // ir.SameSafeExpr skips OCONVNOPs, so we must do the same here (#66096).
+                       for arg0.Op() == ir.OCONVNOP {
+                               arg0 = arg0.(*ir.ConvExpr).X
+                       }
+                       indexRHS := arg0.(*ir.IndexExpr)
                        indexRHS.X = indexLHS.X
                        indexRHS.Index = indexLHS.Index
 
diff --git a/test/fixedbugs/issue66096.go b/test/fixedbugs/issue66096.go
new file mode 100644 (file)
index 0000000..f8621a1
--- /dev/null
@@ -0,0 +1,17 @@
+// compile
+
+// Copyright 2024 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 p
+
+type Message struct {
+       Header map[string][]string
+}
+
+func f() {
+       m := Message{Header: map[string][]string{}}
+       m.Header[""] = append([]string(m.Header[""]), "")
+       _ = m
+}