]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: do not write implicit conversion for append in Unified IR
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Mon, 8 Aug 2022 19:55:42 +0000 (02:55 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Tue, 9 Aug 2022 12:18:20 +0000 (12:18 +0000)
Same as CL 418475, but for Unified IR.

Updates #53888
Fixes #54337

Change-Id: I31d5a7af04d8e3902ed25db85009d46ea4c38dbe
Reviewed-on: https://go-review.googlesource.com/c/go/+/422040
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/compile/internal/noder/reader.go
src/cmd/compile/internal/test/issue53888_test.go

index 668aa201a91cb3a90af2a9cf5e9059ab3f1138f1..4bdce25ccac61ffde0c95193986afc87dec557ec 100644 (file)
@@ -1989,6 +1989,13 @@ func (r *reader) expr() (res ir.Node) {
                case ir.OAPPEND:
                        n := n.(*ir.CallExpr)
                        n.RType = r.rtype(pos)
+                       // For append(a, b...), we don't need the implicit conversion. The typechecker already
+                       // ensured that a and b are both slices with the same base type, or []byte and string.
+                       if n.IsDDD {
+                               if conv, ok := n.Args[1].(*ir.ConvExpr); ok && conv.Op() == ir.OCONVNOP && conv.Implicit() {
+                                       n.Args[1] = conv.X
+                               }
+                       }
                case ir.OCOPY:
                        n := n.(*ir.BinaryExpr)
                        n.RType = r.rtype(pos)
index 89c40eca2b25480ef23898aa3669a204d78fe487..0d5b13b5c877b25097c6d02079a14d91744c5c16 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !race && !goexperiment.unified
+//go:build !race
 
 package test
 
@@ -11,7 +11,6 @@ import (
        "testing"
 )
 
-// TODO(cuonglm,mdempsky): figure out why Unifed IR failed?
 func TestAppendOfMake(t *testing.T) {
        testenv.SkipIfOptimizationOff(t)
        for n := 32; n < 33; n++ { // avoid stack allocation of make()