mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00: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:
parent
a9e475a15a
commit
6c98ecda10
1 changed files with 12 additions and 0 deletions
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"cmd/compile/internal/ssagen"
|
"cmd/compile/internal/ssagen"
|
||||||
"cmd/compile/internal/typecheck"
|
"cmd/compile/internal/typecheck"
|
||||||
"cmd/compile/internal/types"
|
"cmd/compile/internal/types"
|
||||||
|
"cmd/internal/objabi"
|
||||||
"cmd/internal/src"
|
"cmd/internal/src"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -203,6 +204,13 @@ func mapfast(t *types.Type) int {
|
||||||
}
|
}
|
||||||
switch reflectdata.AlgType(t.Key()) {
|
switch reflectdata.AlgType(t.Key()) {
|
||||||
case types.AMEM32:
|
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() {
|
if !t.Key().HasPointers() {
|
||||||
return mapfast32
|
return mapfast32
|
||||||
}
|
}
|
||||||
|
|
@ -211,6 +219,10 @@ func mapfast(t *types.Type) int {
|
||||||
}
|
}
|
||||||
base.Fatalf("small pointer %v", t.Key())
|
base.Fatalf("small pointer %v", t.Key())
|
||||||
case types.AMEM64:
|
case types.AMEM64:
|
||||||
|
if objabi.Experiment.RegabiArgs && t.Key().NumComponents(types.CountBlankFields) != 1 {
|
||||||
|
// See above.
|
||||||
|
return mapslow
|
||||||
|
}
|
||||||
if !t.Key().HasPointers() {
|
if !t.Key().HasPointers() {
|
||||||
return mapfast64
|
return mapfast64
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue