mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 00:30:57 +00:00 
			
		
		
		
	[dev.regabi] cmd/compile: move Node.Opt to Name
Escape analysis uses Node.Opt to map nodes to their "location", so that other references to the same node use the same location again. But in the current implementation of escape analysis, we never need to refer back to a node's location except for named nodes (since other nodes are anonymous, and have no way to be referenced). This CL moves Opt from Node down to Name, turns it into a directly accessed field, and cleans up escape analysis to avoid setting Opt on non-named expressions. One nit: in walkCheckPtrArithmetic, we were abusing Opt as a way to detect/prevent loops. This CL adds a CheckPtr bit flag instead. Passes toolstash -cmp. Change-Id: If57d5ad8d972fa63bedbe69b9ebb6753e31aba85 Reviewed-on: https://go-review.googlesource.com/c/go/+/280638 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
		
							parent
							
								
									6acbae4fcc
								
							
						
					
					
						commit
						289da2b33e
					
				
					 7 changed files with 38 additions and 39 deletions
				
			
		|  | @ -48,8 +48,7 @@ type Expr interface { | |||
| 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? | ||||
| 	init  Nodes // TODO(rsc): Don't require every Node to have an init | ||||
| 	flags bitset8 | ||||
| } | ||||
| 
 | ||||
|  | @ -59,14 +58,13 @@ const ( | |||
| 	miniExprTransient | ||||
| 	miniExprBounded | ||||
| 	miniExprImplicit // for use by implementations; not supported by every Expr | ||||
| 	miniExprCheckPtr | ||||
| ) | ||||
| 
 | ||||
| func (*miniExpr) isExpr() {} | ||||
| 
 | ||||
| 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) NonNil() bool          { return n.flags&miniExprNonNil != 0 } | ||||
|  | @ -324,6 +322,8 @@ func NewConvExpr(pos src.XPos, op Op, typ *types.Type, x Node) *ConvExpr { | |||
| 
 | ||||
| func (n *ConvExpr) Implicit() bool     { return n.flags&miniExprImplicit != 0 } | ||||
| func (n *ConvExpr) SetImplicit(b bool) { n.flags.set(miniExprImplicit, b) } | ||||
| func (n *ConvExpr) CheckPtr() bool     { return n.flags&miniExprCheckPtr != 0 } | ||||
| func (n *ConvExpr) SetCheckPtr(b bool) { n.flags.set(miniExprCheckPtr, b) } | ||||
| 
 | ||||
| func (n *ConvExpr) SetOp(op Op) { | ||||
| 	switch op { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Matthew Dempsky
						Matthew Dempsky