]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.26] cmd/compile: rewriteFixedLoad: ensure AuxInt is sign-extended
authorRongrong <rongrong-for-oss@oss.cipunited.com>
Thu, 12 Feb 2026 06:56:43 +0000 (14:56 +0800)
committerDavid Chase <drchase@google.com>
Wed, 25 Feb 2026 19:12:16 +0000 (11:12 -0800)
CL 701297 accidentailly broke the type casting behavior for Hash.

Previously, the generated rules for Hash shared a common pattern:

    v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))

which inherently equaled to a signed-extend:

    v.AuxInt = int64(int32(types.TypeHash(...)))

The pattern in CL 701297 was however:

    v.AuxInt = int64(types.TypeHash(t))

Since types.TypeHash() returns a uint32, casting it to a wider integer
implies zero-extend. This diverges from the definition of AuxInt, in
which "Unused portions are filled by sign-extending the used portion,
even if the represented value is unsigned."

As a result, ssa.checkFunc(), where AuxInt is checked against the
mentioned rule, is unhappy and shouts:

    internal compiler error: 'typeAsserts': bad int32 AuxInt value for v1317

Reproduce it with:

    GOARCH=mips go tool compile -m -d=ssa/check/on test/devirtualization.go

This is only reproducible with GOARCH=mips/mipsle (cross and native).
Probably the rewrite rules of other architectures prevent Hash from
running into rewriteFixedLoad.

Fix it by emit sign-extend properly. Additionally, do the same for Kind_
as reflectdata.ABIKindOfType() also returns a fragile unsigned interger
(uint8).

Updates #67304
Fixes #77786

Change-Id: Ib4f3c94c0e3908698868449db2fdcdf4541f2e7e
Reviewed-on: https://go-review.googlesource.com/c/go/+/744860
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Jake Bailey <jacob.b.bailey@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit a78df5aa0afcd64935f89577c0da0ed2315014ea)
Reviewed-on: https://go-review.googlesource.com/c/go/+/748780
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/ssa/rewrite.go

index 032915f701e1177d94878714a9d175c124739fa1..29222ffc89276e9a0e2a33253a9ed0f32941d7d7 100644 (file)
@@ -2169,11 +2169,11 @@ func rewriteFixedLoad(v *Value, sym Sym, sb *Value, off int64) *Value {
                                        return v
                                case "Hash":
                                        v.reset(OpConst32)
-                                       v.AuxInt = int64(types.TypeHash(t))
+                                       v.AuxInt = int64(int32(types.TypeHash(t)))
                                        return v
                                case "Kind_":
                                        v.reset(OpConst8)
-                                       v.AuxInt = int64(reflectdata.ABIKindOfType(t))
+                                       v.AuxInt = int64(int8(reflectdata.ABIKindOfType(t)))
                                        return v
                                case "GCData":
                                        gcdata, _ := reflectdata.GCSym(t, true)