From: Cherry Zhang Date: Thu, 8 Apr 2021 18:41:44 +0000 (-0400) Subject: cmd/compile: don't use fast32/64 map functions for aggregates X-Git-Tag: go1.17beta1~764 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6c98ecda100c2e3f8325d0b958f53aeaeb92c101;p=gostls13.git cmd/compile: don't use fast32/64 map functions for aggregates Under register ABI, aggregates like [2]uint32 is passed differently than a uint64. For now, don't use the fast version of the map functions for non-trivial aggregates. GOEXPERIMENT=regabi,regabiargs can now pass make.bash, modulo staleness checks. TODO: maybe find some way to use the fast functions. Maybe unsafe-cast to uint32/64 then call the map function. But need to make the type checker happy. Change-Id: If42717280dde12636fb970798cf1ca8fb29a3d06 Reviewed-on: https://go-review.googlesource.com/c/go/+/308650 Trust: Cherry Zhang Run-TryBot: Cherry Zhang Reviewed-by: David Chase --- diff --git a/src/cmd/compile/internal/walk/walk.go b/src/cmd/compile/internal/walk/walk.go index d889786c72..1f0b777263 100644 --- a/src/cmd/compile/internal/walk/walk.go +++ b/src/cmd/compile/internal/walk/walk.go @@ -14,6 +14,7 @@ import ( "cmd/compile/internal/ssagen" "cmd/compile/internal/typecheck" "cmd/compile/internal/types" + "cmd/internal/objabi" "cmd/internal/src" ) @@ -203,6 +204,13 @@ func mapfast(t *types.Type) int { } switch reflectdata.AlgType(t.Key()) { case types.AMEM32: + if objabi.Experiment.RegabiArgs && t.Key().NumComponents(types.CountBlankFields) != 1 { + // If key has multiple components, under register ABI it will + // be passed differently than uint32. + // TODO: maybe unsafe-case to uint32. But needs to make the type + // checker happy. + return mapslow + } if !t.Key().HasPointers() { return mapfast32 } @@ -211,6 +219,10 @@ func mapfast(t *types.Type) int { } base.Fatalf("small pointer %v", t.Key()) case types.AMEM64: + if objabi.Experiment.RegabiArgs && t.Key().NumComponents(types.CountBlankFields) != 1 { + // See above. + return mapslow + } if !t.Key().HasPointers() { return mapfast64 }