Commit b006d38a authored by Dave Cheney's avatar Dave Cheney

cmd/internal/gc: more int to bool cleanups

- make paramoutheap return a bool
- convert Node.Assigned to a bool
- convert Node.Captured to a bool
- convert Node.Byval to a bool
- convert Node.Dupok to a bool
- convert Node.Wrapper to a bool
- convert Node.Reslice to a bool

Change-Id: I5b57c019f936c31d53db4db14459fb2b0aa72305
Reviewed-on: https://go-review.googlesource.com/7030Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Dave Cheney <dave@cheney.net>
parent 09b49bf1
......@@ -84,8 +84,8 @@ func typecheckclosure(func_ *Node, top int) {
for l := func_.Cvars; l != nil; l = l.Next {
n = l.N.Closure
if n.Captured == 0 {
n.Captured = 1
if !n.Captured {
n.Captured = true
if n.Decldepth == 0 {
Fatal("typecheckclosure: var %v does not have decldepth assigned", Nconv(n, obj.FmtShort))
}
......@@ -93,7 +93,7 @@ func typecheckclosure(func_ *Node, top int) {
// Ignore assignments to the variable in straightline code
// preceding the first capturing by a closure.
if n.Decldepth == decldepth {
n.Assigned = 0
n.Assigned = false
}
}
}
......@@ -254,8 +254,8 @@ func capturevars(xfunc *Node) {
v.Outerexpr = nil
// out parameters will be assigned to implicitly upon return.
if outer.Class != PPARAMOUT && !v.Closure.Addrtaken && v.Closure.Assigned == 0 && v.Type.Width <= 128 {
v.Byval = 1
if outer.Class != PPARAMOUT && !v.Closure.Addrtaken && !v.Closure.Assigned && v.Type.Width <= 128 {
v.Byval = true
} else {
v.Closure.Addrtaken = true
outer = Nod(OADDR, outer, nil)
......@@ -267,10 +267,10 @@ func capturevars(xfunc *Node) {
name = v.Curfn.Nname.Sym
}
how := "ref"
if v.Byval != 0 {
if v.Byval {
how = "value"
}
Warnl(int(v.Lineno), "%v capturing by %s: %v (addr=%d assign=%d width=%d)", Sconv(name, 0), how, Sconv(v.Sym, 0), v.Closure.Addrtaken, v.Closure.Assigned, int32(v.Type.Width))
Warnl(int(v.Lineno), "%v capturing by %s: %v (addr=%v assign=%v width=%d)", Sconv(name, 0), how, Sconv(v.Sym, 0), v.Closure.Addrtaken, v.Closure.Assigned, int32(v.Type.Width))
}
typecheck(&outer, Erv)
......@@ -322,7 +322,7 @@ func transformclosure(xfunc *Node) {
}
fld = typ(TFIELD)
fld.Funarg = 1
if v.Byval != 0 {
if v.Byval {
// If v is captured by value, we merely downgrade it to PPARAM.
v.Class = PPARAM
......@@ -378,14 +378,14 @@ func transformclosure(xfunc *Node) {
cv = Nod(OCLOSUREVAR, nil, nil)
cv.Type = v.Type
if v.Byval == 0 {
if !v.Byval {
cv.Type = Ptrto(v.Type)
}
offset = Rnd(offset, int64(cv.Type.Align))
cv.Xoffset = offset
offset += cv.Type.Width
if v.Byval != 0 && v.Type.Width <= int64(2*Widthptr) && Thearch.Thechar == '6' {
if v.Byval && v.Type.Width <= int64(2*Widthptr) && Thearch.Thechar == '6' {
// If it is a small variable captured by value, downgrade it to PAUTO.
// This optimization is currently enabled only for amd64, see:
// https://github.com/golang/go/issues/9865
......@@ -406,7 +406,7 @@ func transformclosure(xfunc *Node) {
addr.Curfn = xfunc
xfunc.Dcl = list(xfunc.Dcl, addr)
v.Heapaddr = addr
if v.Byval != 0 {
if v.Byval {
cv = Nod(OADDR, cv, nil)
}
body = list(body, Nod(OAS, addr, cv))
......@@ -453,7 +453,7 @@ func walkclosure(func_ *Node, init **NodeList) *Node {
continue
}
typ1 = typenod(v.Type)
if v.Byval == 0 {
if !v.Byval {
typ1 = Nod(OIND, typ1, nil)
}
typ.List = list(typ.List, Nod(ODCLFIELD, newname(v.Sym), typ1))
......@@ -588,7 +588,7 @@ func makepartialcall(fn *Node, t0 *Type, meth *Node) *Node {
xtype.Rlist = l
xfunc.Dupok = 1
xfunc.Dupok = true
xfunc.Nname = newname(sym)
xfunc.Nname.Sym.Flags |= SymExported // disable export
xfunc.Nname.Ntype = xtype
......
......@@ -719,7 +719,7 @@ func esc(e *EscState, n *Node, up *Node) {
continue
}
a = v.Closure
if v.Byval == 0 {
if !v.Byval {
a = Nod(OADDR, a, nil)
a.Lineno = v.Lineno
a.Escloopdepth = e.loopdepth
......
......@@ -285,7 +285,7 @@ func Jconv(n *Node, flag int) string {
fp += " addrtaken"
}
if n.Assigned != 0 {
if n.Assigned {
fp += " assigned"
}
......
......@@ -442,10 +442,10 @@ func compile(fn *Node) {
nam = nil
}
ptxt = Thearch.Gins(obj.ATEXT, nam, &nod1)
if fn.Dupok != 0 {
if fn.Dupok {
ptxt.From3.Offset |= obj.DUPOK
}
if fn.Wrapper != 0 {
if fn.Wrapper {
ptxt.From3.Offset |= obj.WRAPPER
}
if fn.Needctxt {
......
......@@ -893,7 +893,7 @@ func mergetemp(firstp *obj.Prog) {
for j = nfree; j < len(var_); j++ {
v1 = inuse[j]
if debugmerge > 0 && Debug['v'] != 0 {
fmt.Printf("consider %v: maybe %v: type=%v,%v addrtaken=%d,%d\n", Nconv(v.node, obj.FmtSharp), Nconv(v1.node, obj.FmtSharp), Tconv(t, 0), Tconv(v1.node.Type, 0), v.node.Addrtaken, v1.node.Addrtaken)
fmt.Printf("consider %v: maybe %v: type=%v,%v addrtaken=%v,%v\n", Nconv(v.node, obj.FmtSharp), Nconv(v1.node, obj.FmtSharp), Tconv(t, 0), Tconv(v1.node.Type, 0), v.node.Addrtaken, v1.node.Addrtaken)
}
// Require the types to match but also require the addrtaken bits to match.
......
......@@ -2474,7 +2474,7 @@ func genwrapper(rcvr *Type, method *Type, newnam *Sym, iface int) {
n.Left = newname(methodsym(method.Sym, methodrcvr, 0))
fn.Nbody = list(fn.Nbody, n)
} else {
fn.Wrapper = 1 // ignore frame for panic+recover matching
fn.Wrapper = true // ignore frame for panic+recover matching
call := Nod(OCALL, dot, nil)
call.List = args
call.Isddd = uint8(isddd)
......@@ -2496,7 +2496,7 @@ func genwrapper(rcvr *Type, method *Type, newnam *Sym, iface int) {
// wrappers where T is anonymous (struct or interface) can be duplicated.
if rcvr.Etype == TSTRUCT || rcvr.Etype == TINTER || Isptr[rcvr.Etype] && rcvr.Type.Etype == TSTRUCT {
fn.Dupok = 1
fn.Dupok = true
}
typecheck(&fn, Etop)
typechecklist(fn.Nbody, Etop)
......@@ -2751,7 +2751,7 @@ func genhash(sym *Sym, t *Type) {
funcbody(fn)
Curfn = fn
fn.Dupok = 1
fn.Dupok = true
typecheck(&fn, Etop)
typechecklist(fn.Nbody, Etop)
Curfn = nil
......@@ -2971,7 +2971,7 @@ func geneq(sym *Sym, t *Type) {
funcbody(fn)
Curfn = fn
fn.Dupok = 1
fn.Dupok = true
typecheck(&fn, Etop)
typechecklist(fn.Nbody, Etop)
Curfn = nil
......
......@@ -47,18 +47,18 @@ type Node struct {
Isddd uint8
Readonly bool
Implicit uint8
Addrtaken bool // address taken, even if not moved to heap
Assigned uint8 // is the variable ever assigned to
Captured uint8 // is the variable captured by a closure
Byval uint8 // is the variable captured by value or by reference
Dupok uint8 // duplicate definitions ok (for func)
Wrapper uint8 // is method wrapper (for func)
Reslice uint8 // this is a reslice x = x[0:y] or x = append(x, ...)
Likely int8 // likeliness of if statement
Hasbreak bool // has break statement
Needzero bool // if it contains pointers, needs to be zeroed on function entry
Needctxt bool // function uses context register (has closure variables)
Esc uint // EscXXX
Addrtaken bool // address taken, even if not moved to heap
Assigned bool // is the variable ever assigned to
Captured bool // is the variable captured by a closure
Byval bool // is the variable captured by value or by reference
Dupok bool // duplicate definitions ok (for func)
Wrapper bool // is method wrapper (for func)
Reslice bool // this is a reslice x = x[0:y] or x = append(x, ...)
Likely int8 // likeliness of if statement
Hasbreak bool // has break statement
Needzero bool // if it contains pointers, needs to be zeroed on function entry
Needctxt bool // function uses context register (has closure variables)
Esc uint // EscXXX
Funcdepth int
// most nodes
......
......@@ -3258,15 +3258,15 @@ func checkassign(stmt *Node, n *Node) {
r := outervalue(n)
var l *Node
for l = n; l != r; l = l.Left {
l.Assigned = 1
l.Assigned = true
if l.Closure != nil {
l.Closure.Assigned = 1
l.Closure.Assigned = true
}
}
l.Assigned = 1
l.Assigned = true
if l.Closure != nil {
l.Closure.Assigned = 1
l.Closure.Assigned = true
}
}
......@@ -3370,7 +3370,7 @@ func typecheckas(n *Node) {
OSLICE3,
OSLICESTR:
if false && samesafeexpr(n.Left, n.Right.Left) && (n.Right.Right.Left == nil || iszero(n.Right.Right.Left)) {
n.Right.Reslice = 1
n.Right.Reslice = true
}
// For x = append(x, ...), x can be updated in place when there is capacity,
......@@ -3379,7 +3379,7 @@ func typecheckas(n *Node) {
// TODO(rsc): Reenable once the emitted code does update the pointer.
case OAPPEND:
if false && n.Right.List != nil && samesafeexpr(n.Left, n.Right.List.N) {
n.Right.Reslice = 1
n.Right.Reslice = true
}
}
}
......
......@@ -91,21 +91,21 @@ func samelist(a *NodeList, b *NodeList) bool {
return a == b
}
func paramoutheap(fn *Node) int {
func paramoutheap(fn *Node) bool {
for l := fn.Dcl; l != nil; l = l.Next {
switch l.N.Class {
case PPARAMOUT,
PPARAMOUT | PHEAP:
return bool2int(l.N.Addrtaken)
return l.N.Addrtaken
// stop early - parameters are over
case PAUTO,
PAUTO | PHEAP:
return 0
return false
}
}
return 0
return false
}
// adds "adjust" to all the argument locations for the call n.
......@@ -284,7 +284,7 @@ func walkstmt(np **Node) {
if n.List == nil {
break
}
if (Curfn.Type.Outnamed != 0 && count(n.List) > 1) || paramoutheap(Curfn) != 0 {
if (Curfn.Type.Outnamed != 0 && count(n.List) > 1) || paramoutheap(Curfn) {
// assign to the function out parameters,
// so that reorder3 can fix up conflicts
var rl *NodeList
......@@ -2174,7 +2174,7 @@ func needwritebarrier(l *Node, r *Node) bool {
// generate the write barrier directly in that case.
// (It does not yet, but the cost of the write barrier will be
// small compared to the cost of the allocation.)
if r.Reslice != 0 {
if r.Reslice {
switch r.Op {
case OSLICE,
OSLICE3,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment