]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't use fast32/64 map functions for aggregates
authorCherry Zhang <cherryyz@google.com>
Thu, 8 Apr 2021 18:41:44 +0000 (14:41 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 8 Apr 2021 21:02:58 +0000 (21:02 +0000)
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>
src/cmd/compile/internal/walk/walk.go

index d889786c7286a2f5e94990b186ab0572adf34ec5..1f0b7772634e40d7cd6c2592066db7943f9f78d6 100644 (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
                }