mirror of
https://github.com/golang/go.git
synced 2025-11-03 18:20:59 +00:00
[dev.regabi] cmd/compile: make ir.Name the ONAME Node implementation
Before this CL, an ONAME Node was represented by three structs linked together: a node, a Name, and a Param. Previous CLs removed OLABEL and OPACK from the set of nodes that knew about Name. Now Name can be repurposed to *be* the ONAME Node implementation, replacing three linked structs totaling 152+64+88 = 304 bytes (64-bit) with a single 232-byte struct. Many expressions in the code become simpler as well, without having to use .Param. and sometimes even .Name(). (For a node n where n.Name() != nil, n.Name() == n.(*Name) now.) Passes buildall w/ toolstash -cmp. Change-Id: Ie719f1285c05623b9fd2faaa059e5b360a64b3be Reviewed-on: https://go-review.googlesource.com/c/go/+/274094 Trust: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
f6106d195d
commit
862f638a89
24 changed files with 256 additions and 265 deletions
47
src/cmd/compile/internal/ir/expr.go
Normal file
47
src/cmd/compile/internal/ir/expr.go
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
// Copyright 2020 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ir
|
||||
|
||||
import (
|
||||
"cmd/compile/internal/types"
|
||||
)
|
||||
|
||||
// A miniStmt is a miniNode with extra fields common to expressions.
|
||||
// TODO(rsc): Once we are sure about the contents, compact the bools
|
||||
// into a bit field and leave extra bits available for implementations
|
||||
// embedding miniExpr. Right now there are ~60 unused bits sitting here.
|
||||
type miniExpr struct {
|
||||
miniNode
|
||||
typ *types.Type
|
||||
init Nodes // TODO(rsc): Don't require every Node to have an init
|
||||
opt interface{} // TODO(rsc): Don't require every Node to have an opt?
|
||||
flags bitset8
|
||||
}
|
||||
|
||||
const (
|
||||
miniExprHasCall = 1 << iota
|
||||
miniExprImplicit
|
||||
miniExprNonNil
|
||||
miniExprTransient
|
||||
miniExprBounded
|
||||
)
|
||||
|
||||
func (n *miniExpr) Type() *types.Type { return n.typ }
|
||||
func (n *miniExpr) SetType(x *types.Type) { n.typ = x }
|
||||
func (n *miniExpr) Opt() interface{} { return n.opt }
|
||||
func (n *miniExpr) SetOpt(x interface{}) { n.opt = x }
|
||||
func (n *miniExpr) HasCall() bool { return n.flags&miniExprHasCall != 0 }
|
||||
func (n *miniExpr) SetHasCall(b bool) { n.flags.set(miniExprHasCall, b) }
|
||||
func (n *miniExpr) Implicit() bool { return n.flags&miniExprImplicit != 0 }
|
||||
func (n *miniExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) }
|
||||
func (n *miniExpr) NonNil() bool { return n.flags&miniExprNonNil != 0 }
|
||||
func (n *miniExpr) MarkNonNil() { n.flags |= miniExprNonNil }
|
||||
func (n *miniExpr) Transient() bool { return n.flags&miniExprTransient != 0 }
|
||||
func (n *miniExpr) SetTransient(b bool) { n.flags.set(miniExprTransient, b) }
|
||||
func (n *miniExpr) Bounded() bool { return n.flags&miniExprBounded != 0 }
|
||||
func (n *miniExpr) SetBounded(b bool) { n.flags.set(miniExprBounded, b) }
|
||||
func (n *miniExpr) Init() Nodes { return n.init }
|
||||
func (n *miniExpr) PtrInit() *Nodes { return &n.init }
|
||||
func (n *miniExpr) SetInit(x Nodes) { n.init = x }
|
||||
Loading…
Add table
Add a link
Reference in a new issue