diff options
| author | Rongrong <rongrong-for-oss@oss.cipunited.com> | 2026-02-12 14:56:43 +0800 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2026-02-24 22:26:34 -0800 |
| commit | a78df5aa0afcd64935f89577c0da0ed2315014ea (patch) | |
| tree | f44c844e1ed8a3325463becabd9eba71401fdecd /src | |
| parent | 60dc96479a85db0e245a5c14d964628169abedf4 (diff) | |
| download | go-a78df5aa0afcd64935f89577c0da0ed2315014ea.tar.xz | |
cmd/compile: rewriteFixedLoad: ensure AuxInt is sign-extended
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
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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/ssa/rewrite.go | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index b093081884..21c905b04f 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -2171,11 +2171,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) |
