1
0
mirror of https://github.com/golang/go synced 2024-11-26 04:58:00 -07:00

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 <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
Cherry Zhang 2021-04-08 14:41:44 -04:00
parent a9e475a15a
commit 6c98ecda10

View File

@ -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
}