]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "cmd/compile: allow StructSelect [x] of interface data fields for x>0"
authorKeith Randall <khr@golang.org>
Tue, 12 Aug 2025 00:31:03 +0000 (17:31 -0700)
committerKeith Randall <khr@golang.org>
Tue, 12 Aug 2025 05:36:26 +0000 (22:36 -0700)
This reverts commit bcd25c79aa5675d3e5d28c09715b8147906da006 (CL 693415)

Reason for revert: still causing compiler failures on Google test code

Change-Id: I887edcff56bde3ffa316f2b629021ad323a357fa
Reviewed-on: https://go-review.googlesource.com/c/go/+/694996
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
src/cmd/compile/internal/ssa/_gen/dec.rules
src/cmd/compile/internal/ssa/rewritedec.go
test/fixedbugs/issue74888.go [deleted file]

index d3052b2a5b554867610dce5fdb3ead62a7eb4152..5309a7f6b49f1edc9c9ccdcc5736f08ba6395b78 100644 (file)
@@ -98,7 +98,7 @@
 // Some of these are copied from generic.rules
 
 (IMake _typ (StructMake val)) => (IMake _typ val)
-(StructSelect (IData x)) => (IData x)
+(StructSelect [0] (IData x)) => (IData x)
 
 (StructSelect [i] x:(StructMake ___)) => x.Args[i]
 
 // 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    x) && x.Type.IsPtrShaped()  => x
+(StructSelect [0] x) && x.Type.IsPtrShaped()  => x
 (ArraySelect [0] x) && x.Type.IsPtrShaped()  => x
 
 // These, too.  Bits is bits.
index bdbda1aaa8e897e64cae3c13becb62284b3d3646..16d02692105b55a8620b495d869a3bc56e42fa60 100644 (file)
@@ -839,10 +839,10 @@ func rewriteValuedec_OpStructMake(v *Value) bool {
 func rewriteValuedec_OpStructSelect(v *Value) bool {
        v_0 := v.Args[0]
        b := v.Block
-       // match: (StructSelect (IData x))
+       // match: (StructSelect [0] (IData x))
        // result: (IData x)
        for {
-               if v_0.Op != OpIData {
+               if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
                        break
                }
                x := v_0.Args[0]
@@ -861,10 +861,13 @@ func rewriteValuedec_OpStructSelect(v *Value) bool {
                v.copyOf(x.Args[i])
                return true
        }
-       // match: (StructSelect x)
+       // match: (StructSelect [0] x)
        // cond: x.Type.IsPtrShaped()
        // result: x
        for {
+               if auxIntToInt64(v.AuxInt) != 0 {
+                       break
+               }
                x := v_0
                if !(x.Type.IsPtrShaped()) {
                        break
diff --git a/test/fixedbugs/issue74888.go b/test/fixedbugs/issue74888.go
deleted file mode 100644 (file)
index a0083ad..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// compile
-
-// Copyright 2025 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 P struct {
-       q struct{}
-       p *int
-}
-
-func f(x any) {
-       h(x.(P))
-}
-
-//go:noinline
-func h(P) {
-}