]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/ir: remove AsNode
authorMatthew Dempsky <mdempsky@google.com>
Fri, 18 Aug 2023 07:09:06 +0000 (00:09 -0700)
committerGopher Robot <gobot@golang.org>
Fri, 18 Aug 2023 22:41:47 +0000 (22:41 +0000)
Except for a single call site in escape analysis, every use of
ir.AsNode involves a types.Object that's known to contain
an *ir.Name. Asserting directly to that type makes the code simpler
and more efficient.

The one use in escape analysis is extended to handle nil correctly
without it.

Change-Id: I694ae516903e541341d82c2f65a9155e4b0a9809
Reviewed-on: https://go-review.googlesource.com/c/go/+/520775
TryBot-Bypass: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Auto-Submit: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
src/cmd/compile/internal/escape/call.go
src/cmd/compile/internal/ir/expr.go
src/cmd/compile/internal/ir/node.go
src/cmd/compile/internal/reflectdata/alg.go
src/cmd/compile/internal/test/abiutilsaux_test.go
src/cmd/compile/internal/typecheck/syms.go

index 2ba1955b556bda5e14f8ca1a7428a430990d3faa..0caec2f6b982a6d76c01fcdcf6d002167da32092 100644 (file)
@@ -321,7 +321,10 @@ func (e *escape) tagHole(ks []hole, fn *ir.Name, param *types.Field) hole {
        }
 
        if e.inMutualBatch(fn) {
-               return e.addr(ir.AsNode(param.Nname))
+               if param.Nname == nil {
+                       return e.discardHole()
+               }
+               return e.addr(param.Nname.(*ir.Name))
        }
 
        // Call to previously tagged function.
index 5eed85ed84c0d0211674c2de885706b58f68cbce..37e2689b97ef8448fc2632d95f257f1be3156ca8 100644 (file)
@@ -1110,7 +1110,7 @@ func IsReflectHeaderDataField(l Node) bool {
 func ParamNames(ft *types.Type) []Node {
        args := make([]Node, ft.NumParams())
        for i, f := range ft.Params().FieldSlice() {
-               args[i] = AsNode(f.Nname)
+               args[i] = f.Nname.(*Name)
        }
        return args
 }
index 317c716b16a86e5f336b7cad8104d3f388daf494..b1829faf7f3117794a4f817df23ee74887691e30 100644 (file)
@@ -462,13 +462,6 @@ const (
 
 )
 
-func AsNode(n types.Object) Node {
-       if n == nil {
-               return nil
-       }
-       return n.(Node)
-}
-
 var BlankNode *Name
 
 func IsConst(n Node, ct constant.Kind) bool {
index d46b0cd360c5c2d2efa36703e81b339b943f6863..01135de39f4545991eb14f269ddce3b0f36ce66d 100644 (file)
@@ -153,8 +153,8 @@ func hashFunc(t *types.Type) *ir.Func {
        sym.Def = fn.Nname
        fn.Pragma |= ir.Noinline // TODO(mdempsky): We need to emit this during the unified frontend instead, to allow inlining.
 
-       np := ir.AsNode(fn.Type().Params().Field(0).Nname)
-       nh := ir.AsNode(fn.Type().Params().Field(1).Nname)
+       np := fn.Type().Params().Field(0).Nname.(*ir.Name)
+       nh := fn.Type().Params().Field(1).Nname.(*ir.Name)
 
        switch t.Kind() {
        case types.TARRAY:
@@ -375,9 +375,9 @@ func eqFunc(t *types.Type) *ir.Func {
        sym.Def = fn.Nname
        fn.Pragma |= ir.Noinline // TODO(mdempsky): We need to emit this during the unified frontend instead, to allow inlining.
 
-       np := ir.AsNode(fn.Type().Params().Field(0).Nname)
-       nq := ir.AsNode(fn.Type().Params().Field(1).Nname)
-       nr := ir.AsNode(fn.Type().Results().Field(0).Nname)
+       np := fn.Type().Params().Field(0).Nname.(*ir.Name)
+       nq := fn.Type().Params().Field(1).Nname.(*ir.Name)
+       nr := fn.Type().Results().Field(0).Nname.(*ir.Name)
 
        // Label to jump to if an equality test fails.
        neq := typecheck.AutoLabel(".neq")
index 3316af6940024f1b598c41f45b93ab6abe8a10e5..7f929c603da1a074d0740ffd947d0c7458694f98 100644 (file)
@@ -76,7 +76,7 @@ func tokenize(src string) []string {
 }
 
 func verifyParamResultOffset(t *testing.T, f *types.Field, r abi.ABIParamAssignment, which string, idx int) int {
-       n := ir.AsNode(f.Nname).(*ir.Name)
+       n := f.Nname.(*ir.Name)
        if n.FrameOffset() != int64(r.Offset()) {
                t.Errorf("%s %d: got offset %d wanted %d t=%v",
                        which, idx, r.Offset(), n.Offset_, f.Type)
index 4f751299981d3f58a2acd9c5bf0e33acaaa22c99..61a3422b1a714b55772bd4393d88e2b08272de41 100644 (file)
@@ -16,7 +16,7 @@ func LookupRuntime(name string) *ir.Name {
        if s == nil || s.Def == nil {
                base.Fatalf("LookupRuntime: can't find runtime.%s", name)
        }
-       return ir.AsNode(s.Def).(*ir.Name)
+       return s.Def.(*ir.Name)
 }
 
 // SubstArgTypes substitutes the given list of types for
@@ -126,5 +126,5 @@ func LookupCoverage(name string) *ir.Name {
        if sym == nil {
                base.Fatalf("LookupCoverage: can't find runtime/coverage.%s", name)
        }
-       return ir.AsNode(sym.Def).(*ir.Name)
+       return sym.Def.(*ir.Name)
 }