[dev.cc] cmd/internal/obj, cmd/internal/gc, new6g: reconvert

Reconvert using rsc.io/c2go rev 27b3f59.

Changes to converter:
 - fatal does not return, so no fallthrough after fatal in switch
 - many more function results and variables identified as bool
 - simplification of negated boolean expressions

Change-Id: I3bc67da5e46cb7ee613e230cf7e9533036cc870b
Reviewed-on: https://go-review.googlesource.com/5171
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
diff --git a/src/cmd/internal/gc/align.go b/src/cmd/internal/gc/align.go
index 062d35a..994b7a2 100644
--- a/src/cmd/internal/gc/align.go
+++ b/src/cmd/internal/gc/align.go
@@ -138,7 +138,7 @@
 	if t.Width == -2 {
 		lno = int(lineno)
 		lineno = int32(t.Lineno)
-		if !(t.Broke != 0) {
+		if t.Broke == 0 {
 			t.Broke = 1
 			Yyerror("invalid recursive type %v", Tconv(t, 0))
 		}
@@ -253,14 +253,14 @@
 		checkwidth(t.Down)
 
 	case TFORW: // should have been filled in
-		if !(t.Broke != 0) {
+		if t.Broke == 0 {
 			Yyerror("invalid recursive type %v", Tconv(t, 0))
 		}
 		w = 1 // anything will do
 
 		// dummy type; should be replaced before use.
 	case TANY:
-		if !(Debug['A'] != 0) {
+		if Debug['A'] == 0 {
 			Fatal("dowidth any")
 		}
 		w = 1 // anything will do
@@ -294,7 +294,7 @@
 			checkwidth(t.Type)
 			t.Align = uint8(Widthptr)
 		} else if t.Bound == -100 {
-			if !(t.Broke != 0) {
+			if t.Broke == 0 {
 				Yyerror("use of [...] array outside of array literal")
 				t.Broke = 1
 			}
@@ -394,7 +394,7 @@
 		Fatal("checkwidth %v", Tconv(t, 0))
 	}
 
-	if !(defercalc != 0) {
+	if defercalc == 0 {
 		dowidth(t)
 		return
 	}
@@ -427,7 +427,7 @@
 func resumecheckwidth() {
 	var l *TypeList
 
-	if !(defercalc != 0) {
+	if defercalc == 0 {
 		Fatal("resumecheckwidth")
 	}
 	for l = tlq; l != nil; l = tlq {
diff --git a/src/cmd/internal/gc/bits.go b/src/cmd/internal/gc/bits.go
index 613e15d..23da356 100644
--- a/src/cmd/internal/gc/bits.go
+++ b/src/cmd/internal/gc/bits.go
@@ -66,15 +66,15 @@
 	return c;
 }
 */
-func bany(a *Bits) int {
+func bany(a *Bits) bool {
 	var i int
 
 	for i = 0; i < BITS; i++ {
 		if a.b[i] != 0 {
-			return 1
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
 /*
@@ -112,8 +112,8 @@
 	return c
 }
 
-func btest(a *Bits, n uint) int {
-	return bool2int(a.b[n/64]&(1<<(n%64)) != 0)
+func btest(a *Bits, n uint) bool {
+	return a.b[n/64]&(1<<(n%64)) != 0
 }
 
 func biset(a *Bits, n uint) {
@@ -144,7 +144,7 @@
 
 	first = 1
 
-	for bany(&bits) != 0 {
+	for bany(&bits) {
 		i = bnum(bits)
 		if first != 0 {
 			first = 0
diff --git a/src/cmd/internal/gc/bv.go b/src/cmd/internal/gc/bv.go
index 998a1f5..002b5a4 100644
--- a/src/cmd/internal/gc/bv.go
+++ b/src/cmd/internal/gc/bv.go
@@ -120,15 +120,15 @@
 	return int(i)
 }
 
-func bvisempty(bv *Bvec) int {
+func bvisempty(bv *Bvec) bool {
 	var i int32
 
 	for i = 0; i < bv.n; i += WORDBITS {
 		if bv.b[i>>WORDSHIFT] != 0 {
-			return 0
+			return false
 		}
 	}
-	return 1
+	return true
 }
 
 func bvnot(bv *Bvec) {
diff --git a/src/cmd/internal/gc/closure.go b/src/cmd/internal/gc/closure.go
index 5a1ae65..4c9b0af 100644
--- a/src/cmd/internal/gc/closure.go
+++ b/src/cmd/internal/gc/closure.go
@@ -91,7 +91,7 @@
 
 	for l = func_.Cvars; l != nil; l = l.Next {
 		n = l.N.Closure
-		if !(n.Captured != 0) {
+		if n.Captured == 0 {
 			n.Captured = 1
 			if n.Decldepth == 0 {
 				Fatal("typecheckclosure: var %v does not have decldepth assigned", Nconv(n, obj.FmtShort))
@@ -218,7 +218,7 @@
 		v.Outerexpr = nil
 
 		// out parameters will be assigned to implicitly upon return.
-		if outer.Class != PPARAMOUT && !(v.Closure.Addrtaken != 0) && !(v.Closure.Assigned != 0) && v.Type.Width <= 128 {
+		if outer.Class != PPARAMOUT && v.Closure.Addrtaken == 0 && v.Closure.Assigned == 0 && v.Type.Width <= 128 {
 			v.Byval = 1
 		} else {
 			v.Closure.Addrtaken = 1
@@ -351,7 +351,7 @@
 			cv = Nod(OCLOSUREVAR, nil, nil)
 
 			cv.Type = v.Type
-			if !(v.Byval != 0) {
+			if v.Byval == 0 {
 				cv.Type = Ptrto(v.Type)
 			}
 			offset = Rnd(offset, int64(cv.Type.Align))
@@ -389,7 +389,7 @@
 		typechecklist(body, Etop)
 		walkstmtlist(body)
 		xfunc.Enter = body
-		xfunc.Needctxt = uint8(bool2int(nvar > 0))
+		xfunc.Needctxt = nvar > 0
 	}
 
 	lineno = int32(lno)
@@ -430,7 +430,7 @@
 			continue
 		}
 		typ1 = typenod(v.Type)
-		if !(v.Byval != 0) {
+		if v.Byval == 0 {
 			typ1 = Nod(OIND, typ1, nil)
 		}
 		typ.List = list(typ.List, Nod(ODCLFIELD, newname(v.Sym), typ1))
@@ -594,7 +594,7 @@
 	// Declare and initialize variable holding receiver.
 	body = nil
 
-	xfunc.Needctxt = 1
+	xfunc.Needctxt = true
 	cv = Nod(OCLOSUREVAR, nil, nil)
 	cv.Xoffset = int64(Widthptr)
 	cv.Type = rcvrtype
@@ -609,7 +609,7 @@
 	ptr.Used = 1
 	ptr.Curfn = xfunc
 	xfunc.Dcl = list(xfunc.Dcl, ptr)
-	if Isptr[rcvrtype.Etype] != 0 || Isinter(rcvrtype) != 0 {
+	if Isptr[rcvrtype.Etype] != 0 || Isinter(rcvrtype) {
 		ptr.Ntype = typenod(rcvrtype)
 		body = list(body, Nod(OAS, ptr, cv))
 	} else {
@@ -652,7 +652,7 @@
 	//
 	// Like walkclosure above.
 
-	if Isinter(n.Left.Type) != 0 {
+	if Isinter(n.Left.Type) {
 		// Trigger panic for method on nil interface now.
 		// Otherwise it happens in the wrapper and is confusing.
 		n.Left = cheapexpr(n.Left, init)
diff --git a/src/cmd/internal/gc/const.go b/src/cmd/internal/gc/const.go
index c8c244b..f9bd557 100644
--- a/src/cmd/internal/gc/const.go
+++ b/src/cmd/internal/gc/const.go
@@ -47,7 +47,7 @@
  * implicit conversion.
  */
 func Convlit(np **Node, t *Type) {
-	convlit1(np, t, 0)
+	convlit1(np, t, false)
 }
 
 /*
@@ -55,17 +55,17 @@
  * return a new node if necessary
  * (if n is a named constant, can't edit n->type directly).
  */
-func convlit1(np **Node, t *Type, explicit int) {
+func convlit1(np **Node, t *Type, explicit bool) {
 	var ct int
 	var et int
 	var n *Node
 	var nn *Node
 
 	n = *np
-	if n == nil || t == nil || n.Type == nil || isideal(t) != 0 || n.Type == t {
+	if n == nil || t == nil || n.Type == nil || isideal(t) || n.Type == t {
 		return
 	}
-	if !(explicit != 0) && !(isideal(n.Type) != 0) {
+	if !explicit && !isideal(n.Type) {
 		return
 	}
 
@@ -96,7 +96,7 @@
 
 		// target is invalid type for a constant?  leave alone.
 	case OLITERAL:
-		if !(okforconst[t.Etype] != 0) && n.Type.Etype != TNIL {
+		if okforconst[t.Etype] == 0 && n.Type.Etype != TNIL {
 			defaultlit(&n, nil)
 			*np = n
 			return
@@ -104,12 +104,12 @@
 
 	case OLSH,
 		ORSH:
-		convlit1(&n.Left, t, bool2int(explicit != 0 && isideal(n.Left.Type) != 0))
+		convlit1(&n.Left, t, explicit && isideal(n.Left.Type))
 		t = n.Left.Type
 		if t != nil && t.Etype == TIDEAL && n.Val.Ctype != CTINT {
 			n.Val = toint(n.Val)
 		}
-		if t != nil && !(Isint[t.Etype] != 0) {
+		if t != nil && Isint[t.Etype] == 0 {
 			Yyerror("invalid operation: %v (shift of type %v)", Nconv(n, 0), Tconv(t, 0))
 			t = nil
 		}
@@ -179,7 +179,7 @@
 			return
 
 		case TARRAY:
-			if !(Isslice(t) != 0) {
+			if !Isslice(t) {
 				goto bad
 			}
 
@@ -258,7 +258,7 @@
 			case CTCPLX:
 				overflow(n.Val, t)
 			}
-		} else if et == TSTRING && (ct == CTINT || ct == CTRUNE) && explicit != 0 {
+		} else if et == TSTRING && (ct == CTINT || ct == CTRUNE) && explicit {
 			n.Val = tostr(n.Val)
 		} else {
 			goto bad
@@ -269,14 +269,14 @@
 	return
 
 bad:
-	if !(n.Diag != 0) {
-		if !(t.Broke != 0) {
+	if n.Diag == 0 {
+		if t.Broke == 0 {
 			Yyerror("cannot convert %v to type %v", Nconv(n, 0), Tconv(t, 0))
 		}
 		n.Diag = 1
 	}
 
-	if isideal(n.Type) != 0 {
+	if isideal(n.Type) {
 		defaultlit(&n, nil)
 		*np = n
 	}
@@ -388,35 +388,35 @@
 	return v
 }
 
-func doesoverflow(v Val, t *Type) int {
+func doesoverflow(v Val, t *Type) bool {
 	switch v.Ctype {
 	case CTINT,
 		CTRUNE:
-		if !(Isint[t.Etype] != 0) {
+		if Isint[t.Etype] == 0 {
 			Fatal("overflow: %v integer constant", Tconv(t, 0))
 		}
 		if Mpcmpfixfix(v.U.Xval, Minintval[t.Etype]) < 0 || Mpcmpfixfix(v.U.Xval, Maxintval[t.Etype]) > 0 {
-			return 1
+			return true
 		}
 
 	case CTFLT:
-		if !(Isfloat[t.Etype] != 0) {
+		if Isfloat[t.Etype] == 0 {
 			Fatal("overflow: %v floating-point constant", Tconv(t, 0))
 		}
 		if mpcmpfltflt(v.U.Fval, minfltval[t.Etype]) <= 0 || mpcmpfltflt(v.U.Fval, maxfltval[t.Etype]) >= 0 {
-			return 1
+			return true
 		}
 
 	case CTCPLX:
-		if !(Iscomplex[t.Etype] != 0) {
+		if Iscomplex[t.Etype] == 0 {
 			Fatal("overflow: %v complex constant", Tconv(t, 0))
 		}
 		if mpcmpfltflt(&v.U.Cval.Real, minfltval[t.Etype]) <= 0 || mpcmpfltflt(&v.U.Cval.Real, maxfltval[t.Etype]) >= 0 || mpcmpfltflt(&v.U.Cval.Imag, minfltval[t.Etype]) <= 0 || mpcmpfltflt(&v.U.Cval.Imag, maxfltval[t.Etype]) >= 0 {
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
 func overflow(v Val, t *Type) {
@@ -426,7 +426,7 @@
 		return
 	}
 
-	if !(doesoverflow(v, t) != 0) {
+	if !doesoverflow(v, t) {
 		return
 	}
 
@@ -479,14 +479,14 @@
 	return int(n.Val.Ctype)
 }
 
-func Isconst(n *Node, ct int) int {
+func Isconst(n *Node, ct int) bool {
 	var t int
 
 	t = consttype(n)
 
 	// If the caller is asking for CTINT, allow CTRUNE too.
 	// Makes life easier for back ends.
-	return bool2int(t == ct || (ct == CTINT && t == CTRUNE))
+	return t == ct || (ct == CTINT && t == CTRUNE)
 }
 
 func saveorig(n *Node) *Node {
@@ -557,18 +557,18 @@
 		if n.Type == nil {
 			return
 		}
-		if !(okforconst[n.Type.Etype] != 0) && n.Type.Etype != TNIL {
+		if okforconst[n.Type.Etype] == 0 && n.Type.Etype != TNIL {
 			return
 		}
 
 		// merge adjacent constants in the argument list.
 	case OADDSTR:
 		for l1 = n.List; l1 != nil; l1 = l1.Next {
-			if Isconst(l1.N, CTSTR) != 0 && l1.Next != nil && Isconst(l1.Next.N, CTSTR) != 0 {
+			if Isconst(l1.N, CTSTR) && l1.Next != nil && Isconst(l1.Next.N, CTSTR) {
 				// merge from l1 up to but not including l2
 				str = new(Strlit)
 				l2 = l1
-				for l2 != nil && Isconst(l2.N, CTSTR) != 0 {
+				for l2 != nil && Isconst(l2.N, CTSTR) {
 					nr = l2.N
 					str.S += nr.Val.U.Sval.S
 					l2 = l2.Next
@@ -590,7 +590,7 @@
 		}
 
 		// collapse single-constant list to single constant.
-		if count(n.List) == 1 && Isconst(n.List.N, CTSTR) != 0 {
+		if count(n.List) == 1 && Isconst(n.List.N, CTSTR) {
 			n.Op = OLITERAL
 			n.Val = n.List.N.Val
 		}
@@ -655,7 +655,7 @@
 		defaultlit(&nr, Types[TUINT])
 
 		n.Right = nr
-		if nr.Type != nil && (Issigned[nr.Type.Etype] != 0 || !(Isint[nr.Type.Etype] != 0)) {
+		if nr.Type != nil && (Issigned[nr.Type.Etype] != 0 || Isint[nr.Type.Etype] == 0) {
 			goto illegal
 		}
 		if nl.Val.Ctype != CTRUNE {
@@ -787,7 +787,7 @@
 		// The default case above would print 'ideal % ideal',
 	// which is not quite an ideal error.
 	case OMOD<<16 | CTFLT:
-		if !(n.Diag != 0) {
+		if n.Diag == 0 {
 			Yyerror("illegal constant expression: floating-point % operation")
 			n.Diag = 1
 		}
@@ -985,7 +985,7 @@
 
 	switch uint32(n.Op)<<16 | uint32(v.Ctype) {
 	default:
-		if !(n.Diag != 0) {
+		if n.Diag == 0 {
 			Yyerror("illegal constant expression %v %v", Oconv(int(n.Op), 0), Tconv(nl.Type, 0))
 			n.Diag = 1
 		}
@@ -1006,7 +1006,7 @@
 		OCONV<<16 | CTRUNE,
 		OCONV<<16 | CTFLT,
 		OCONV<<16 | CTSTR:
-		convlit1(&nl, n.Type, 1)
+		convlit1(&nl, n.Type, true)
 
 		v = nl.Val
 
@@ -1058,7 +1058,7 @@
 		mpnegflt(&v.U.Cval.Imag)
 
 	case ONOT<<16 | CTBOOL:
-		if !(v.U.Bval != 0) {
+		if v.U.Bval == 0 {
 			goto settrue
 		}
 		goto setfalse
@@ -1087,18 +1087,18 @@
 
 settrue:
 	norig = saveorig(n)
-	*n = *Nodbool(1)
+	*n = *Nodbool(true)
 	n.Orig = norig
 	return
 
 setfalse:
 	norig = saveorig(n)
-	*n = *Nodbool(0)
+	*n = *Nodbool(false)
 	n.Orig = norig
 	return
 
 illegal:
-	if !(n.Diag != 0) {
+	if n.Diag == 0 {
 		Yyerror("illegal constant expression: %v %v %v", Tconv(nl.Type, 0), Oconv(int(n.Op), 0), Tconv(nr.Type, 0))
 		n.Diag = 1
 	}
@@ -1114,7 +1114,6 @@
 	switch v.Ctype {
 	default:
 		Fatal("nodlit ctype %d", v.Ctype)
-		fallthrough
 
 	case CTSTR:
 		n.Type = idealstring
@@ -1163,7 +1162,7 @@
 	var k1 int
 	var k2 int
 
-	if n == nil || !(isideal(n.Type) != 0) {
+	if n == nil || !isideal(n.Type) {
 		return CTxxx
 	}
 
@@ -1235,7 +1234,7 @@
 	var t1 *Type
 
 	n = *np
-	if n == nil || !(isideal(n.Type) != 0) {
+	if n == nil || !isideal(n.Type) {
 		return
 	}
 
@@ -1257,7 +1256,7 @@
 
 		if n.Val.Ctype == CTNIL {
 			lineno = int32(lno)
-			if !(n.Diag != 0) {
+			if n.Diag == 0 {
 				Yyerror("use of untyped nil")
 				n.Diag = 1
 			}
@@ -1341,17 +1340,17 @@
 	if l.Type == nil || r.Type == nil {
 		return
 	}
-	if !(isideal(l.Type) != 0) {
+	if !isideal(l.Type) {
 		Convlit(rp, l.Type)
 		return
 	}
 
-	if !(isideal(r.Type) != 0) {
+	if !isideal(r.Type) {
 		Convlit(lp, r.Type)
 		return
 	}
 
-	if !(force != 0) {
+	if force == 0 {
 		return
 	}
 	if l.Type.Etype == TBOOL {
@@ -1387,8 +1386,8 @@
 	return stringsCompare(l.Val.U.Sval.S, r.Val.U.Sval.S)
 }
 
-func Smallintconst(n *Node) int {
-	if n.Op == OLITERAL && Isconst(n, CTINT) != 0 && n.Type != nil {
+func Smallintconst(n *Node) bool {
+	if n.Op == OLITERAL && Isconst(n, CTINT) && n.Type != nil {
 		switch Simtype[n.Type.Etype] {
 		case TINT8,
 			TUINT8,
@@ -1398,7 +1397,7 @@
 			TUINT32,
 			TBOOL,
 			TPTR32:
-			return 1
+			return true
 
 		case TIDEAL,
 			TINT64,
@@ -1407,11 +1406,11 @@
 			if Mpcmpfixfix(n.Val.U.Xval, Minintval[TINT32]) < 0 || Mpcmpfixfix(n.Val.U.Xval, Maxintval[TINT32]) > 0 {
 				break
 			}
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
 func nonnegconst(n *Node) int {
@@ -1491,7 +1490,6 @@
 		switch val.Ctype {
 		default:
 			Fatal("convconst ctype=%d %v", val.Ctype, Tconv(t, obj.FmtLong))
-			fallthrough
 
 		case CTINT,
 			CTRUNE:
@@ -1615,7 +1613,7 @@
 // may be known at compile time, are not Go language constants.
 // Only called for expressions known to evaluated to compile-time
 // constants.
-func isgoconst(n *Node) int {
+func isgoconst(n *Node) bool {
 	var l *Node
 	var t *Type
 
@@ -1652,20 +1650,20 @@
 		OCOMPLEX,
 		OREAL,
 		OIMAG:
-		if isgoconst(n.Left) != 0 && (n.Right == nil || isgoconst(n.Right) != 0) {
-			return 1
+		if isgoconst(n.Left) && (n.Right == nil || isgoconst(n.Right)) {
+			return true
 		}
 
 	case OCONV:
-		if okforconst[n.Type.Etype] != 0 && isgoconst(n.Left) != 0 {
-			return 1
+		if okforconst[n.Type.Etype] != 0 && isgoconst(n.Left) {
+			return true
 		}
 
 	case OLEN,
 		OCAP:
 		l = n.Left
-		if isgoconst(l) != 0 {
-			return 1
+		if isgoconst(l) {
+			return true
 		}
 
 		// Special case: len/cap is constant when applied to array or
@@ -1676,24 +1674,24 @@
 		if t != nil && Isptr[t.Etype] != 0 {
 			t = t.Type
 		}
-		if Isfixedarray(t) != 0 && !(hascallchan(l) != 0) {
-			return 1
+		if Isfixedarray(t) && !hascallchan(l) {
+			return true
 		}
 
 	case OLITERAL:
 		if n.Val.Ctype != CTNIL {
-			return 1
+			return true
 		}
 
 	case ONAME:
 		l = n.Sym.Def
 		if l != nil && l.Op == OLITERAL && n.Val.Ctype != CTNIL {
-			return 1
+			return true
 		}
 
 	case ONONAME:
 		if n.Sym.Def != nil && n.Sym.Def.Op == OIOTA {
-			return 1
+			return true
 		}
 
 		// Only constant calls are unsafe.Alignof, Offsetof, and Sizeof.
@@ -1707,19 +1705,19 @@
 			break
 		}
 		if l.Sym.Name == "Alignof" || l.Sym.Name == "Offsetof" || l.Sym.Name == "Sizeof" {
-			return 1
+			return true
 		}
 	}
 
 	//dump("nonconst", n);
-	return 0
+	return false
 }
 
-func hascallchan(n *Node) int {
+func hascallchan(n *Node) bool {
 	var l *NodeList
 
 	if n == nil {
-		return 0
+		return false
 	}
 	switch n.Op {
 	case OAPPEND,
@@ -1742,23 +1740,23 @@
 		OREAL,
 		ORECOVER,
 		ORECV:
-		return 1
+		return true
 	}
 
-	if hascallchan(n.Left) != 0 || hascallchan(n.Right) != 0 {
-		return 1
+	if hascallchan(n.Left) || hascallchan(n.Right) {
+		return true
 	}
 
 	for l = n.List; l != nil; l = l.Next {
-		if hascallchan(l.N) != 0 {
-			return 1
+		if hascallchan(l.N) {
+			return true
 		}
 	}
 	for l = n.Rlist; l != nil; l = l.Next {
-		if hascallchan(l.N) != 0 {
-			return 1
+		if hascallchan(l.N) {
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
diff --git a/src/cmd/internal/gc/cplx.go b/src/cmd/internal/gc/cplx.go
index bc5b547..34decd1 100644
--- a/src/cmd/internal/gc/cplx.go
+++ b/src/cmd/internal/gc/cplx.go
@@ -10,12 +10,12 @@
 	return a<<16 | b
 }
 
-func overlap_cplx(f *Node, t *Node) int {
+func overlap_cplx(f *Node, t *Node) bool {
 	// check whether f and t could be overlapping stack references.
 	// not exact, because it's hard to check for the stack register
 	// in portable code.  close enough: worst case we will allocate
 	// an extra temporary and the registerizer will clean it up.
-	return bool2int(f.Op == OINDREG && t.Op == OINDREG && f.Xoffset+f.Type.Width >= t.Xoffset && t.Xoffset+t.Type.Width >= f.Xoffset)
+	return f.Op == OINDREG && t.Op == OINDREG && f.Xoffset+f.Type.Width >= t.Xoffset && t.Xoffset+t.Type.Width >= f.Xoffset
 }
 
 func Complexbool(op int, nl *Node, nr *Node, true_ bool, likely int, to *obj.Prog) {
@@ -31,20 +31,20 @@
 
 	// make both sides addable in ullman order
 	if nr != nil {
-		if nl.Ullman > nr.Ullman && !(nl.Addable != 0) {
+		if nl.Ullman > nr.Ullman && nl.Addable == 0 {
 			Tempname(&tnl, nl.Type)
 			Thearch.Cgen(nl, &tnl)
 			nl = &tnl
 		}
 
-		if !(nr.Addable != 0) {
+		if nr.Addable == 0 {
 			Tempname(&tnr, nr.Type)
 			Thearch.Cgen(nr, &tnr)
 			nr = &tnr
 		}
 	}
 
-	if !(nl.Addable != 0) {
+	if nl.Addable == 0 {
 		Tempname(&tnl, nl.Type)
 		Thearch.Cgen(nl, &tnl)
 		nl = &tnl
@@ -87,7 +87,7 @@
 	var tc int
 	var t *Type
 
-	if !(nc.Addable != 0) {
+	if nc.Addable == 0 {
 		Fatal("subnode not addable")
 	}
 
@@ -243,7 +243,7 @@
 	n.Val.Ctype = CTFLT
 	n.Type = t
 
-	if !(Isfloat[t.Etype] != 0) {
+	if Isfloat[t.Etype] == 0 {
 		Fatal("nodfconst: bad type %v", Tconv(t, 0))
 	}
 }
@@ -251,7 +251,7 @@
 /*
  * cplx.c
  */
-func Complexop(n *Node, res *Node) int {
+func Complexop(n *Node, res *Node) bool {
 	if n != nil && n.Type != nil {
 		if Iscomplex[n.Type.Etype] != 0 {
 			goto maybe
@@ -292,11 +292,11 @@
 
 	//dump("\ncomplex-no", n);
 no:
-	return 0
+	return false
 
 	//dump("\ncomplex-yes", n);
 yes:
-	return 1
+	return true
 }
 
 func Complexmove(f *Node, t *Node) {
@@ -313,7 +313,7 @@
 		Dump("complexmove-t", t)
 	}
 
-	if !(t.Addable != 0) {
+	if t.Addable == 0 {
 		Fatal("complexmove: to not addable")
 	}
 
@@ -322,7 +322,6 @@
 	switch uint32(ft)<<16 | uint32(tt) {
 	default:
 		Fatal("complexmove: unknown conversion: %v -> %v\n", Tconv(f.Type, 0), Tconv(t.Type, 0))
-		fallthrough
 
 		// complex to complex move/convert.
 	// make f addable.
@@ -331,7 +330,7 @@
 		TCOMPLEX64<<16 | TCOMPLEX128,
 		TCOMPLEX128<<16 | TCOMPLEX64,
 		TCOMPLEX128<<16 | TCOMPLEX128:
-		if !(f.Addable != 0) || overlap_cplx(f, t) != 0 {
+		if f.Addable == 0 || overlap_cplx(f, t) {
 			Tempname(&tmp, f.Type)
 			Complexmove(f, &tmp)
 			f = &tmp
@@ -380,7 +379,7 @@
 	case OREAL,
 		OIMAG:
 		nl = n.Left
-		if !(nl.Addable != 0) {
+		if nl.Addable == 0 {
 			Tempname(&tmp, nl.Type)
 			Complexgen(nl, &tmp)
 			nl = &tmp
@@ -403,7 +402,7 @@
 	tr = Simsimtype(n.Type)
 	tr = cplxsubtype(tr)
 	if tl != tr {
-		if !(n.Addable != 0) {
+		if n.Addable == 0 {
 			Tempname(&n1, n.Type)
 			Complexmove(n, &n1)
 			n = &n1
@@ -413,7 +412,7 @@
 		return
 	}
 
-	if !(res.Addable != 0) {
+	if res.Addable == 0 {
 		Thearch.Igen(res, &n1, nil)
 		Thearch.Cgen(n, &n1)
 		Thearch.Regfree(&n1)
@@ -429,7 +428,6 @@
 	default:
 		Dump("complexgen: unknown op", n)
 		Fatal("complexgen: unknown op %v", Oconv(int(n.Op), 0))
-		fallthrough
 
 	case ODOT,
 		ODOTPTR,
@@ -464,20 +462,20 @@
 
 	// make both sides addable in ullman order
 	if nr != nil {
-		if nl.Ullman > nr.Ullman && !(nl.Addable != 0) {
+		if nl.Ullman > nr.Ullman && nl.Addable == 0 {
 			Tempname(&tnl, nl.Type)
 			Thearch.Cgen(nl, &tnl)
 			nl = &tnl
 		}
 
-		if !(nr.Addable != 0) {
+		if nr.Addable == 0 {
 			Tempname(&tnr, nr.Type)
 			Thearch.Cgen(nr, &tnr)
 			nr = &tnr
 		}
 	}
 
-	if !(nl.Addable != 0) {
+	if nl.Addable == 0 {
 		Tempname(&tnl, nl.Type)
 		Thearch.Cgen(nl, &tnl)
 		nl = &tnl
diff --git a/src/cmd/internal/gc/dcl.go b/src/cmd/internal/gc/dcl.go
index 0aeb587..577f7ec 100644
--- a/src/cmd/internal/gc/dcl.go
+++ b/src/cmd/internal/gc/dcl.go
@@ -10,17 +10,17 @@
 	"strings"
 )
 
-func dflag() int {
-	if !(Debug['d'] != 0) {
-		return 0
+func dflag() bool {
+	if Debug['d'] == 0 {
+		return false
 	}
 	if Debug['y'] != 0 {
-		return 1
+		return true
 	}
 	if incannedimport != 0 {
-		return 0
+		return false
 	}
-	return 1
+	return true
 }
 
 /*
@@ -49,7 +49,7 @@
 
 	d = push()
 	dcopy(d, s)
-	if dflag() != 0 {
+	if dflag() {
 		fmt.Printf("\t%v push %v %p\n", Ctxt.Line(int(lineno)), Sconv(s, 0), s.Def)
 	}
 	return d
@@ -71,7 +71,7 @@
 		lno = int(s.Lastlineno)
 		dcopy(s, d)
 		d.Lastlineno = int32(lno)
-		if dflag() != 0 {
+		if dflag() {
 			fmt.Printf("\t%v pop %v %p\n", Ctxt.Line(int(lineno)), Sconv(s, 0), s.Def)
 		}
 	}
@@ -195,7 +195,7 @@
 	s = n.Sym
 
 	// kludgy: typecheckok means we're past parsing.  Eg genwrapper may declare out of package names later.
-	if importpkg == nil && !(typecheckok != 0) && s.Pkg != localpkg {
+	if importpkg == nil && typecheckok == 0 && s.Pkg != localpkg {
 		Yyerror("cannot declare name %v", Sconv(s, 0))
 	}
 
@@ -206,7 +206,7 @@
 	gen = 0
 	if ctxt == PEXTERN {
 		externdcl = list(externdcl, n)
-		if dflag() != 0 {
+		if dflag() {
 			fmt.Printf("\t%v global decl %v %p\n", Ctxt.Line(int(lineno)), Sconv(s, 0), n)
 		}
 	} else {
@@ -264,14 +264,14 @@
  * new_name_list (type | [type] = expr_list)
  */
 func variter(vl *NodeList, t *Node, el *NodeList) *NodeList {
-	var doexpr int
+	var doexpr bool
 	var v *Node
 	var e *Node
 	var as2 *Node
 	var init *NodeList
 
 	init = nil
-	doexpr = bool2int(el != nil)
+	doexpr = el != nil
 
 	if count(el) == 1 && count(vl) > 1 {
 		e = el.N
@@ -293,7 +293,7 @@
 	}
 
 	for ; vl != nil; vl = vl.Next {
-		if doexpr != 0 {
+		if doexpr {
 			if el == nil {
 				Yyerror("missing expression in var declaration")
 				break
@@ -479,17 +479,17 @@
 /*
  * := declarations
  */
-func colasname(n *Node) int {
+func colasname(n *Node) bool {
 	switch n.Op {
 	case ONAME,
 		ONONAME,
 		OPACK,
 		OTYPE,
 		OLITERAL:
-		return bool2int(n.Sym != nil)
+		return n.Sym != nil
 	}
 
-	return 0
+	return false
 }
 
 func colasdefn(left *NodeList, defn *Node) {
@@ -511,7 +511,7 @@
 		if isblank(n) {
 			continue
 		}
-		if !(colasname(n) != 0) {
+		if !colasname(n) {
 			yyerrorl(int(defn.Lineno), "non-name %v on left side of :=", Nconv(n, 0))
 			nerr++
 			continue
@@ -735,7 +735,7 @@
 
 	if t.Thistuple != 0 {
 		for ft = getthisx(t).Type; ft != nil; ft = ft.Down {
-			if !(ft.Nname != nil) || !(ft.Nname.Sym != nil) {
+			if ft.Nname == nil || ft.Nname.Sym == nil {
 				continue
 			}
 			n = ft.Nname // no need for newname(ft->nname->sym)
@@ -746,7 +746,7 @@
 
 	if t.Intuple != 0 {
 		for ft = getinargx(t).Type; ft != nil; ft = ft.Down {
-			if !(ft.Nname != nil) || !(ft.Nname.Sym != nil) {
+			if ft.Nname == nil || ft.Nname.Sym == nil {
 				continue
 			}
 			n = ft.Nname
@@ -757,7 +757,7 @@
 
 	if t.Outtuple != 0 {
 		for ft = getoutargx(t).Type; ft != nil; ft = ft.Down {
-			if !(ft.Nname != nil) || !(ft.Nname.Sym != nil) {
+			if ft.Nname == nil || ft.Nname.Sym == nil {
 				continue
 			}
 			n = ft.Nname
@@ -925,7 +925,7 @@
 		tp = &f.Down
 	}
 
-	for f = t.Type; f != nil && !(t.Broke != 0); f = f.Down {
+	for f = t.Type; f != nil && t.Broke == 0; f = f.Down {
 		if f.Broke != 0 {
 			t.Broke = 1
 		}
@@ -934,7 +934,7 @@
 	uniqgen++
 	checkdupfields(t.Type, "field")
 
-	if !(t.Broke != 0) {
+	if t.Broke == 0 {
 		checkwidth(t)
 	}
 
@@ -962,7 +962,7 @@
 		tp = &f.Down
 	}
 
-	for f = t.Type; f != nil && !(t.Broke != 0); f = f.Down {
+	for f = t.Type; f != nil && t.Broke == 0; f = f.Down {
 		if f.Broke != 0 {
 			t.Broke = 1
 		}
@@ -1072,7 +1072,7 @@
 		}
 	}
 
-	for f = t.Type; f != nil && !(t.Broke != 0); f = f.Down {
+	for f = t.Type; f != nil && t.Broke == 0; f = f.Down {
 		if f.Broke != 0 {
 			t.Broke = 1
 		}
@@ -1199,7 +1199,7 @@
 		}
 		n = Nod(ODCLFIELD, n, t)
 		if n.Right != nil && n.Right.Op == ODDD {
-			if !(input != 0) {
+			if input == 0 {
 				Yyerror("cannot use ... in output argument list")
 			} else if l.Next != nil {
 				Yyerror("can only use ... as final argument in list")
@@ -1232,23 +1232,23 @@
  * *struct{} as the receiver.
  * (See fakethis above.)
  */
-func isifacemethod(f *Type) int {
+func isifacemethod(f *Type) bool {
 	var rcvr *Type
 	var t *Type
 
 	rcvr = getthisx(f).Type
 	if rcvr.Sym != nil {
-		return 0
+		return false
 	}
 	t = rcvr.Type
-	if !(Isptr[t.Etype] != 0) {
-		return 0
+	if Isptr[t.Etype] == 0 {
+		return false
 	}
 	t = t.Type
 	if t.Sym != nil || t.Etype != TSTRUCT || t.Type != nil {
-		return 0
+		return false
 	}
-	return 1
+	return true
 }
 
 /*
@@ -1480,7 +1480,7 @@
 		}
 	}
 
-	if local && !(pa.Local != 0) {
+	if local && pa.Local == 0 {
 		// defining method on non-local type.
 		Yyerror("cannot define new methods on non-local type %v", Tconv(pa, 0))
 
@@ -1506,7 +1506,7 @@
 	}
 
 	f = structfield(n)
-	f.Nointerface = uint8(bool2int(nointerface))
+	f.Nointerface = nointerface
 
 	// during import unexported method names should be in the type's package
 	if importpkg != nil && f.Sym != nil && !exportname(f.Sym.Name) && f.Sym.Pkg != structpkg {
diff --git a/src/cmd/internal/gc/esc.go b/src/cmd/internal/gc/esc.go
index 35543e1..f4d5b43 100644
--- a/src/cmd/internal/gc/esc.go
+++ b/src/cmd/internal/gc/esc.go
@@ -69,7 +69,7 @@
 
 func visit(n *Node) uint32 {
 	var min uint32
-	var recursive uint32
+	var recursive bool
 	var l *NodeList
 	var block *NodeList
 
@@ -95,7 +95,7 @@
 		// If visitcodelist found its way back to n->walkgen, then this
 		// block is a set of mutually recursive functions.
 		// Otherwise it's just a lone function that does not recurse.
-		recursive = uint32(bool2int(min == n.Walkgen))
+		recursive = min == n.Walkgen
 
 		// Remove connected component from stack.
 		// Mark walkgen so that future visits return a large number
@@ -110,7 +110,7 @@
 		l.Next = nil
 
 		// Run escape analysis on this set of functions.
-		analyze(block, int(recursive))
+		analyze(block, recursive)
 	}
 
 	return min
@@ -199,7 +199,7 @@
 	dstcount  int
 	edgecount int
 	noesc     *NodeList
-	recursive int
+	recursive bool
 }
 
 var tags [16]*Strlit
@@ -247,7 +247,7 @@
 	return EscReturn | em<<EscBits
 }
 
-func analyze(all *NodeList, recursive int) {
+func analyze(all *NodeList, recursive bool) {
 	var l *NodeList
 	var es EscState
 	var e *EscState
@@ -351,7 +351,7 @@
 	}
 
 	// in a mutually recursive group we lose track of the return values
-	if e.recursive != 0 {
+	if e.recursive {
 		for ll = Curfn.Dcl; ll != nil; ll = ll.Next {
 			if ll.N.Op == ONAME && ll.N.Class == PPARAMOUT {
 				escflows(e, &e.theSink, ll.N)
@@ -387,7 +387,7 @@
 
 	switch n.Op {
 	case OLABEL:
-		if !(n.Left != nil) || !(n.Left.Sym != nil) {
+		if n.Left == nil || n.Left.Sym == nil {
 			Fatal("esc:label without label: %v", Nconv(n, obj.FmtSign))
 		}
 
@@ -398,7 +398,7 @@
 		n.Left.Sym.Label = &nonlooping
 
 	case OGOTO:
-		if !(n.Left != nil) || !(n.Left.Sym != nil) {
+		if n.Left == nil || n.Left.Sym == nil {
 			Fatal("esc:goto without label: %v", Nconv(n, obj.FmtSign))
 		}
 
@@ -509,7 +509,7 @@
 
 		// Everything but fixed array is a dereference.
 	case ORANGE:
-		if Isfixedarray(n.Type) != 0 && n.List != nil && n.List.Next != nil {
+		if Isfixedarray(n.Type) && n.List != nil && n.List.Next != nil {
 			escassign(e, n.List.Next.N, n.Right)
 		}
 
@@ -639,7 +639,7 @@
 		escassign(e, &e.theSink, n.Left)
 
 	case OAPPEND:
-		if !(n.Isddd != 0) {
+		if n.Isddd == 0 {
 			for ll = n.List.Next; ll != nil; ll = ll.Next {
 				escassign(e, &e.theSink, ll.N) // lose track of assign to dereference
 			}
@@ -651,7 +651,7 @@
 		escassign(e, n, n.Left)
 
 	case OARRAYLIT:
-		if Isslice(n.Type) != 0 {
+		if Isslice(n.Type) {
 			n.Esc = EscNone // until proven otherwise
 			e.noesc = list(e.noesc, n)
 			n.Escloopdepth = e.loopdepth
@@ -708,7 +708,7 @@
 				continue
 			}
 			a = v.Closure
-			if !(v.Byval != 0) {
+			if v.Byval == 0 {
 				a = Nod(OADDR, a, nil)
 				a.Lineno = v.Lineno
 				a.Escloopdepth = e.loopdepth
@@ -805,7 +805,6 @@
 	default:
 		Dump("dst", dst)
 		Fatal("escassign: unexpected dst")
-		fallthrough
 
 	case OARRAYLIT,
 		OCLOSURE,
@@ -829,7 +828,7 @@
 		return
 
 	case OINDEX:
-		if Isfixedarray(dst.Left.Type) != 0 {
+		if Isfixedarray(dst.Left.Type) {
 			escassign(e, dst.Left, src)
 			return
 		}
@@ -914,7 +913,7 @@
 
 		// Index of array preserves input value.
 	case OINDEX:
-		if Isfixedarray(src.Left.Type) != 0 {
+		if Isfixedarray(src.Left.Type) {
 			escassign(e, dst, src.Left)
 		}
 
@@ -999,7 +998,6 @@
 	switch n.Op {
 	default:
 		Fatal("esccall")
-		fallthrough
 
 	case OCALLFUNC:
 		fn = n.Left
@@ -1044,7 +1042,7 @@
 
 		for lr = fn.Ntype.List; ll != nil && lr != nil; (func() { ll = ll.Next; lr = lr.Next })() {
 			src = ll.N
-			if lr.N.Isddd != 0 && !(n.Isddd != 0) {
+			if lr.N.Isddd != 0 && n.Isddd == 0 {
 				// Introduce ODDDARG node to represent ... allocation.
 				src = Nod(ODDDARG, nil, nil)
 
@@ -1110,7 +1108,7 @@
 
 	for t = getinargx(fntype).Type; ll != nil; ll = ll.Next {
 		src = ll.N
-		if t.Isddd != 0 && !(n.Isddd != 0) {
+		if t.Isddd != 0 && n.Isddd == 0 {
 			// Introduce ODDDARG node to represent ... allocation.
 			src = Nod(ODDDARG, nil, nil)
 
@@ -1243,7 +1241,7 @@
 
 func escwalk(e *EscState, level int, dst *Node, src *Node) {
 	var ll *NodeList
-	var leaks int
+	var leaks bool
 	var newlevel int
 
 	if src.Walkgen == walkgen && src.Esclevel <= int32(level) {
@@ -1292,11 +1290,11 @@
 	// The second clause is for values pointed at by an object passed to a call
 	// that returns something reached via indirect from the object.
 	// We don't know which result it is or how many indirects, so we treat it as leaking.
-	leaks = bool2int(level <= 0 && dst.Escloopdepth < src.Escloopdepth || level < 0 && dst == &e.funcParam && haspointers(src.Type))
+	leaks = level <= 0 && dst.Escloopdepth < src.Escloopdepth || level < 0 && dst == &e.funcParam && haspointers(src.Type)
 
 	switch src.Op {
 	case ONAME:
-		if src.Class == PPARAM && (leaks != 0 || dst.Escloopdepth < 0) && src.Esc != EscHeap {
+		if src.Class == PPARAM && (leaks || dst.Escloopdepth < 0) && src.Esc != EscHeap {
 			src.Esc = EscScope
 			if Debug['m'] != 0 {
 				Warnl(int(src.Lineno), "leaking param: %v", Nconv(src, obj.FmtShort))
@@ -1306,7 +1304,7 @@
 		// Treat a PPARAMREF closure variable as equivalent to the
 		// original variable.
 		if src.Class == PPARAMREF {
-			if leaks != 0 && Debug['m'] != 0 {
+			if leaks && Debug['m'] != 0 {
 				Warnl(int(src.Lineno), "leaking closure reference %v", Nconv(src, obj.FmtShort))
 			}
 			escwalk(e, level, dst, src.Closure)
@@ -1314,7 +1312,7 @@
 
 	case OPTRLIT,
 		OADDR:
-		if leaks != 0 {
+		if leaks {
 			src.Esc = EscHeap
 			addrescapes(src.Left)
 			if Debug['m'] != 0 {
@@ -1329,7 +1327,7 @@
 		escwalk(e, newlevel, dst, src.Left)
 
 	case OARRAYLIT:
-		if Isfixedarray(src.Type) != 0 {
+		if Isfixedarray(src.Type) {
 			break
 		}
 		fallthrough
@@ -1349,7 +1347,7 @@
 		OCLOSURE,
 		OCALLPART,
 		ORUNESTR:
-		if leaks != 0 {
+		if leaks {
 			src.Esc = EscHeap
 			if Debug['m'] != 0 {
 				Warnl(int(src.Lineno), "%v escapes to heap", Nconv(src, obj.FmtShort))
@@ -1365,7 +1363,7 @@
 		escwalk(e, level, dst, src.Left)
 
 	case OINDEX:
-		if Isfixedarray(src.Left.Type) != 0 {
+		if Isfixedarray(src.Left.Type) {
 			escwalk(e, level, dst, src.Left)
 			break
 		}
diff --git a/src/cmd/internal/gc/export.go b/src/cmd/internal/gc/export.go
index 5b34fe2..b0c5931 100644
--- a/src/cmd/internal/gc/export.go
+++ b/src/cmd/internal/gc/export.go
@@ -42,19 +42,19 @@
 	return unicode.IsUpper(r)
 }
 
-func initname(s string) int {
-	return bool2int(s == "init")
+func initname(s string) bool {
+	return s == "init"
 }
 
 // exportedsym reports whether a symbol will be visible
 // to files that import our package.
-func exportedsym(sym *Sym) int {
+func exportedsym(sym *Sym) bool {
 	// Builtins are visible everywhere.
 	if sym.Pkg == builtinpkg || sym.Origpkg == builtinpkg {
-		return 1
+		return true
 	}
 
-	return bool2int(sym.Pkg == localpkg && exportname(sym.Name))
+	return sym.Pkg == localpkg && exportname(sym.Name)
 }
 
 func autoexport(n *Node, ctxt int) {
@@ -69,10 +69,10 @@
 	}
 
 	// -A is for cmd/gc/mkbuiltin script, so export everything
-	if Debug['A'] != 0 || exportname(n.Sym.Name) || initname(n.Sym.Name) != 0 {
+	if Debug['A'] != 0 || exportname(n.Sym.Name) || initname(n.Sym.Name) {
 		exportsym(n)
 	}
-	if asmhdr != "" && n.Sym.Pkg == localpkg && !(n.Sym.Flags&SymAsm != 0) {
+	if asmhdr != "" && n.Sym.Pkg == localpkg && n.Sym.Flags&SymAsm == 0 {
 		n.Sym.Flags |= SymAsm
 		asmlist = list(asmlist, n)
 	}
@@ -86,7 +86,7 @@
 	}
 	p.Exported = 1
 	suffix = ""
-	if !(p.Direct != 0) {
+	if p.Direct == 0 {
 		suffix = " // indirect"
 	}
 	fmt.Fprintf(bout, "\timport %s \"%v\"%s\n", p.Name, Zconv(p.Path, 0), suffix)
@@ -102,7 +102,7 @@
 func reexportdep(n *Node) {
 	var t *Type
 
-	if !(n != nil) {
+	if n == nil {
 		return
 	}
 
@@ -118,14 +118,14 @@
 			}
 
 			// nodes for method calls.
-			if !(n.Type != nil) || n.Type.Thistuple > 0 {
+			if n.Type == nil || n.Type.Thistuple > 0 {
 				break
 			}
 			fallthrough
 
 			// fallthrough
 		case PEXTERN:
-			if n.Sym != nil && !(exportedsym(n.Sym) != 0) {
+			if n.Sym != nil && !exportedsym(n.Sym) {
 				if Debug['E'] != 0 {
 					fmt.Printf("reexport name %v\n", Sconv(n.Sym, 0))
 				}
@@ -141,7 +141,7 @@
 			if Isptr[t.Etype] != 0 {
 				t = t.Type
 			}
-			if t != nil && t.Sym != nil && t.Sym.Def != nil && !(exportedsym(t.Sym) != 0) {
+			if t != nil && t.Sym != nil && t.Sym.Def != nil && !exportedsym(t.Sym) {
 				if Debug['E'] != 0 {
 					fmt.Printf("reexport type %v from declaration\n", Sconv(t.Sym, 0))
 				}
@@ -155,7 +155,7 @@
 			if Isptr[t.Etype] != 0 {
 				t = t.Type
 			}
-			if t != nil && t.Sym != nil && t.Sym.Def != nil && !(exportedsym(t.Sym) != 0) {
+			if t != nil && t.Sym != nil && t.Sym.Def != nil && !exportedsym(t.Sym) {
 				if Debug['E'] != 0 {
 					fmt.Printf("reexport literal type %v\n", Sconv(t.Sym, 0))
 				}
@@ -166,7 +166,7 @@
 
 		// fallthrough
 	case OTYPE:
-		if n.Sym != nil && !(exportedsym(n.Sym) != 0) {
+		if n.Sym != nil && !exportedsym(n.Sym) {
 			if Debug['E'] != 0 {
 				fmt.Printf("reexport literal/type %v\n", Sconv(n.Sym, 0))
 			}
@@ -192,10 +192,10 @@
 		OMAKECHAN:
 		t = n.Type
 
-		if !(t.Sym != nil) && t.Type != nil {
+		if t.Sym == nil && t.Type != nil {
 			t = t.Type
 		}
-		if t != nil && t.Sym != nil && t.Sym.Def != nil && !(exportedsym(t.Sym) != 0) {
+		if t != nil && t.Sym != nil && t.Sym.Def != nil && !exportedsym(t.Sym) {
 			if Debug['E'] != 0 {
 				fmt.Printf("reexport type for expression %v\n", Sconv(t.Sym, 0))
 			}
@@ -227,7 +227,7 @@
 	t = n.Type // may or may not be specified
 	dumpexporttype(t)
 
-	if t != nil && !(isideal(t) != 0) {
+	if t != nil && !isideal(t) {
 		fmt.Fprintf(bout, "\tconst %v %v = %v\n", Sconv(s, obj.FmtSharp), Tconv(t, obj.FmtSharp), Vconv(&n.Val, obj.FmtSharp))
 	} else {
 		fmt.Fprintf(bout, "\tconst %v = %v\n", Sconv(s, obj.FmtSharp), Vconv(&n.Val, obj.FmtSharp))
@@ -329,7 +329,7 @@
 	fmt.Fprintf(bout, "\ttype %v %v\n", Sconv(t.Sym, obj.FmtSharp), Tconv(t, obj.FmtSharp|obj.FmtLong))
 	for i = 0; i < n; i++ {
 		f = m[i]
-		if f.Nointerface != 0 {
+		if f.Nointerface {
 			fmt.Fprintf(bout, "\t//go:nointerface\n")
 		}
 		if f.Type.Nname != nil && f.Type.Nname.Inl != nil { // nname was set by caninl
@@ -428,7 +428,7 @@
 
 	// mark the symbol so it is not reexported
 	if s.Def == nil {
-		if exportname(s.Name) || initname(s.Name) != 0 {
+		if exportname(s.Name) || initname(s.Name) {
 			s.Flags |= SymExport
 		} else {
 			s.Flags |= SymPackage // package scope
@@ -474,7 +474,7 @@
 		Yyerror("conflicting names %s and %s for package \"%v\"", p.Name, s.Name, Zconv(p.Path, 0))
 	}
 
-	if !(incannedimport != 0) && myimportpath != "" && z.S == myimportpath {
+	if incannedimport == 0 && myimportpath != "" && z.S == myimportpath {
 		Yyerror("import \"%v\": package depends on \"%v\" (import cycle)", Zconv(importpkg.Path, 0), Zconv(z, 0))
 		errorexit()
 	}
diff --git a/src/cmd/internal/gc/fmt.go b/src/cmd/internal/gc/fmt.go
index 08c08a4..3df4bc3 100644
--- a/src/cmd/internal/gc/fmt.go
+++ b/src/cmd/internal/gc/fmt.go
@@ -207,15 +207,15 @@
 
 	c = flag & obj.FmtShort
 
-	if !(c != 0) && n.Ullman != 0 {
+	if c == 0 && n.Ullman != 0 {
 		fp += fmt.Sprintf(" u(%d)", n.Ullman)
 	}
 
-	if !(c != 0) && n.Addable != 0 {
+	if c == 0 && n.Addable != 0 {
 		fp += fmt.Sprintf(" a(%d)", n.Addable)
 	}
 
-	if !(c != 0) && n.Vargen != 0 {
+	if c == 0 && n.Vargen != 0 {
 		fp += fmt.Sprintf(" g(%d)", n.Vargen)
 	}
 
@@ -223,7 +223,7 @@
 		fp += fmt.Sprintf(" l(%d)", n.Lineno)
 	}
 
-	if !(c != 0) && n.Xoffset != BADWIDTH {
+	if c == 0 && n.Xoffset != BADWIDTH {
 		fp += fmt.Sprintf(" x(%d%+d)", n.Xoffset, n.Stkdelta)
 	}
 
@@ -261,7 +261,7 @@
 		fp += fmt.Sprintf(" esc(no)")
 
 	case EscNever:
-		if !(c != 0) {
+		if c == 0 {
 			fp += fmt.Sprintf(" esc(N)")
 		}
 
@@ -273,11 +273,11 @@
 		fp += fmt.Sprintf(" ld(%d)", n.Escloopdepth)
 	}
 
-	if !(c != 0) && n.Typecheck != 0 {
+	if c == 0 && n.Typecheck != 0 {
 		fp += fmt.Sprintf(" tc(%d)", n.Typecheck)
 	}
 
-	if !(c != 0) && n.Dodata != 0 {
+	if c == 0 && n.Dodata != 0 {
 		fp += fmt.Sprintf(" dd(%d)", n.Dodata)
 	}
 
@@ -301,7 +301,7 @@
 		fp += fmt.Sprintf(" assigned")
 	}
 
-	if !(c != 0) && n.Used != 0 {
+	if c == 0 && n.Used != 0 {
 		fp += fmt.Sprintf(" used(%d)", n.Used)
 	}
 	return fp
@@ -497,7 +497,7 @@
 
 	var p string
 
-	if s.Pkg != nil && !(flag&obj.FmtShort != 0 /*untyped*/) {
+	if s.Pkg != nil && flag&obj.FmtShort == 0 /*untyped*/ {
 		switch fmtmode {
 		case FErr: // This is for the user
 			if s.Pkg == localpkg {
@@ -608,7 +608,7 @@
 	}
 
 	// Unless the 'l' flag was specified, if the type has a name, just print that name.
-	if !(flag&obj.FmtLong != 0 /*untyped*/) && t.Sym != nil && t.Etype != TFIELD && t != Types[t.Etype] {
+	if flag&obj.FmtLong == 0 /*untyped*/ && t.Sym != nil && t.Etype != TFIELD && t != Types[t.Etype] {
 		switch fmtmode {
 		case FTypeId:
 			if flag&obj.FmtShort != 0 /*untyped*/ {
@@ -802,7 +802,7 @@
 		return fp
 
 	case TFIELD:
-		if !(flag&obj.FmtShort != 0 /*untyped*/) {
+		if flag&obj.FmtShort == 0 /*untyped*/ {
 			s = t.Sym
 
 			// Take the name from the original, lest we substituted it with ~r%d or ~b%d.
@@ -822,7 +822,7 @@
 				}
 			}
 
-			if s != nil && !(t.Embedded != 0) {
+			if s != nil && t.Embedded == 0 {
 				if t.Funarg != 0 {
 					fp += fmt.Sprintf("%v ", Nconv(t.Nname, 0))
 				} else if flag&obj.FmtLong != 0 /*untyped*/ {
@@ -850,7 +850,7 @@
 			fp += fmt.Sprintf("%v", Tconv(t.Type, 0))
 		}
 
-		if !(flag&obj.FmtShort != 0 /*untyped*/) && t.Note != nil {
+		if flag&obj.FmtShort == 0 /*untyped*/ && t.Note != nil {
 			fp += fmt.Sprintf(" \"%v\"", Zconv(t.Note, 0))
 		}
 		return fp
@@ -882,23 +882,23 @@
 }
 
 // Statements which may be rendered with a simplestmt as init.
-func stmtwithinit(op int) int {
+func stmtwithinit(op int) bool {
 	switch op {
 	case OIF,
 		OFOR,
 		OSWITCH:
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
 func stmtfmt(n *Node) string {
 	var f string
 
-	var complexinit int
-	var simpleinit int
-	var extrablock int
+	var complexinit bool
+	var simpleinit bool
+	var extrablock bool
 
 	// some statements allow for an init, but at most one,
 	// but we may have an arbitrary number added, eg by typecheck
@@ -906,19 +906,19 @@
 	// block starting with the init statements.
 
 	// if we can just say "for" n->ninit; ... then do so
-	simpleinit = bool2int(n.Ninit != nil && !(n.Ninit.Next != nil) && !(n.Ninit.N.Ninit != nil) && stmtwithinit(int(n.Op)) != 0)
+	simpleinit = n.Ninit != nil && n.Ninit.Next == nil && n.Ninit.N.Ninit == nil && stmtwithinit(int(n.Op))
 
 	// otherwise, print the inits as separate statements
-	complexinit = bool2int(n.Ninit != nil && !(simpleinit != 0) && (fmtmode != FErr))
+	complexinit = n.Ninit != nil && !simpleinit && (fmtmode != FErr)
 
 	// but if it was for if/for/switch, put in an extra surrounding block to limit the scope
-	extrablock = bool2int(complexinit != 0 && stmtwithinit(int(n.Op)) != 0)
+	extrablock = complexinit && stmtwithinit(int(n.Op))
 
-	if extrablock != 0 {
+	if extrablock {
 		f += "{"
 	}
 
-	if complexinit != 0 {
+	if complexinit {
 		f += fmt.Sprintf(" %v; ", Hconv(n.Ninit, 0))
 	}
 
@@ -951,7 +951,7 @@
 			break
 		}
 
-		if n.Colas != 0 && !(complexinit != 0) {
+		if n.Colas != 0 && !complexinit {
 			f += fmt.Sprintf("%v := %v", Nconv(n.Left, 0), Nconv(n.Right, 0))
 		} else {
 			f += fmt.Sprintf("%v = %v", Nconv(n.Left, 0), Nconv(n.Right, 0))
@@ -970,7 +970,7 @@
 		f += fmt.Sprintf("%v %v= %v", Nconv(n.Left, 0), Oconv(int(n.Etype), obj.FmtSharp), Nconv(n.Right, 0))
 
 	case OAS2:
-		if n.Colas != 0 && !(complexinit != 0) {
+		if n.Colas != 0 && !complexinit {
 			f += fmt.Sprintf("%v := %v", Hconv(n.List, obj.FmtComma), Hconv(n.Rlist, obj.FmtComma))
 			break
 		}
@@ -996,7 +996,7 @@
 		f += fmt.Sprintf("defer %v", Nconv(n.Left, 0))
 
 	case OIF:
-		if simpleinit != 0 {
+		if simpleinit {
 			f += fmt.Sprintf("if %v; %v { %v }", Nconv(n.Ninit.N, 0), Nconv(n.Ntest, 0), Hconv(n.Nbody, 0))
 		} else {
 			f += fmt.Sprintf("if %v { %v }", Nconv(n.Ntest, 0), Hconv(n.Nbody, 0))
@@ -1012,7 +1012,7 @@
 		}
 
 		f += "for"
-		if simpleinit != 0 {
+		if simpleinit {
 			f += fmt.Sprintf(" %v;", Nconv(n.Ninit.N, 0))
 		} else if n.Nincr != nil {
 			f += " ;"
@@ -1024,7 +1024,7 @@
 
 		if n.Nincr != nil {
 			f += fmt.Sprintf("; %v", Nconv(n.Nincr, 0))
-		} else if simpleinit != 0 {
+		} else if simpleinit {
 			f += ";"
 		}
 
@@ -1051,7 +1051,7 @@
 		}
 
 		f += fmt.Sprintf("%v", Oconv(int(n.Op), obj.FmtSharp))
-		if simpleinit != 0 {
+		if simpleinit {
 			f += fmt.Sprintf(" %v;", Nconv(n.Ninit.N, 0))
 		}
 		if n.Ntest != nil {
@@ -1087,7 +1087,7 @@
 	}
 
 ret:
-	if extrablock != 0 {
+	if extrablock {
 		f += "}"
 	}
 
@@ -1211,7 +1211,7 @@
 	var f string
 
 	var nprec int
-	var ptrlit int
+	var ptrlit bool
 	var l *NodeList
 
 	for n != nil && n.Implicit != 0 && (n.Op == OIND || n.Op == OADDR) {
@@ -1368,10 +1368,10 @@
 		return f
 
 	case OCOMPLIT:
-		ptrlit = bool2int(n.Right != nil && n.Right.Implicit != 0 && n.Right.Type != nil && Isptr[n.Right.Type.Etype] != 0)
+		ptrlit = n.Right != nil && n.Right.Implicit != 0 && n.Right.Type != nil && Isptr[n.Right.Type.Etype] != 0
 		if fmtmode == FErr {
-			if n.Right != nil && n.Right.Type != nil && !(n.Implicit != 0) {
-				if ptrlit != 0 {
+			if n.Right != nil && n.Right.Type != nil && n.Implicit == 0 {
+				if ptrlit {
 					f += fmt.Sprintf("&%v literal", Tconv(n.Right.Type.Type, 0))
 					return f
 				} else {
@@ -1384,7 +1384,7 @@
 			return f
 		}
 
-		if fmtmode == FExp && ptrlit != 0 {
+		if fmtmode == FExp && ptrlit {
 			// typecheck has overwritten OIND by OTYPE with pointer type.
 			f += fmt.Sprintf("(&%v{ %v })", Tconv(n.Right.Type.Type, 0), Hconv(n.List, obj.FmtComma))
 			return f
@@ -1418,7 +1418,7 @@
 				}
 			}
 
-			if !(n.Implicit != 0) {
+			if n.Implicit == 0 {
 				f += "})"
 				return f
 			}
@@ -1454,11 +1454,11 @@
 			}
 		}
 
-		if !(n.Left != nil) && n.Right != nil {
+		if n.Left == nil && n.Right != nil {
 			f += fmt.Sprintf(":%v", Nconv(n.Right, 0))
 			return f
 		}
-		if n.Left != nil && !(n.Right != nil) {
+		if n.Left != nil && n.Right == nil {
 			f += fmt.Sprintf("%v:", Nconv(n.Left, 0))
 			return f
 		}
@@ -1686,15 +1686,15 @@
 func nodedump(n *Node, flag int) string {
 	var fp string
 
-	var recur int
+	var recur bool
 
 	if n == nil {
 		return fp
 	}
 
-	recur = bool2int(!(flag&obj.FmtShort != 0 /*untyped*/))
+	recur = flag&obj.FmtShort == 0 /*untyped*/
 
-	if recur != 0 {
+	if recur {
 		fp = indent(fp)
 		if dumpdepth > 10 {
 			fp += "..."
@@ -1727,7 +1727,7 @@
 		} else {
 			fp += fmt.Sprintf("%v%v", Oconv(int(n.Op), 0), Jconv(n, 0))
 		}
-		if recur != 0 && n.Type == nil && n.Ntype != nil {
+		if recur && n.Type == nil && n.Ntype != nil {
 			fp = indent(fp)
 			fp += fmt.Sprintf("%v-ntype%v", Oconv(int(n.Op), 0), Nconv(n.Ntype, 0))
 		}
@@ -1737,7 +1737,7 @@
 
 	case OTYPE:
 		fp += fmt.Sprintf("%v %v%v type=%v", Oconv(int(n.Op), 0), Sconv(n.Sym, 0), Jconv(n, 0), Tconv(n.Type, 0))
-		if recur != 0 && n.Type == nil && n.Ntype != nil {
+		if recur && n.Type == nil && n.Ntype != nil {
 			fp = indent(fp)
 			fp += fmt.Sprintf("%v-ntype%v", Oconv(int(n.Op), 0), Nconv(n.Ntype, 0))
 		}
@@ -1751,7 +1751,7 @@
 		fp += fmt.Sprintf(" %v", Tconv(n.Type, 0))
 	}
 
-	if recur != 0 {
+	if recur {
 		if n.Left != nil {
 			fp += fmt.Sprintf("%v", Nconv(n.Left, 0))
 		}
diff --git a/src/cmd/internal/gc/gen.go b/src/cmd/internal/gc/gen.go
index a40a347..9d41b6f 100644
--- a/src/cmd/internal/gc/gen.go
+++ b/src/cmd/internal/gc/gen.go
@@ -109,7 +109,7 @@
 	// is always a heap pointer anyway.
 	case ODOT,
 		OINDEX:
-		if !(Isslice(n.Left.Type) != 0) {
+		if !Isslice(n.Left.Type) {
 			addrescapes(n.Left)
 		}
 	}
@@ -253,7 +253,6 @@
 	switch n.Left.Op {
 	default:
 		Fatal("cgen_proc: unknown call %v", Oconv(int(n.Left.Op), 0))
-		fallthrough
 
 	case OCALLMETH:
 		Cgen_callmeth(n.Left, proc)
@@ -280,7 +279,7 @@
 		Fatal("cgen_dcl")
 	}
 
-	if !(n.Class&PHEAP != 0) {
+	if n.Class&PHEAP == 0 {
 		return
 	}
 	if compiling_runtime != 0 {
@@ -304,7 +303,7 @@
 
 	switch nr.Op {
 	case ONAME:
-		if !(nr.Class&PHEAP != 0) && nr.Class != PEXTERN && nr.Class != PFUNC && nr.Class != PPARAMREF {
+		if nr.Class&PHEAP == 0 && nr.Class != PEXTERN && nr.Class != PFUNC && nr.Class != PPARAMREF {
 			gused(nr)
 		}
 
@@ -480,7 +479,7 @@
 		tmpcap = tmplen
 	}
 
-	if isnil(n.Left) != 0 {
+	if isnil(n.Left) {
 		Tempname(&src, n.Left.Type)
 		Thearch.Cgen(n.Left, &src)
 	} else {
@@ -491,7 +490,7 @@
 	}
 
 	if n.Op == OSLICEARR || n.Op == OSLICE3ARR {
-		if !(Isptr[n.Left.Type.Etype] != 0) {
+		if Isptr[n.Left.Type.Etype] == 0 {
 			Fatal("slicearr is supposed to work on pointer: %v\n", Nconv(n, obj.FmtSign))
 		}
 		Thearch.Cgen(&src, base)
@@ -668,13 +667,12 @@
 	var p2 *obj.Prog
 	var p3 *obj.Prog
 	var lab *Label
-	var wasregalloc int32
 
 	//dump("gen", n);
 
 	lno = setlineno(n)
 
-	wasregalloc = int32(Thearch.Anyregalloc())
+	wasregalloc := Thearch.Anyregalloc()
 
 	if n == nil {
 		goto ret
@@ -879,7 +877,7 @@
 		cgen_dcl(n.Left)
 
 	case OAS:
-		if gen_as_init(n) != 0 {
+		if gen_as_init(n) {
 			break
 		}
 		Cgen_as(n.Left, n.Right)
@@ -911,7 +909,7 @@
 	}
 
 ret:
-	if int32(Thearch.Anyregalloc()) != wasregalloc {
+	if Thearch.Anyregalloc() != wasregalloc {
 		Dump("node", n)
 		Fatal("registers left allocated")
 	}
@@ -936,7 +934,7 @@
 		return
 	}
 
-	if nr == nil || iszero(nr) != 0 {
+	if nr == nil || iszero(nr) {
 		// heaps should already be clear
 		if nr == nil && (nl.Class&PHEAP != 0) {
 			return
@@ -946,7 +944,7 @@
 		if tl == nil {
 			return
 		}
-		if Isfat(tl) != 0 {
+		if Isfat(tl) {
 			if nl.Op == ONAME {
 				Gvardef(nl)
 			}
@@ -1002,7 +1000,7 @@
 			continue
 		}
 
-		if lab.Use == nil && !(lab.Used != 0) {
+		if lab.Use == nil && lab.Used == 0 {
 			yyerrorl(int(lab.Def.Lineno), "label %v defined and not used", Sconv(lab.Sym, 0))
 			continue
 		}
diff --git a/src/cmd/internal/gc/go.go b/src/cmd/internal/gc/go.go
index ff1a429..16cc449 100644
--- a/src/cmd/internal/gc/go.go
+++ b/src/cmd/internal/gc/go.go
@@ -7,7 +7,6 @@
 import (
 	"bytes"
 	"cmd/internal/obj"
-	"encoding/binary"
 )
 
 // Copyright 2009 The Go Authors. All rights reserved.
@@ -162,7 +161,7 @@
 	Addable        uint8
 	Trecur         uint8
 	Etype          uint8
-	Bounded        uint8
+	Bounded        bool
 	Class          uint8
 	Method         uint8
 	Embedded       uint8
@@ -191,7 +190,7 @@
 	Likely         int8
 	Hasbreak       uint8
 	Needzero       uint8
-	Needctxt       uint8
+	Needctxt       bool
 	Esc            uint
 	Funcdepth      int
 	Type           *Type
@@ -245,7 +244,7 @@
 
 type Type struct {
 	Etype       uint8
-	Nointerface uint8
+	Nointerface bool
 	Noalg       uint8
 	Chan        uint8
 	Trecur      uint8
@@ -918,6 +917,10 @@
 
 var Use_sse int
 
+var hunk string
+
+var nhunk int32
+
 var thunk int32
 
 var Funcdepth int
@@ -1119,7 +1122,6 @@
 )
 
 type Arch struct {
-	ByteOrder      binary.ByteOrder
 	Thechar        int
 	Thestring      string
 	Thelinkarch    *obj.LinkArch
@@ -1127,7 +1129,7 @@
 	REGSP          int
 	REGCTXT        int
 	MAXWIDTH       int64
-	Anyregalloc    func() int
+	Anyregalloc    func() bool
 	Betypeinit     func()
 	Bgen           func(*Node, bool, int, *obj.Prog)
 	Cgen           func(*Node, *Node)
@@ -1148,10 +1150,10 @@
 	Proginfo       func(*ProgInfo, *obj.Prog)
 	Regalloc       func(*Node, *Type, *Node)
 	Regfree        func(*Node)
-	Regtyp         func(*obj.Addr) int
-	Sameaddr       func(*obj.Addr, *obj.Addr) int
-	Smallindir     func(*obj.Addr, *obj.Addr) int
-	Stackaddr      func(*obj.Addr) int
+	Regtyp         func(*obj.Addr) bool
+	Sameaddr       func(*obj.Addr, *obj.Addr) bool
+	Smallindir     func(*obj.Addr, *obj.Addr) bool
+	Stackaddr      func(*obj.Addr) bool
 	Excludedregs   func() uint64
 	RtoB           func(int) uint64
 	FtoB           func(int) uint64
diff --git a/src/cmd/internal/gc/gsubr.go b/src/cmd/internal/gc/gsubr.go
index 6762171..6fd6057 100644
--- a/src/cmd/internal/gc/gsubr.go
+++ b/src/cmd/internal/gc/gsubr.go
@@ -41,7 +41,7 @@
 /*
  * Is this node a memory operand?
  */
-func Ismem(n *Node) int {
+func Ismem(n *Node) bool {
 	switch n.Op {
 	case OITAB,
 		OSPTR,
@@ -51,29 +51,29 @@
 		ONAME,
 		OPARAM,
 		OCLOSUREVAR:
-		return 1
+		return true
 
 	case OADDR:
-		return bool2int(Thearch.Thechar == '6' || Thearch.Thechar == '9') // because 6g uses PC-relative addressing; TODO(rsc): not sure why 9g too
+		return Thearch.Thechar == '6' || Thearch.Thechar == '9' // because 6g uses PC-relative addressing; TODO(rsc): not sure why 9g too
 	}
 
-	return 0
+	return false
 }
 
-func Samereg(a *Node, b *Node) int {
+func Samereg(a *Node, b *Node) bool {
 	if a == nil || b == nil {
-		return 0
+		return false
 	}
 	if a.Op != OREGISTER {
-		return 0
+		return false
 	}
 	if b.Op != OREGISTER {
-		return 0
+		return false
 	}
 	if a.Val.U.Reg != b.Val.U.Reg {
-		return 0
+		return false
 	}
-	return 1
+	return true
 }
 
 /*
@@ -174,15 +174,15 @@
 
 	for lp = &p; ; {
 		p = *lp
-		if !(p != nil) {
+		if p == nil {
 			break
 		}
-		if p.As == obj.ATYPE && p.From.Node != nil && p.From.Name == obj.NAME_AUTO && !(((p.From.Node).(*Node)).Used != 0) {
+		if p.As == obj.ATYPE && p.From.Node != nil && p.From.Name == obj.NAME_AUTO && ((p.From.Node).(*Node)).Used == 0 {
 			*lp = p.Link
 			continue
 		}
 
-		if (p.As == obj.AVARDEF || p.As == obj.AVARKILL) && p.To.Node != nil && !(((p.To.Node).(*Node)).Used != 0) {
+		if (p.As == obj.AVARDEF || p.As == obj.AVARKILL) && p.To.Node != nil && ((p.To.Node).(*Node)).Used == 0 {
 			// Cannot remove VARDEF instruction, because - unlike TYPE handled above -
 			// VARDEFs are interspersed with other code, and a jump might be using the
 			// VARDEF as a target. Replace with a no-op instead. A later pass will remove
@@ -256,18 +256,18 @@
 	Thearch.Gins(obj.ANOP, n, nil) // used
 }
 
-func Isfat(t *Type) int {
+func Isfat(t *Type) bool {
 	if t != nil {
 		switch t.Etype {
 		case TSTRUCT,
 			TARRAY,
 			TSTRING,
 			TINTER: // maybe remove later
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
 func markautoused(p *obj.Prog) {
@@ -289,7 +289,7 @@
 func Naddr(n *Node, a *obj.Addr, canemitcode int) {
 	var s *Sym
 
-	*a = obj.Zprog.From
+	*a = obj.Addr{}
 	if n == nil {
 		return
 	}
@@ -343,7 +343,7 @@
 		a.Node = n.Left.Orig
 
 	case OCLOSUREVAR:
-		if !(Curfn.Needctxt != 0) {
+		if !Curfn.Needctxt {
 			Fatal("closurevar without needctxt")
 		}
 		a.Type = obj.TYPE_MEM
@@ -383,7 +383,6 @@
 		switch n.Class {
 		default:
 			Fatal("naddr: ONAME class %v %d\n", Sconv(n.Sym, 0), n.Class)
-			fallthrough
 
 		case PEXTERN:
 			a.Name = obj.NAME_EXTERN
diff --git a/src/cmd/internal/gc/init.go b/src/cmd/internal/gc/init.go
index e738dba..2805f39 100644
--- a/src/cmd/internal/gc/init.go
+++ b/src/cmd/internal/gc/init.go
@@ -53,7 +53,7 @@
  *		return					(11)
  *	}
  */
-func anyinit(n *NodeList) int {
+func anyinit(n *NodeList) bool {
 	var h uint32
 	var s *Sym
 	var l *NodeList
@@ -68,20 +68,20 @@
 			break
 
 		case OAS:
-			if isblank(l.N.Left) && candiscard(l.N.Right) != 0 {
+			if isblank(l.N.Left) && candiscard(l.N.Right) {
 				break
 			}
 			fallthrough
 
 			// fall through
 		default:
-			return 1
+			return true
 		}
 	}
 
 	// is this main
 	if localpkg.Name == "main" {
-		return 1
+		return true
 	}
 
 	// is there an explicit init function
@@ -89,7 +89,7 @@
 
 	s = Lookup(namebuf)
 	if s.Def != nil {
-		return 1
+		return true
 	}
 
 	// are there any imported init functions
@@ -101,12 +101,12 @@
 			if s.Def == nil {
 				continue
 			}
-			return 1
+			return true
 		}
 	}
 
 	// then none
-	return 0
+	return false
 }
 
 func fninit(n *NodeList) {
@@ -126,7 +126,7 @@
 	}
 
 	n = initfix(n)
-	if !(anyinit(n) != 0) {
+	if !anyinit(n) {
 		return
 	}
 
diff --git a/src/cmd/internal/gc/inl.go b/src/cmd/internal/gc/inl.go
index 1b4b40d..73d6481 100644
--- a/src/cmd/internal/gc/inl.go
+++ b/src/cmd/internal/gc/inl.go
@@ -56,7 +56,7 @@
 		if Isptr[rcvr.Etype] != 0 {
 			rcvr = rcvr.Type
 		}
-		if !(rcvr.Sym != nil) {
+		if rcvr.Sym == nil {
 			Fatal("receiver with no sym: [%v] %v  (%v)", Sconv(fn.Sym, 0), Nconv(fn, obj.FmtLong), Tconv(rcvr, 0))
 		}
 		return rcvr.Sym.Pkg
@@ -114,7 +114,7 @@
 	if fn.Op != ODCLFUNC {
 		Fatal("caninl %v", Nconv(fn, 0))
 	}
-	if !(fn.Nname != nil) {
+	if fn.Nname == nil {
 		Fatal("caninl no nname %v", Nconv(fn, obj.FmtSign))
 	}
 
@@ -137,7 +137,7 @@
 	}
 
 	budget = 40 // allowed hairyness
-	if ishairylist(fn.Nbody, &budget) != 0 {
+	if ishairylist(fn.Nbody, &budget) {
 		return
 	}
 
@@ -162,18 +162,18 @@
 }
 
 // Look for anything we want to punt on.
-func ishairylist(ll *NodeList, budget *int) int {
+func ishairylist(ll *NodeList, budget *int) bool {
 	for ; ll != nil; ll = ll.Next {
-		if ishairy(ll.N, budget) != 0 {
-			return 1
+		if ishairy(ll.N, budget) {
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
-func ishairy(n *Node, budget *int) int {
-	if !(n != nil) {
-		return 0
+func ishairy(n *Node, budget *int) bool {
+	if n == nil {
+		return false
 	}
 
 	// Things that are too hairy, irrespective of the budget
@@ -185,7 +185,7 @@
 		OPANIC,
 		ORECOVER:
 		if Debug['l'] < 4 {
-			return 1
+			return true
 		}
 
 	case OCLOSURE,
@@ -199,12 +199,12 @@
 		ODCLTYPE,  // can't print yet
 		ODCLCONST, // can't print yet
 		ORETJMP:
-		return 1
+		return true
 	}
 
 	(*budget)--
 
-	return bool2int(*budget < 0 || ishairy(n.Left, budget) != 0 || ishairy(n.Right, budget) != 0 || ishairylist(n.List, budget) != 0 || ishairylist(n.Rlist, budget) != 0 || ishairylist(n.Ninit, budget) != 0 || ishairy(n.Ntest, budget) != 0 || ishairy(n.Nincr, budget) != 0 || ishairylist(n.Nbody, budget) != 0 || ishairylist(n.Nelse, budget) != 0)
+	return *budget < 0 || ishairy(n.Left, budget) || ishairy(n.Right, budget) || ishairylist(n.List, budget) || ishairylist(n.Rlist, budget) || ishairylist(n.Ninit, budget) || ishairy(n.Ntest, budget) || ishairy(n.Nincr, budget) || ishairylist(n.Nbody, budget) || ishairylist(n.Nelse, budget)
 }
 
 // Inlcopy and inlcopylist recursively copy the body of a function.
@@ -506,7 +506,7 @@
 
 func tinlvar(t *Type) *Node {
 	if t.Nname != nil && !isblank(t.Nname) {
-		if !(t.Nname.Inlvar != nil) {
+		if t.Nname.Inlvar == nil {
 			Fatal("missing inlvar for %v\n", Nconv(t.Nname, 0))
 		}
 		return t.Nname.Inlvar
@@ -524,7 +524,7 @@
 // parameters.
 func mkinlcall1(np **Node, fn *Node, isddd int) {
 	var i int
-	var chkargcount int
+	var chkargcount bool
 	var n *Node
 	var call *Node
 	var saveinlfn *Node
@@ -535,7 +535,7 @@
 	var ninit *NodeList
 	var body *NodeList
 	var t *Type
-	var variadic int
+	var variadic bool
 	var varargcount int
 	var multiret int
 	var vararg *Node
@@ -623,10 +623,10 @@
 		// method call with a receiver.
 		t = getthisx(fn.Type).Type
 
-		if t != nil && t.Nname != nil && !isblank(t.Nname) && !(t.Nname.Inlvar != nil) {
+		if t != nil && t.Nname != nil && !isblank(t.Nname) && t.Nname.Inlvar == nil {
 			Fatal("missing inlvar for %v\n", Nconv(t.Nname, 0))
 		}
-		if !(n.Left.Left != nil) {
+		if n.Left.Left == nil {
 			Fatal("method call without receiver: %v", Nconv(n, obj.FmtSign))
 		}
 		if t == nil {
@@ -640,26 +640,26 @@
 	}
 
 	// check if inlined function is variadic.
-	variadic = 0
+	variadic = false
 
 	varargtype = nil
 	varargcount = 0
 	for t = fn.Type.Type.Down.Down.Type; t != nil; t = t.Down {
 		if t.Isddd != 0 {
-			variadic = 1
+			variadic = true
 			varargtype = t.Type
 		}
 	}
 
 	// but if argument is dotted too forget about variadicity.
-	if variadic != 0 && isddd != 0 {
-		variadic = 0
+	if variadic && isddd != 0 {
+		variadic = false
 	}
 
 	// check if argument is actually a returned tuple from call.
 	multiret = 0
 
-	if n.List != nil && !(n.List.Next != nil) {
+	if n.List != nil && n.List.Next == nil {
 		switch n.List.N.Op {
 		case OCALL,
 			OCALLFUNC,
@@ -671,7 +671,7 @@
 		}
 	}
 
-	if variadic != 0 {
+	if variadic {
 		varargcount = count(n.List) + multiret
 		if n.Left.Op != ODOTMETH {
 			varargcount -= fn.Type.Thistuple
@@ -688,14 +688,14 @@
 	// TODO: if len(nlist) == 1 but multiple args, check that n->list->n is a call?
 	if fn.Type.Thistuple != 0 && n.Left.Op != ODOTMETH {
 		// non-method call to method
-		if !(n.List != nil) {
+		if n.List == nil {
 			Fatal("non-method call to method without first arg: %v", Nconv(n, obj.FmtSign))
 		}
 
 		// append receiver inlvar to LHS.
 		t = getthisx(fn.Type).Type
 
-		if t != nil && t.Nname != nil && !isblank(t.Nname) && !(t.Nname.Inlvar != nil) {
+		if t != nil && t.Nname != nil && !isblank(t.Nname) && t.Nname.Inlvar == nil {
 			Fatal("missing inlvar for %v\n", Nconv(t.Nname, 0))
 		}
 		if t == nil {
@@ -706,14 +706,14 @@
 	}
 
 	// append ordinary arguments to LHS.
-	chkargcount = bool2int(n.List != nil && n.List.Next != nil)
+	chkargcount = n.List != nil && n.List.Next != nil
 
 	vararg = nil  // the slice argument to a variadic call
 	varargs = nil // the list of LHS names to put in vararg.
-	if !(chkargcount != 0) {
+	if !chkargcount {
 		// 0 or 1 expression on RHS.
 		for t = getinargx(fn.Type).Type; t != nil; t = t.Down {
-			if variadic != 0 && t.Isddd != 0 {
+			if variadic && t.Isddd != 0 {
 				vararg = tinlvar(t)
 				for i = 0; i < varargcount && ll != nil; i++ {
 					m = argvar(varargtype, i)
@@ -729,10 +729,10 @@
 	} else {
 		// match arguments except final variadic (unless the call is dotted itself)
 		for t = getinargx(fn.Type).Type; t != nil; {
-			if !(ll != nil) {
+			if ll == nil {
 				break
 			}
-			if variadic != 0 && t.Isddd != 0 {
+			if variadic && t.Isddd != 0 {
 				break
 			}
 			as.List = list(as.List, tinlvar(t))
@@ -741,7 +741,7 @@
 		}
 
 		// match varargcount arguments with variadic parameters.
-		if variadic != 0 && t != nil && t.Isddd != 0 {
+		if variadic && t != nil && t.Isddd != 0 {
 			vararg = tinlvar(t)
 			for i = 0; i < varargcount && ll != nil; i++ {
 				m = argvar(varargtype, i)
@@ -766,9 +766,9 @@
 	}
 
 	// turn the variadic args into a slice.
-	if variadic != 0 {
+	if variadic {
 		as = Nod(OAS, vararg, nil)
-		if !(varargcount != 0) {
+		if varargcount == 0 {
 			as.Right = nodnil()
 			as.Right.Type = varargtype
 		} else {
@@ -1019,7 +1019,7 @@
 }
 
 func setlno(n *Node, lno int) {
-	if !(n != nil) {
+	if n == nil {
 		return
 	}
 
diff --git a/src/cmd/internal/gc/lex.go b/src/cmd/internal/gc/lex.go
index 98cebe8..651ba5f 100644
--- a/src/cmd/internal/gc/lex.go
+++ b/src/cmd/internal/gc/lex.go
@@ -504,20 +504,20 @@
 	return i
 }
 
-func skiptopkgdef(b *obj.Biobuf) int {
+func skiptopkgdef(b *obj.Biobuf) bool {
 	var p string
 	var sz int
 
 	/* archive header */
 	p = obj.Brdline(b, '\n')
 	if p == "" {
-		return 0
+		return false
 	}
 	if obj.Blinelen(b) != 8 {
-		return 0
+		return false
 	}
 	if p != "!<arch>\n" {
-		return 0
+		return false
 	}
 
 	/* symbol table may be first; skip it */
@@ -533,9 +533,9 @@
 	sz = arsize(b, "__.PKGDEF")
 
 	if sz <= 0 {
-		return 0
+		return false
 	}
-	return 1
+	return true
 }
 
 func addidir(dir string) {
@@ -560,7 +560,7 @@
 		strings.HasPrefix(name.S, "../") || name.S == ".."
 }
 
-func findpkg(name *Strlit) int {
+func findpkg(name *Strlit) bool {
 	var p *Idir
 	var q string
 	var suffix string
@@ -568,7 +568,7 @@
 
 	if islocalname(name) {
 		if safemode != 0 || nolocalimports != 0 {
-			return 0
+			return false
 		}
 
 		// try .a before .6.  important for building libraries:
@@ -577,13 +577,13 @@
 		namebuf = fmt.Sprintf("%v.a", Zconv(name, 0))
 
 		if obj.Access(namebuf, 0) >= 0 {
-			return 1
+			return true
 		}
 		namebuf = fmt.Sprintf("%v.%c", Zconv(name, 0), Thearch.Thechar)
 		if obj.Access(namebuf, 0) >= 0 {
-			return 1
+			return true
 		}
-		return 0
+		return false
 	}
 
 	// local imports should be canonicalized already.
@@ -592,17 +592,17 @@
 	_ = q
 	if path.Clean(name.S) != name.S {
 		Yyerror("non-canonical import path %v (should be %s)", Zconv(name, 0), q)
-		return 0
+		return false
 	}
 
 	for p = idirs; p != nil; p = p.link {
 		namebuf = fmt.Sprintf("%s/%v.a", p.dir, Zconv(name, 0))
 		if obj.Access(namebuf, 0) >= 0 {
-			return 1
+			return true
 		}
 		namebuf = fmt.Sprintf("%s/%v.%c", p.dir, Zconv(name, 0), Thearch.Thechar)
 		if obj.Access(namebuf, 0) >= 0 {
-			return 1
+			return true
 		}
 	}
 
@@ -619,15 +619,15 @@
 
 		namebuf = fmt.Sprintf("%s/pkg/%s_%s%s%s/%v.a", goroot, goos, goarch, suffixsep, suffix, Zconv(name, 0))
 		if obj.Access(namebuf, 0) >= 0 {
-			return 1
+			return true
 		}
 		namebuf = fmt.Sprintf("%s/pkg/%s_%s%s%s/%v.%c", goroot, goos, goarch, suffixsep, suffix, Zconv(name, 0), Thearch.Thechar)
 		if obj.Access(namebuf, 0) >= 0 {
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
 func fakeimport() {
@@ -714,7 +714,7 @@
 		}
 	}
 
-	if !(findpkg(path_) != 0) {
+	if !findpkg(path_) {
 		Yyerror("can't find import: \"%v\"", Zconv(f.U.Sval, 0))
 		errorexit()
 	}
@@ -748,7 +748,7 @@
 
 	n = len(namebuf)
 	if n > 2 && namebuf[n-2] == '.' && namebuf[n-1] == 'a' {
-		if !(skiptopkgdef(imp) != 0) {
+		if !skiptopkgdef(imp) {
 			Yyerror("import %s: not a package file", file)
 			errorexit()
 		}
@@ -946,7 +946,7 @@
 
 		for {
 
-			if escchar('"', &escflag, &v) != 0 {
+			if escchar('"', &escflag, &v) {
 				break
 			}
 			if v < utf8.RuneSelf || escflag != 0 {
@@ -988,12 +988,12 @@
 
 		/* '.' */
 	case '\'':
-		if escchar('\'', &escflag, &v) != 0 {
+		if escchar('\'', &escflag, &v) {
 			Yyerror("empty character literal or unescaped ' in character literal")
 			v = '\''
 		}
 
-		if !(escchar('\'', &escflag, &v) != 0) {
+		if !escchar('\'', &escflag, &v) {
 			Yyerror("missing '")
 			ungetc(int(v))
 		}
@@ -1629,7 +1629,7 @@
 	}
 
 	if verb == "go:linkname" {
-		if !(imported_unsafe != 0) {
+		if imported_unsafe == 0 {
 			Yyerror("//go:linkname only allowed in Go files that import \"unsafe\"")
 		}
 		f := strings.Fields(cmd)
@@ -1658,7 +1658,7 @@
 	}
 
 	if verb == "go:nowritebarrier" {
-		if !(compiling_runtime != 0) {
+		if compiling_runtime == 0 {
 			Yyerror("//go:nowritebarrier only allowed in runtime")
 		}
 		nowritebarrier = true
@@ -1961,7 +1961,7 @@
 	}
 }
 
-func escchar(e int, escflg *int, val *int64) int {
+func escchar(e int, escflg *int, val *int64) bool {
 	var i int
 	var u int
 	var c int
@@ -1973,21 +1973,21 @@
 	switch c {
 	case EOF:
 		Yyerror("eof in string")
-		return 1
+		return true
 
 	case '\n':
 		Yyerror("newline in string")
-		return 1
+		return true
 
 	case '\\':
 		break
 
 	default:
 		if c == e {
-			return 1
+			return true
 		}
 		*val = int64(c)
-		return 0
+		return false
 	}
 
 	u = 0
@@ -2043,7 +2043,7 @@
 	}
 
 	*val = int64(c)
-	return 0
+	return false
 
 hex:
 	l = 0
@@ -2075,7 +2075,7 @@
 	}
 
 	*val = l
-	return 0
+	return false
 
 oct:
 	l = int64(c) - '0'
@@ -2095,7 +2095,7 @@
 	}
 
 	*val = l
-	return 0
+	return false
 }
 
 var syms = []struct {
@@ -2530,12 +2530,12 @@
 	idealbool = typ(TBOOL)
 
 	s = Pkglookup("true", builtinpkg)
-	s.Def = Nodbool(1)
+	s.Def = Nodbool(true)
 	s.Def.Sym = Lookup("true")
 	s.Def.Type = idealbool
 
 	s = Pkglookup("false", builtinpkg)
-	s.Def = Nodbool(0)
+	s.Def = Nodbool(false)
 	s.Def.Sym = Lookup("false")
 	s.Def.Type = idealbool
 
@@ -2704,14 +2704,14 @@
 
 	s = Lookup("true")
 	if s.Def == nil {
-		s.Def = Nodbool(1)
+		s.Def = Nodbool(true)
 		s.Def.Sym = s
 		s.Origpkg = builtinpkg
 	}
 
 	s = Lookup("false")
 	if s.Def == nil {
-		s.Def = Nodbool(0)
+		s.Def = Nodbool(false)
 		s.Def.Sym = s
 		s.Origpkg = builtinpkg
 	}
@@ -3163,7 +3163,7 @@
 					// leave s->block set to cause redeclaration
 					// errors if a conflicting top-level name is
 					// introduced by a different file.
-					if !(s.Def.Used != 0) && !(nsyntaxerrors != 0) {
+					if s.Def.Used == 0 && nsyntaxerrors == 0 {
 						pkgnotused(int(s.Def.Lineno), s.Def.Pkg.Path, s.Name)
 					}
 					s.Def = nil
@@ -3173,7 +3173,7 @@
 				if s.Def.Sym != s {
 					// throw away top-level name left over
 					// from previous import . "x"
-					if s.Def.Pack != nil && !(s.Def.Pack.Used != 0) && !(nsyntaxerrors != 0) {
+					if s.Def.Pack != nil && s.Def.Pack.Used == 0 && nsyntaxerrors == 0 {
 						pkgnotused(int(s.Def.Pack.Lineno), s.Def.Pack.Pkg.Path, "")
 						s.Def.Pack.Used = 1
 					}
diff --git a/src/cmd/internal/gc/mparith2.go b/src/cmd/internal/gc/mparith2.go
index 415adf0..057585c 100644
--- a/src/cmd/internal/gc/mparith2.go
+++ b/src/cmd/internal/gc/mparith2.go
@@ -44,7 +44,7 @@
 	}
 
 	a.Ovf = uint8(c)
-	if a.Ovf != 0 && !(quiet != 0) {
+	if a.Ovf != 0 && quiet == 0 {
 		Yyerror("constant shift overflow")
 	}
 }
@@ -59,7 +59,7 @@
 	i = Mpprec - 1
 	if a.A[i] != 0 {
 		a.Ovf = 1
-		if !(quiet != 0) {
+		if quiet == 0 {
 			Yyerror("constant shift overflow")
 		}
 	}
@@ -223,7 +223,7 @@
 	}
 
 	a.Ovf = uint8(c)
-	if a.Ovf != 0 && !(quiet != 0) {
+	if a.Ovf != 0 && quiet == 0 {
 		Yyerror("constant addition overflow")
 	}
 
@@ -663,15 +663,15 @@
 	q.Neg = uint8(ns ^ ds)
 }
 
-func mpiszero(a *Mpint) int {
+func mpiszero(a *Mpint) bool {
 	var i int
 
 	for i = Mpprec - 1; i >= 0; i-- {
 		if a.A[i] != 0 {
-			return 0
+			return false
 		}
 	}
-	return 1
+	return true
 }
 
 func mpdivfract(a *Mpint, b *Mpint) {
@@ -694,7 +694,7 @@
 		for j = 0; j < Mpscale; j++ {
 			x <<= 1
 			if mpcmp(&d, &n) <= 0 {
-				if !(mpiszero(&d) != 0) {
+				if !mpiszero(&d) {
 					x |= 1
 				}
 				mpsubfixfix(&n, &d)
diff --git a/src/cmd/internal/gc/order.go b/src/cmd/internal/gc/order.go
index 6f18952..743ca80 100644
--- a/src/cmd/internal/gc/order.go
+++ b/src/cmd/internal/gc/order.go
@@ -62,13 +62,13 @@
 // Ordertemp allocates a new temporary with the given type,
 // pushes it onto the temp stack, and returns it.
 // If clear is true, ordertemp emits code to zero the temporary.
-func ordertemp(t *Type, order *Order, clear int) *Node {
+func ordertemp(t *Type, order *Order, clear bool) *Node {
 	var var_ *Node
 	var a *Node
 	var l *NodeList
 
 	var_ = temp(t)
-	if clear != 0 {
+	if clear {
 		a = Nod(OAS, var_, nil)
 		typecheck(&a, Etop)
 		order.out = list(order.out, a)
@@ -101,7 +101,7 @@
 	var a *Node
 	var var_ *Node
 
-	var_ = ordertemp(t, order, clear)
+	var_ = ordertemp(t, order, clear != 0)
 	a = Nod(OAS, var_, n)
 	typecheck(&a, Etop)
 	order.out = list(order.out, a)
@@ -135,10 +135,6 @@
 	var a *Node
 
 	switch n.Op {
-	default:
-		Fatal("ordersafeexpr %v", Oconv(int(n.Op), 0))
-		fallthrough
-
 	case ONAME,
 		OLITERAL:
 		return n
@@ -170,7 +166,7 @@
 
 	case OINDEX,
 		OINDEXMAP:
-		if Isfixedarray(n.Left.Type) != 0 {
+		if Isfixedarray(n.Left.Type) {
 			l = ordersafeexpr(n.Left, order)
 		} else {
 			l = ordercheapexpr(n.Left, order)
@@ -187,14 +183,17 @@
 		typecheck(&a, Erv)
 		return a
 	}
+
+	Fatal("ordersafeexpr %v", Oconv(int(n.Op), 0))
+	return nil // not reached
 }
 
 // Istemp reports whether n is a temporary variable.
-func istemp(n *Node) int {
+func istemp(n *Node) bool {
 	if n.Op != ONAME {
-		return 0
+		return false
 	}
-	return bool2int(strings.HasPrefix(n.Sym.Name, "autotmp_"))
+	return strings.HasPrefix(n.Sym.Name, "autotmp_")
 }
 
 // Isaddrokay reports whether it is okay to pass n's address to runtime routines.
@@ -203,8 +202,8 @@
 // of ordinary stack variables, those are not 'isaddrokay'. Temporaries are okay,
 // because we emit explicit VARKILL instructions marking the end of those
 // temporaries' lifetimes.
-func isaddrokay(n *Node) int {
-	return bool2int(islvalue(n) != 0 && (n.Op != ONAME || n.Class == PEXTERN || istemp(n) != 0))
+func isaddrokay(n *Node) bool {
+	return islvalue(n) && (n.Op != ONAME || n.Class == PEXTERN || istemp(n))
 }
 
 // Orderaddrtemp ensures that *np is okay to pass by address to runtime routines.
@@ -214,7 +213,7 @@
 	var n *Node
 
 	n = *np
-	if isaddrokay(n) != 0 {
+	if isaddrokay(n) {
 		return
 	}
 	*np = ordercopyexpr(n, n.Type, order, 0)
@@ -232,7 +231,7 @@
 
 	for {
 		l = order.temp
-		if !(l != mark) {
+		if l == mark {
 			break
 		}
 		order.temp = l.Next
@@ -330,19 +329,19 @@
 
 // Ismulticall reports whether the list l is f() for a multi-value function.
 // Such an f() could appear as the lone argument to a multi-arg function.
-func ismulticall(l *NodeList) int {
+func ismulticall(l *NodeList) bool {
 	var n *Node
 
 	// one arg only
 	if l == nil || l.Next != nil {
-		return 0
+		return false
 	}
 	n = l.N
 
 	// must be call
 	switch n.Op {
 	default:
-		return 0
+		return false
 
 	case OCALLFUNC,
 		OCALLMETH,
@@ -351,7 +350,7 @@
 	}
 
 	// call must return multiple values
-	return bool2int(n.Left.Type.Outtuple > 1)
+	return n.Left.Type.Outtuple > 1
 }
 
 // Copyret emits t1, t2, ... = n, where n is a function call,
@@ -364,7 +363,7 @@
 	var l2 *NodeList
 	var tl Iter
 
-	if n.Type.Etype != TSTRUCT || !(n.Type.Funarg != 0) {
+	if n.Type.Etype != TSTRUCT || n.Type.Funarg == 0 {
 		Fatal("copyret %v %d", Tconv(n.Type, 0), n.Left.Type.Outtuple)
 	}
 
@@ -387,7 +386,7 @@
 
 // Ordercallargs orders the list of call arguments *l.
 func ordercallargs(l **NodeList, order *Order) {
-	if ismulticall(*l) != 0 {
+	if ismulticall(*l) {
 		// return f() where f() is multiple values.
 		*l = copyret((*l).N, order)
 	} else {
@@ -435,15 +434,14 @@
 	switch n.Op {
 	default:
 		Fatal("ordermapassign %v", Oconv(int(n.Op), 0))
-		fallthrough
 
 	case OAS:
 		order.out = list(order.out, n)
 
 		// We call writebarrierfat only for values > 4 pointers long. See walk.c.
-		if (n.Left.Op == OINDEXMAP || (needwritebarrier(n.Left, n.Right) != 0 && n.Left.Type.Width > int64(4*Widthptr))) && !(isaddrokay(n.Right) != 0) {
+		if (n.Left.Op == OINDEXMAP || (needwritebarrier(n.Left, n.Right) && n.Left.Type.Width > int64(4*Widthptr))) && !isaddrokay(n.Right) {
 			m = n.Left
-			n.Left = ordertemp(m.Type, order, 0)
+			n.Left = ordertemp(m.Type, order, false)
 			a = Nod(OAS, m, n.Left)
 			typecheck(&a, Etop)
 			order.out = list(order.out, a)
@@ -457,13 +455,13 @@
 		for l = n.List; l != nil; l = l.Next {
 			if l.N.Op == OINDEXMAP {
 				m = l.N
-				if !(istemp(m.Left) != 0) {
+				if !istemp(m.Left) {
 					m.Left = ordercopyexpr(m.Left, m.Left.Type, order, 0)
 				}
-				if !(istemp(m.Right) != 0) {
+				if !istemp(m.Right) {
 					m.Right = ordercopyexpr(m.Right, m.Right.Type, order, 0)
 				}
-				l.N = ordertemp(m.Type, order, 0)
+				l.N = ordertemp(m.Type, order, false)
 				a = Nod(OAS, m, l.N)
 				typecheck(&a, Etop)
 				post = list(post, a)
@@ -501,7 +499,6 @@
 	switch n.Op {
 	default:
 		Fatal("orderstmt %v", Oconv(int(n.Op), 0))
-		fallthrough
 
 	case OVARKILL:
 		order.out = list(order.out, n)
@@ -593,7 +590,7 @@
 			order.out = list(order.out, n)
 		} else {
 			typ = n.Rlist.N.Type
-			tmp1 = ordertemp(typ, order, bool2int(haspointers(typ)))
+			tmp1 = ordertemp(typ, order, haspointers(typ))
 			order.out = list(order.out, n)
 			r = Nod(OAS, n.List.N, tmp1)
 			typecheck(&r, Etop)
@@ -611,11 +608,11 @@
 		orderexprlist(n.List, order)
 		orderexpr(&n.Rlist.N.Left, order) // arg to recv
 		ch = n.Rlist.N.Left.Type
-		tmp1 = ordertemp(ch.Type, order, bool2int(haspointers(ch.Type)))
+		tmp1 = ordertemp(ch.Type, order, haspointers(ch.Type))
 		if !isblank(n.List.Next.N) {
-			tmp2 = ordertemp(n.List.Next.N.Type, order, 0)
+			tmp2 = ordertemp(n.List.Next.N.Type, order, false)
 		} else {
-			tmp2 = ordertemp(Types[TBOOL], order, 0)
+			tmp2 = ordertemp(Types[TBOOL], order, false)
 		}
 		order.out = list(order.out, n)
 		r = Nod(OAS, n.List.N, tmp1)
@@ -724,7 +721,7 @@
 		t = marktemp(order)
 
 		orderexpr(&n.Left, order)
-		if !(Isinter(n.Left.Type) != 0) {
+		if !Isinter(n.Left.Type) {
 			orderaddrtemp(&n.Left, order)
 		}
 		order.out = list(order.out, n)
@@ -745,7 +742,6 @@
 		switch n.Type.Etype {
 		default:
 			Fatal("orderstmt range %v", Tconv(n.Type, 0))
-			fallthrough
 
 			// Mark []byte(str) range expression to reuse string backing storage.
 		// It is safe because the storage cannot be mutated.
@@ -784,7 +780,7 @@
 			n.Right = ordercopyexpr(r, r.Type, order, 0)
 
 			// n->alloc is the temp for the iterator.
-			n.Alloc = ordertemp(Types[TUINT8], order, 1)
+			n.Alloc = ordertemp(Types[TUINT8], order, true)
 		}
 
 		for l = n.List; l != nil; l = l.Next {
@@ -884,7 +880,7 @@
 							l.N.Ninit = list(l.N.Ninit, tmp2)
 						}
 
-						r.Left = ordertemp(r.Right.Left.Type.Type, order, bool2int(haspointers(r.Right.Left.Type.Type)))
+						r.Left = ordertemp(r.Right.Left.Type.Type, order, haspointers(r.Right.Left.Type.Type))
 						tmp2 = Nod(OAS, tmp1, r.Left)
 						typecheck(&tmp2, Etop)
 						l.N.Ninit = list(l.N.Ninit, tmp2)
@@ -901,7 +897,7 @@
 							l.N.Ninit = list(l.N.Ninit, tmp2)
 						}
 
-						r.Ntest = ordertemp(tmp1.Type, order, 0)
+						r.Ntest = ordertemp(tmp1.Type, order, false)
 						tmp2 = Nod(OAS, tmp1, r.Ntest)
 						typecheck(&tmp2, Etop)
 						l.N.Ninit = list(l.N.Ninit, tmp2)
@@ -919,11 +915,11 @@
 					// r->left is c, r->right is x, both are always evaluated.
 					orderexpr(&r.Left, order)
 
-					if !(istemp(r.Left) != 0) {
+					if !istemp(r.Left) {
 						r.Left = ordercopyexpr(r.Left, r.Left.Type, order, 0)
 					}
 					orderexpr(&r.Right, order)
-					if !(istemp(r.Right) != 0) {
+					if !istemp(r.Right) {
 						r.Right = ordercopyexpr(r.Right, r.Right.Type, order, 0)
 					}
 				}
@@ -1003,8 +999,8 @@
 	var l *NodeList
 	var t *Type
 	var lno int
-	var haslit int
-	var hasbyte int
+	var haslit bool
+	var hasbyte bool
 
 	n = *np
 	if n == nil {
@@ -1031,7 +1027,7 @@
 			t = typ(TARRAY)
 			t.Bound = int64(count(n.List))
 			t.Type = Types[TSTRING]
-			n.Alloc = ordertemp(t, order, 0)
+			n.Alloc = ordertemp(t, order, false)
 		}
 
 		// Mark string(byteSlice) arguments to reuse byteSlice backing
@@ -1041,15 +1037,15 @@
 		// Otherwise if all other arguments are empty strings,
 		// concatstrings will return the reference to the temp string
 		// to the caller.
-		hasbyte = 0
+		hasbyte = false
 
-		haslit = 0
+		haslit = false
 		for l = n.List; l != nil; l = l.Next {
-			hasbyte |= bool2int(l.N.Op == OARRAYBYTESTR)
-			haslit |= bool2int(l.N.Op == OLITERAL && len(l.N.Val.U.Sval.S) != 0)
+			hasbyte = hasbyte || l.N.Op == OARRAYBYTESTR
+			haslit = haslit || l.N.Op == OLITERAL && len(l.N.Val.U.Sval.S) != 0
 		}
 
-		if haslit != 0 && hasbyte != 0 {
+		if haslit && hasbyte {
 			for l = n.List; l != nil; l = l.Next {
 				if l.N.Op == OARRAYBYTESTR {
 					l.N.Op = OARRAYBYTESTRTMP
@@ -1103,7 +1099,7 @@
 	case OCONVIFACE:
 		orderexpr(&n.Left, order)
 
-		if !(Isinter(n.Left.Type) != 0) {
+		if !Isinter(n.Left.Type) {
 			orderaddrtemp(&n.Left, order)
 		}
 
@@ -1141,7 +1137,7 @@
 
 	case OCLOSURE:
 		if n.Noescape && n.Cvars != nil {
-			n.Alloc = ordertemp(Types[TUINT8], order, 0) // walk will fill in correct type
+			n.Alloc = ordertemp(Types[TUINT8], order, false) // walk will fill in correct type
 		}
 
 	case OARRAYLIT,
@@ -1151,7 +1147,7 @@
 		orderexprlist(n.List, order)
 		orderexprlist(n.Rlist, order)
 		if n.Noescape {
-			n.Alloc = ordertemp(Types[TUINT8], order, 0) // walk will fill in correct type
+			n.Alloc = ordertemp(Types[TUINT8], order, false) // walk will fill in correct type
 		}
 
 	case ODDDARG:
@@ -1160,7 +1156,7 @@
 			// Allocate a temporary that will be cleaned up when this statement
 			// completes. We could be more aggressive and try to arrange for it
 			// to be cleaned up when the call completes.
-			n.Alloc = ordertemp(n.Type.Type, order, 0)
+			n.Alloc = ordertemp(n.Type.Type, order, false)
 		}
 
 	case ORECV,
@@ -1173,7 +1169,7 @@
 		orderexpr(&n.Left, order)
 		orderexpr(&n.Right, order)
 		t = n.Left.Type
-		if t.Etype == TSTRUCT || Isfixedarray(t) != 0 {
+		if t.Etype == TSTRUCT || Isfixedarray(t) {
 			// for complex comparisons, we need both args to be
 			// addressable so we can pass them to the runtime.
 			orderaddrtemp(&n.Left, order)
diff --git a/src/cmd/internal/gc/pgen.go b/src/cmd/internal/gc/pgen.go
index 052d7dc..5d93ee6 100644
--- a/src/cmd/internal/gc/pgen.go
+++ b/src/cmd/internal/gc/pgen.go
@@ -272,7 +272,7 @@
 	ll = Curfn.Dcl
 
 	n = ll.N
-	if n.Class == PAUTO && n.Op == ONAME && !(n.Used != 0) {
+	if n.Class == PAUTO && n.Op == ONAME && n.Used == 0 {
 		// No locals used at all
 		Curfn.Dcl = nil
 
@@ -282,7 +282,7 @@
 
 	for ll = Curfn.Dcl; ll.Next != nil; ll = ll.Next {
 		n = ll.Next.N
-		if n.Class == PAUTO && n.Op == ONAME && !(n.Used != 0) {
+		if n.Class == PAUTO && n.Op == ONAME && n.Used == 0 {
 			ll.Next = nil
 			Curfn.Dcl.End = ll
 			break
@@ -360,12 +360,12 @@
 	}
 
 	// Ideally we wouldn't see any integer types here, but we do.
-	if n.Type == nil || (!(Isptr[n.Type.Etype] != 0) && !(Isint[n.Type.Etype] != 0) && n.Type.Etype != TUNSAFEPTR) {
+	if n.Type == nil || (Isptr[n.Type.Etype] == 0 && Isint[n.Type.Etype] == 0 && n.Type.Etype != TUNSAFEPTR) {
 		Dump("checknil", n)
 		Fatal("bad checknil")
 	}
 
-	if ((Thearch.Thechar == '5' || Thearch.Thechar == '9') && n.Op != OREGISTER) || !(n.Addable != 0) || n.Op == OLITERAL {
+	if ((Thearch.Thechar == '5' || Thearch.Thechar == '9') && n.Op != OREGISTER) || n.Addable == 0 || n.Op == OLITERAL {
 		Thearch.Regalloc(&reg, Types[Tptr], n)
 		Thearch.Cgen(n, &reg)
 		Thearch.Gins(obj.ACHECKNIL, &reg, nil)
@@ -478,7 +478,7 @@
 	if fn.Wrapper != 0 {
 		ptxt.From3.Offset |= obj.WRAPPER
 	}
-	if fn.Needctxt != 0 {
+	if fn.Needctxt {
 		ptxt.From3.Offset |= obj.NEEDCTXT
 	}
 	if fn.Nosplit {
@@ -557,7 +557,7 @@
 	Pc.Lineno = lineno
 
 	fixjmp(ptxt)
-	if !(Debug['N'] != 0) || Debug['R'] != 0 || Debug['P'] != 0 {
+	if Debug['N'] == 0 || Debug['R'] != 0 || Debug['P'] != 0 {
 		regopt(ptxt)
 		nilopt(ptxt)
 	}
diff --git a/src/cmd/internal/gc/plive.go b/src/cmd/internal/gc/plive.go
index 04173fc..73f6086 100644
--- a/src/cmd/internal/gc/plive.go
+++ b/src/cmd/internal/gc/plive.go
@@ -183,18 +183,13 @@
 // are two criteria for termination.  If the end of basic block is reached a
 // value of zero is returned.  If the callback returns a non-zero value, the
 // iteration is stopped and the value of the callback is returned.
-func blockany(bb *BasicBlock, callback func(*obj.Prog) int) int {
-	var p *obj.Prog
-	var result int
-
-	for p = bb.last; p != nil; p = p.Opt.(*obj.Prog) {
-		result = callback(p)
-		if result != 0 {
-			return result
+func blockany(bb *BasicBlock, f func(*obj.Prog) bool) bool {
+	for p := bb.last; p != nil; p = p.Opt.(*obj.Prog) {
+		if f(p) {
+			return true
 		}
 	}
-
-	return 0
+	return false
 }
 
 // Collects and returns and array of Node*s for functions arguments and local
@@ -303,7 +298,7 @@
 
 var isselectcommcasecall_names [5]*obj.LSym
 
-func isselectcommcasecall(prog *obj.Prog) int {
+func isselectcommcasecall(prog *obj.Prog) bool {
 	var i int32
 
 	if isselectcommcasecall_names[0] == nil {
@@ -315,41 +310,41 @@
 
 	for i = 0; isselectcommcasecall_names[i] != nil; i++ {
 		if iscall(prog, isselectcommcasecall_names[i]) {
-			return 1
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
 // Returns true for call instructions that target runtime·newselect.
 
 var isnewselect_sym *obj.LSym
 
-func isnewselect(prog *obj.Prog) int {
+func isnewselect(prog *obj.Prog) bool {
 	if isnewselect_sym == nil {
 		isnewselect_sym = Linksym(Pkglookup("newselect", Runtimepkg))
 	}
-	return bool2int(iscall(prog, isnewselect_sym))
+	return iscall(prog, isnewselect_sym)
 }
 
 // Returns true for call instructions that target runtime·selectgo.
 
 var isselectgocall_sym *obj.LSym
 
-func isselectgocall(prog *obj.Prog) int {
+func isselectgocall(prog *obj.Prog) bool {
 	if isselectgocall_sym == nil {
 		isselectgocall_sym = Linksym(Pkglookup("selectgo", Runtimepkg))
 	}
-	return bool2int(iscall(prog, isselectgocall_sym))
+	return iscall(prog, isselectgocall_sym)
 }
 
 var isdeferreturn_sym *obj.LSym
 
-func isdeferreturn(prog *obj.Prog) int {
+func isdeferreturn(prog *obj.Prog) bool {
 	if isdeferreturn_sym == nil {
 		isdeferreturn_sym = Linksym(Pkglookup("deferreturn", Runtimepkg))
 	}
-	return bool2int(iscall(prog, isdeferreturn_sym))
+	return iscall(prog, isdeferreturn_sym)
 }
 
 // Walk backwards from a runtime·selectgo call up to its immediately dominating
@@ -366,7 +361,7 @@
 			Fatal("selectgo does not have a newselect")
 		}
 		pred = pred.pred[0]
-		if blockany(pred, isselectcommcasecall) != 0 {
+		if blockany(pred, isselectcommcasecall) {
 			// A select comm case block should have exactly one
 			// successor.
 			if len(pred.succ) != 1 {
@@ -386,7 +381,7 @@
 			addedge(selectgo, succ)
 		}
 
-		if blockany(pred, isnewselect) != 0 {
+		if blockany(pred, isnewselect) {
 			// Reached the matching newselect.
 			break
 		}
@@ -451,7 +446,7 @@
 				p.Link.Opt = newblock(p.Link)
 				cfg = append(cfg, p.Link.Opt.(*BasicBlock))
 			}
-		} else if isselectcommcasecall(p) != 0 || isselectgocall(p) != 0 {
+		} else if isselectcommcasecall(p) || isselectgocall(p) {
 			// Accommodate implicit selectgo control flow.
 			if p.Link.Opt == nil {
 				p.Link.Opt = newblock(p.Link)
@@ -478,7 +473,7 @@
 			}
 
 			// Collect basic blocks with selectgo calls.
-			if isselectgocall(p) != 0 {
+			if isselectgocall(p) {
 				selectgo = append(selectgo, bb)
 			}
 		}
@@ -627,7 +622,7 @@
 			// non-tail-call return instructions; see note above
 			// the for loop for details.
 			case PPARAMOUT:
-				if !(node.Addrtaken != 0) && prog.To.Type == obj.TYPE_NONE {
+				if node.Addrtaken == 0 && prog.To.Type == obj.TYPE_NONE {
 					bvset(uevar, i)
 				}
 			}
@@ -674,7 +669,7 @@
 						bvset(uevar, pos)
 					}
 					if info.Flags&LeftWrite != 0 {
-						if from.Node != nil && !(Isfat(((from.Node).(*Node)).Type) != 0) {
+						if from.Node != nil && !Isfat(((from.Node).(*Node)).Type) {
 							bvset(varkill, pos)
 						}
 					}
@@ -718,7 +713,7 @@
 						bvset(uevar, pos)
 					}
 					if info.Flags&RightWrite != 0 {
-						if to.Node != nil && (!(Isfat(((to.Node).(*Node)).Type) != 0) || prog.As == obj.AVARDEF) {
+						if to.Node != nil && (!Isfat(((to.Node).(*Node)).Type) || prog.As == obj.AVARDEF) {
 							bvset(varkill, pos)
 						}
 					}
@@ -1050,7 +1045,7 @@
 		if t.Bound < -1 {
 			Fatal("twobitwalktype1: invalid bound, %v", Tconv(t, 0))
 		}
-		if Isslice(t) != 0 {
+		if Isslice(t) {
 			// struct { byte *array; uintgo len; uintgo cap; }
 			if *xoffset&int64(Widthptr-1) != 0 {
 				Fatal("twobitwalktype1: invalid TARRAY alignment, %v", Tconv(t, 0))
@@ -1101,7 +1096,7 @@
 
 	for i = 0; ; i++ {
 		i = int32(bvnext(liveout, i))
-		if !(i >= 0) {
+		if i < 0 {
 			break
 		}
 		node = vars[i]
@@ -1163,8 +1158,8 @@
 
 // Returns true for instructions that are safe points that must be annotated
 // with liveness information.
-func issafepoint(prog *obj.Prog) int {
-	return bool2int(prog.As == obj.ATEXT || prog.As == obj.ACALL)
+func issafepoint(prog *obj.Prog) bool {
+	return prog.As == obj.ATEXT || prog.As == obj.ACALL
 }
 
 // Initializes the sets for solving the live variables.  Visits all the
@@ -1332,7 +1327,7 @@
 
 // This function is slow but it is only used for generating debug prints.
 // Check whether n is marked live in args/locals.
-func islive(n *Node, args *Bvec, locals *Bvec) int {
+func islive(n *Node, args *Bvec, locals *Bvec) bool {
 	var i int
 
 	switch n.Class {
@@ -1340,19 +1335,19 @@
 		PPARAMOUT:
 		for i = 0; int64(i) < n.Type.Width/int64(Widthptr)*obj.BitsPerPointer; i++ {
 			if bvget(args, int32(n.Xoffset/int64(Widthptr)*obj.BitsPerPointer+int64(i))) != 0 {
-				return 1
+				return true
 			}
 		}
 
 	case PAUTO:
 		for i = 0; int64(i) < n.Type.Width/int64(Widthptr)*obj.BitsPerPointer; i++ {
 			if bvget(locals, int32((n.Xoffset+stkptrsize)/int64(Widthptr)*obj.BitsPerPointer+int64(i))) != 0 {
-				return 1
+				return true
 			}
 		}
 	}
 
-	return 0
+	return false
 }
 
 // Visits all instructions in a basic block and computes a bit vector of live
@@ -1427,21 +1422,21 @@
 			bvor(any, any, avarinit)
 			bvor(all, all, avarinit)
 
-			if issafepoint(p) != 0 {
+			if issafepoint(p) {
 				// Annotate ambiguously live variables so that they can
 				// be zeroed at function entry.
 				// livein and liveout are dead here and used as temporaries.
 				bvresetall(livein)
 
 				bvandnot(liveout, any, all)
-				if !(bvisempty(liveout) != 0) {
+				if !bvisempty(liveout) {
 					for pos = 0; pos < liveout.n; pos++ {
-						if !(bvget(liveout, pos) != 0) {
+						if bvget(liveout, pos) == 0 {
 							continue
 						}
 						bvset(all, pos) // silence future warnings in this block
 						n = lv.vars[pos]
-						if !(n.Needzero != 0) {
+						if n.Needzero == 0 {
 							n.Needzero = 1
 							if debuglive >= 1 {
 								Warnl(int(p.Lineno), "%v: %v is ambiguously live", Nconv(Curfn.Nname, 0), Nconv(n, obj.FmtLong))
@@ -1517,7 +1512,7 @@
 			bvcopy(liveout, livein)
 			bvandnot(livein, liveout, varkill)
 			bvor(livein, livein, uevar)
-			if debuglive >= 3 && issafepoint(p) != 0 {
+			if debuglive >= 3 && issafepoint(p) {
 				fmt.Printf("%v\n", p)
 				printvars("uevar", uevar, lv.vars)
 				printvars("varkill", varkill, lv.vars)
@@ -1525,7 +1520,7 @@
 				printvars("liveout", liveout, lv.vars)
 			}
 
-			if issafepoint(p) != 0 {
+			if issafepoint(p) {
 				// Found an interesting instruction, record the
 				// corresponding liveness information.
 
@@ -1534,7 +1529,7 @@
 				// input parameters.
 				if p.As == obj.ATEXT {
 					for j = 0; j < liveout.n; j++ {
-						if !(bvget(liveout, j) != 0) {
+						if bvget(liveout, j) == 0 {
 							continue
 						}
 						n = lv.vars[j]
@@ -1574,7 +1569,7 @@
 					numlive = 0
 					for j = 0; j < int32(len(lv.vars)); j++ {
 						n = lv.vars[j]
-						if islive(n, args, locals) != 0 {
+						if islive(n, args, locals) {
 							fmt_ += fmt.Sprintf(" %v", Nconv(n, 0))
 							numlive++
 						}
@@ -1592,7 +1587,7 @@
 				// Only CALL instructions need a PCDATA annotation.
 				// The TEXT instruction annotation is implicit.
 				if p.As == obj.ACALL {
-					if isdeferreturn(p) != 0 {
+					if isdeferreturn(p) {
 						// runtime.deferreturn modifies its return address to return
 						// back to the CALL, not to the subsequent instruction.
 						// Because the return comes back one instruction early,
@@ -1760,11 +1755,11 @@
 
 	started = 0
 	for i = 0; i < len(vars); i++ {
-		if !(bvget(bits, int32(i)) != 0) {
+		if bvget(bits, int32(i)) == 0 {
 			continue
 		}
-		if !(started != 0) {
-			if !(printed != 0) {
+		if started == 0 {
+			if printed == 0 {
 				fmt.Printf("\t")
 			} else {
 				fmt.Printf(" ")
@@ -1856,14 +1851,14 @@
 			if printed != 0 {
 				fmt.Printf("\n")
 			}
-			if issafepoint(p) != 0 {
+			if issafepoint(p) {
 				args = lv.argslivepointers[pcdata]
 				locals = lv.livepointers[pcdata]
 				fmt.Printf("\tlive=")
 				printed = 0
 				for j = 0; j < len(lv.vars); j++ {
 					n = lv.vars[j]
-					if islive(n, args, locals) != 0 {
+					if islive(n, args, locals) {
 						tmp9 := printed
 						printed++
 						if tmp9 != 0 {
diff --git a/src/cmd/internal/gc/popt.go b/src/cmd/internal/gc/popt.go
index 6d69120..8a3601b 100644
--- a/src/cmd/internal/gc/popt.go
+++ b/src/cmd/internal/gc/popt.go
@@ -179,7 +179,7 @@
 
 var noreturn_symlist [10]*Sym
 
-func Noreturn(p *obj.Prog) int {
+func Noreturn(p *obj.Prog) bool {
 	var s *Sym
 	var i int
 
@@ -195,18 +195,18 @@
 	}
 
 	if p.To.Node == nil {
-		return 0
+		return false
 	}
 	s = ((p.To.Node).(*Node)).Sym
 	if s == nil {
-		return 0
+		return false
 	}
 	for i = 0; noreturn_symlist[i] != nil; i++ {
 		if s == noreturn_symlist[i] {
-			return 1
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
 // JMP chasing and removal.
@@ -325,7 +325,7 @@
 
 	// pass 4: elide JMP to next instruction.
 	// only safe if there are no jumps to JMPs anymore.
-	if !(jmploop != 0) {
+	if jmploop == 0 {
 		last = nil
 		for p = firstp; p != nil; p = p.Link {
 			if p.As == obj.AJMP && p.To.Type == obj.TYPE_BRANCH && p.To.U.Branch == p.Link {
@@ -434,7 +434,7 @@
 	for f = start; f != nil; f = f.Link {
 		p = f.Prog
 		Thearch.Proginfo(&info, p)
-		if !(info.Flags&Break != 0) {
+		if info.Flags&Break == 0 {
 			f1 = f.Link
 			f.S1 = f1
 			f1.P1 = f
@@ -492,11 +492,11 @@
 
 	r.Rpo = 1
 	r1 = r.S1
-	if r1 != nil && !(r1.Rpo != 0) {
+	if r1 != nil && r1.Rpo == 0 {
 		n = postorder(r1, rpo2r, n)
 	}
 	r1 = r.S2
-	if r1 != nil && !(r1.Rpo != 0) {
+	if r1 != nil && r1.Rpo == 0 {
 		n = postorder(r1, rpo2r, n)
 	}
 	rpo2r[n] = r
@@ -529,26 +529,26 @@
 	return rpo1
 }
 
-func doms(idom []int32, r int32, s int32) int {
+func doms(idom []int32, r int32, s int32) bool {
 	for s > r {
 		s = idom[s]
 	}
-	return bool2int(s == r)
+	return s == r
 }
 
-func loophead(idom []int32, r *Flow) int {
+func loophead(idom []int32, r *Flow) bool {
 	var src int32
 
 	src = r.Rpo
-	if r.P1 != nil && doms(idom, src, r.P1.Rpo) != 0 {
-		return 1
+	if r.P1 != nil && doms(idom, src, r.P1.Rpo) {
+		return true
 	}
 	for r = r.P2; r != nil; r = r.P2link {
-		if doms(idom, src, r.Rpo) != 0 {
-			return 1
+		if doms(idom, src, r.Rpo) {
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
 func loopmark(rpo2r **Flow, head int32, r *Flow) {
@@ -620,7 +620,7 @@
 	for i = 0; i < nr; i++ {
 		r1 = rpo2r[i]
 		r1.Loop++
-		if r1.P2 != nil && loophead(idom, r1) != 0 {
+		if r1.P2 != nil && loophead(idom, r1) {
 			loopmark(&rpo2r[0], i, r1)
 		}
 	}
@@ -718,8 +718,8 @@
 }
 
 // Is n available for merging?
-func canmerge(n *Node) int {
-	return bool2int(n.Class == PAUTO && strings.HasPrefix(n.Sym.Name, "autotmp"))
+func canmerge(n *Node) bool {
+	return n.Class == PAUTO && strings.HasPrefix(n.Sym.Name, "autotmp")
 }
 
 func mergetemp(firstp *obj.Prog) {
@@ -757,7 +757,7 @@
 	// Build list of all mergeable variables.
 	nvar = 0
 	for l = Curfn.Dcl; l != nil; l = l.Next {
-		if canmerge(l.N) != 0 {
+		if canmerge(l.N) {
 			nvar++
 		}
 	}
@@ -766,7 +766,7 @@
 	nvar = 0
 	for l = Curfn.Dcl; l != nil; l = l.Next {
 		n = l.N
-		if canmerge(n) != 0 {
+		if canmerge(n) {
 			v = &var_[nvar]
 			nvar++
 			n.Opt = v
@@ -826,9 +826,9 @@
 		if f != nil && f.Data.(*Flow) == nil {
 			p = f.Prog
 			Thearch.Proginfo(&info, p)
-			if p.To.Node == v.node && (info.Flags&RightWrite != 0) && !(info.Flags&RightRead != 0) {
+			if p.To.Node == v.node && (info.Flags&RightWrite != 0) && info.Flags&RightRead == 0 {
 				p.As = obj.ANOP
-				p.To = obj.Zprog.To
+				p.To = obj.Addr{}
 				v.removed = 1
 				if debugmerge > 0 && Debug['v'] != 0 {
 					fmt.Printf("drop write-only %v\n", Sconv(v.node.Sym, 0))
@@ -851,7 +851,7 @@
 			const (
 				SizeAny = SizeB | SizeW | SizeL | SizeQ | SizeF | SizeD
 			)
-			if p.From.Node == v.node && p1.To.Node == v.node && (info.Flags&Move != 0) && !((info.Flags|info1.Flags)&(LeftAddr|RightAddr) != 0) && info.Flags&SizeAny == info1.Flags&SizeAny {
+			if p.From.Node == v.node && p1.To.Node == v.node && (info.Flags&Move != 0) && (info.Flags|info1.Flags)&(LeftAddr|RightAddr) == 0 && info.Flags&SizeAny == info1.Flags&SizeAny {
 				p1.From = p.From
 				Thearch.Excise(f)
 				v.removed = 1
@@ -1010,7 +1010,7 @@
 	// Delete merged nodes from declaration list.
 	for lp = &Curfn.Dcl; ; {
 		l = *lp
-		if !(l != nil) {
+		if l == nil {
 			break
 		}
 
@@ -1126,11 +1126,11 @@
 	nkill = 0
 	for f = g.Start; f != nil; f = f.Link {
 		p = f.Prog
-		if p.As != obj.ACHECKNIL || !(Thearch.Regtyp(&p.From) != 0) {
+		if p.As != obj.ACHECKNIL || !Thearch.Regtyp(&p.From) {
 			continue
 		}
 		ncheck++
-		if Thearch.Stackaddr(&p.From) != 0 {
+		if Thearch.Stackaddr(&p.From) {
 			if Debug_checknil != 0 && p.Lineno > 1 {
 				Warnl(int(p.Lineno), "removed nil check of SP address")
 			}
@@ -1177,13 +1177,13 @@
 	for f = fcheck; f != nil; f = Uniqp(f) {
 		p = f.Prog
 		Thearch.Proginfo(&info, p)
-		if (info.Flags&RightWrite != 0) && Thearch.Sameaddr(&p.To, &fcheck.Prog.From) != 0 {
+		if (info.Flags&RightWrite != 0) && Thearch.Sameaddr(&p.To, &fcheck.Prog.From) {
 			// Found initialization of value we're checking for nil.
 			// without first finding the check, so this one is unchecked.
 			return
 		}
 
-		if f != fcheck && p.As == obj.ACHECKNIL && Thearch.Sameaddr(&p.From, &fcheck.Prog.From) != 0 {
+		if f != fcheck && p.As == obj.ACHECKNIL && Thearch.Sameaddr(&p.From, &fcheck.Prog.From) {
 			fcheck.Data = &killed
 			return
 		}
@@ -1249,12 +1249,12 @@
 		p = f.Prog
 		Thearch.Proginfo(&info, p)
 
-		if (info.Flags&LeftRead != 0) && Thearch.Smallindir(&p.From, &fcheck.Prog.From) != 0 {
+		if (info.Flags&LeftRead != 0) && Thearch.Smallindir(&p.From, &fcheck.Prog.From) {
 			fcheck.Data = &killed
 			return
 		}
 
-		if (info.Flags&(RightRead|RightWrite) != 0) && Thearch.Smallindir(&p.To, &fcheck.Prog.From) != 0 {
+		if (info.Flags&(RightRead|RightWrite) != 0) && Thearch.Smallindir(&p.To, &fcheck.Prog.From) {
 			fcheck.Data = &killed
 			return
 		}
@@ -1265,12 +1265,12 @@
 		}
 
 		// Stop if value is lost.
-		if (info.Flags&RightWrite != 0) && Thearch.Sameaddr(&p.To, &fcheck.Prog.From) != 0 {
+		if (info.Flags&RightWrite != 0) && Thearch.Sameaddr(&p.To, &fcheck.Prog.From) {
 			return
 		}
 
 		// Stop if memory write.
-		if (info.Flags&RightWrite != 0) && !(Thearch.Regtyp(&p.To) != 0) {
+		if (info.Flags&RightWrite != 0) && !Thearch.Regtyp(&p.To) {
 			return
 		}
 
diff --git a/src/cmd/internal/gc/racewalk.go b/src/cmd/internal/gc/racewalk.go
index fe7a82c..582f6b4 100644
--- a/src/cmd/internal/gc/racewalk.go
+++ b/src/cmd/internal/gc/racewalk.go
@@ -30,27 +30,27 @@
 // Memory accesses in the packages are either uninteresting or will cause false positives.
 var noinst_pkgs = []string{"sync", "sync/atomic"}
 
-func ispkgin(pkgs []string) int {
+func ispkgin(pkgs []string) bool {
 	var i int
 
 	if myimportpath != "" {
 		for i = 0; i < len(pkgs); i++ {
 			if myimportpath == pkgs[i] {
-				return 1
+				return true
 			}
 		}
 	}
 
-	return 0
+	return false
 }
 
-func isforkfunc(fn *Node) int {
+func isforkfunc(fn *Node) bool {
 	// Special case for syscall.forkAndExecInChild.
 	// In the child, this function must not acquire any locks, because
 	// they might have been locked at the time of the fork.  This means
 	// no rescheduling, no malloc calls, and no new stack segments.
 	// Race instrumentation does all of the above.
-	return bool2int(myimportpath != "" && myimportpath == "syscall" && fn.Nname.Sym.Name == "forkAndExecInChild")
+	return myimportpath != "" && myimportpath == "syscall" && fn.Nname.Sym.Name == "forkAndExecInChild"
 }
 
 func racewalk(fn *Node) {
@@ -58,11 +58,11 @@
 	var nodpc *Node
 	var s string
 
-	if ispkgin(omit_pkgs) != 0 || isforkfunc(fn) != 0 {
+	if ispkgin(omit_pkgs) || isforkfunc(fn) {
 		return
 	}
 
-	if !(ispkgin(noinst_pkgs) != 0) {
+	if !ispkgin(noinst_pkgs) {
 		racewalklist(fn.Nbody, nil)
 
 		// nothing interesting for race detector in fn->enter
@@ -147,7 +147,6 @@
 	switch n.Op {
 	default:
 		Fatal("racewalk: unknown node type %v", Oconv(int(n.Op), 0))
-		fallthrough
 
 	case OAS,
 		OAS2FUNC:
@@ -263,7 +262,7 @@
 		OLEN,
 		OCAP:
 		racewalknode(&n.Left, init, 0, 0)
-		if Istype(n.Left.Type, TMAP) != 0 {
+		if Istype(n.Left.Type, TMAP) {
 			n1 = Nod(OCONVNOP, n.Left, nil)
 			n1.Type = Ptrto(Types[TUINT8])
 			n1 = Nod(OIND, n1, nil)
@@ -326,9 +325,9 @@
 		goto ret
 
 	case OINDEX:
-		if !(Isfixedarray(n.Left.Type) != 0) {
+		if !Isfixedarray(n.Left.Type) {
 			racewalknode(&n.Left, init, 0, 0)
-		} else if !(islvalue(n.Left) != 0) {
+		} else if !islvalue(n.Left) {
 			// index of unaddressable array, like Map[k][i].
 			racewalknode(&n.Left, init, wr, 0)
 
@@ -468,34 +467,34 @@
 	*np = n
 }
 
-func isartificial(n *Node) int {
+func isartificial(n *Node) bool {
 	// compiler-emitted artificial things that we do not want to instrument,
 	// cant' possibly participate in a data race.
 	if n.Op == ONAME && n.Sym != nil && n.Sym.Name != "" {
 		if n.Sym.Name == "_" {
-			return 1
+			return true
 		}
 
 		// autotmp's are always local
 		if strings.HasPrefix(n.Sym.Name, "autotmp_") {
-			return 1
+			return true
 		}
 
 		// statictmp's are read-only
 		if strings.HasPrefix(n.Sym.Name, "statictmp_") {
-			return 1
+			return true
 		}
 
 		// go.itab is accessed only by the compiler and runtime (assume safe)
 		if n.Sym.Pkg != nil && n.Sym.Pkg.Name != "" && n.Sym.Pkg.Name == "go.itab" {
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
-func callinstr(np **Node, init **NodeList, wr int, skip int) int {
+func callinstr(np **Node, init **NodeList, wr int, skip int) bool {
 	var name string
 	var f *Node
 	var b *Node
@@ -510,18 +509,18 @@
 	//	  n, n->op, n->type ? n->type->etype : -1, n->class);
 
 	if skip != 0 || n.Type == nil || n.Type.Etype >= TIDEAL {
-		return 0
+		return false
 	}
 	t = n.Type
-	if isartificial(n) != 0 {
-		return 0
+	if isartificial(n) {
+		return false
 	}
 
 	b = outervalue(n)
 
 	// it skips e.g. stores to ... parameter array
-	if isartificial(b) != 0 {
-		return 0
+	if isartificial(b) {
+		return false
 	}
 	class = int(b.Class)
 
@@ -539,7 +538,7 @@
 
 		n = treecopy(n)
 		makeaddable(n)
-		if t.Etype == TSTRUCT || Isfixedarray(t) != 0 {
+		if t.Etype == TSTRUCT || Isfixedarray(t) {
 			name = "racereadrange"
 			if wr != 0 {
 				name = "racewriterange"
@@ -554,10 +553,10 @@
 		}
 
 		*init = list(*init, f)
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
 // makeaddable returns a node whose memory location is the
@@ -572,7 +571,7 @@
 	// an addressable value.
 	switch n.Op {
 	case OINDEX:
-		if Isfixedarray(n.Left.Type) != 0 {
+		if Isfixedarray(n.Left.Type) {
 			makeaddable(n.Left)
 		}
 
@@ -596,7 +595,7 @@
 	var r *Node
 
 	r = Nod(OADDR, n, nil)
-	r.Bounded = 1
+	r.Bounded = true
 	r = conv(r, Types[TUNSAFEPTR])
 	r = conv(r, Types[TUINTPTR])
 	return r
diff --git a/src/cmd/internal/gc/range.go b/src/cmd/internal/gc/range.go
index 1e33da3..bb30bcf 100644
--- a/src/cmd/internal/gc/range.go
+++ b/src/cmd/internal/gc/range.go
@@ -43,7 +43,7 @@
 		}
 	}
 
-	if Isptr[t.Etype] != 0 && Isfixedarray(t.Type) != 0 {
+	if Isptr[t.Etype] != 0 && Isfixedarray(t.Type) {
 		t = t.Type
 	}
 	n.Type = t
@@ -63,7 +63,7 @@
 		t2 = t.Type
 
 	case TCHAN:
-		if !(t.Chan&Crecv != 0) {
+		if t.Chan&Crecv == 0 {
 			Yyerror("invalid operation: range %v (receive from send-only type %v)", Nconv(n.Right, 0), Tconv(n.Right.Type, 0))
 			goto out
 		}
@@ -184,7 +184,6 @@
 	switch t.Etype {
 	default:
 		Fatal("walkrange")
-		fallthrough
 
 		// Lower n into runtime·memclr if possible, for
 	// fast zeroing of slices and arrays (issue 5373).
@@ -196,8 +195,8 @@
 	//
 	// in which the evaluation of a is side-effect-free.
 	case TARRAY:
-		if !(Debug['N'] != 0) {
-			if !(flag_race != 0) {
+		if Debug['N'] == 0 {
+			if flag_race == 0 {
 				if v1 != nil {
 					if v2 == nil {
 						if n.Nbody != nil {
@@ -206,10 +205,10 @@
 									tmp = n.Nbody.N // first statement of body
 									if tmp.Op == OAS {
 										if tmp.Left.Op == OINDEX {
-											if samesafeexpr(tmp.Left.Left, a) != 0 {
-												if samesafeexpr(tmp.Left.Right, v1) != 0 {
+											if samesafeexpr(tmp.Left.Left, a) {
+												if samesafeexpr(tmp.Left.Right, v1) {
 													if t.Type.Width > 0 {
-														if iszero(tmp.Right) != 0 {
+														if iszero(tmp.Right) {
 															// Convert to
 															// if len(a) != 0 {
 															// 	hp = &a[0]
@@ -227,7 +226,7 @@
 															hp = temp(Ptrto(Types[TUINT8]))
 
 															tmp = Nod(OINDEX, a, Nodintconst(0))
-															tmp.Bounded = 1
+															tmp.Bounded = true
 															tmp = Nod(OADDR, tmp, nil)
 															tmp = Nod(OCONVNOP, tmp, nil)
 															tmp.Type = Ptrto(Types[TUINT8])
@@ -282,7 +281,7 @@
 		if v2 != nil {
 			hp = temp(Ptrto(n.Type.Type))
 			tmp = Nod(OINDEX, ha, Nodintconst(0))
-			tmp.Bounded = 1
+			tmp.Bounded = true
 			init = list(init, Nod(OAS, hp, Nod(OADDR, tmp, nil)))
 		}
 
@@ -369,7 +368,7 @@
 		}
 		hb = temp(Types[TBOOL])
 
-		n.Ntest = Nod(ONE, hb, Nodbool(0))
+		n.Ntest = Nod(ONE, hb, Nodbool(false))
 		a = Nod(OAS2RECV, nil, nil)
 		a.Typecheck = 1
 		a.List = list(list1(hv1), hb)
diff --git a/src/cmd/internal/gc/reflect.go b/src/cmd/internal/gc/reflect.go
index 4be0f1d..ba9b75d 100644
--- a/src/cmd/internal/gc/reflect.go
+++ b/src/cmd/internal/gc/reflect.go
@@ -355,7 +355,7 @@
 	// type stored in interface word
 	it = t
 
-	if !(isdirectiface(it) != 0) {
+	if !isdirectiface(it) {
 		it = Ptrto(t)
 	}
 
@@ -370,10 +370,10 @@
 		if f.Type.Etype != TFUNC || f.Type.Thistuple == 0 {
 			Fatal("non-method on %v method %v %v\n", Tconv(mt, 0), Sconv(f.Sym, 0), Tconv(f, 0))
 		}
-		if !(getthisx(f.Type).Type != nil) {
+		if getthisx(f.Type).Type == nil {
 			Fatal("receiver with no type on %v method %v %v\n", Tconv(mt, 0), Sconv(f.Sym, 0), Tconv(f, 0))
 		}
-		if f.Nointerface != 0 {
+		if f.Nointerface {
 			continue
 		}
 
@@ -391,7 +391,7 @@
 		if Isptr[this.Etype] != 0 && this.Type == t {
 			continue
 		}
-		if Isptr[this.Etype] != 0 && !(Isptr[t.Etype] != 0) && f.Embedded != 2 && !(isifacemethod(f.Type) != 0) {
+		if Isptr[this.Etype] != 0 && Isptr[t.Etype] == 0 && f.Embedded != 2 && !isifacemethod(f.Type) {
 			continue
 		}
 
@@ -412,7 +412,7 @@
 		a.type_ = methodfunc(f.Type, t)
 		a.mtype = methodfunc(f.Type, nil)
 
-		if !(a.isym.Flags&SymSiggen != 0) {
+		if a.isym.Flags&SymSiggen == 0 {
 			a.isym.Flags |= SymSiggen
 			if !Eqtype(this, it) || this.Width < Types[Tptr].Width {
 				compiling_wrappers = 1
@@ -421,7 +421,7 @@
 			}
 		}
 
-		if !(a.tsym.Flags&SymSiggen != 0) {
+		if a.tsym.Flags&SymSiggen == 0 {
 			a.tsym.Flags |= SymSiggen
 			if !Eqtype(this, t) {
 				compiling_wrappers = 1
@@ -489,7 +489,7 @@
 		// code can refer to it.
 		isym = methodsym(method, t, 0)
 
-		if !(isym.Flags&SymSiggen != 0) {
+		if isym.Flags&SymSiggen == 0 {
 			isym.Flags |= SymSiggen
 			genwrapper(t, f, isym, 0)
 		}
@@ -649,7 +649,7 @@
 
 func haspointers(t *Type) bool {
 	var t1 *Type
-	var ret int
+	var ret bool
 
 	if t.Haspointers != 0 {
 		return t.Haspointers-1 != 0
@@ -672,26 +672,26 @@
 		TCOMPLEX64,
 		TCOMPLEX128,
 		TBOOL:
-		ret = 0
+		ret = false
 
 	case TARRAY:
 		if t.Bound < 0 { // slice
-			ret = 1
+			ret = true
 			break
 		}
 
 		if t.Bound == 0 { // empty array
-			ret = 0
+			ret = false
 			break
 		}
 
-		ret = bool2int(haspointers(t.Type))
+		ret = haspointers(t.Type)
 
 	case TSTRUCT:
-		ret = 0
+		ret = false
 		for t1 = t.Type; t1 != nil; t1 = t1.Down {
 			if haspointers(t1.Type) {
-				ret = 1
+				ret = true
 				break
 			}
 		}
@@ -706,11 +706,11 @@
 		TFUNC:
 		fallthrough
 	default:
-		ret = 1
+		ret = true
 	}
 
-	t.Haspointers = uint8(1 + ret)
-	return ret != 0
+	t.Haspointers = 1 + uint8(bool2int(ret))
+	return ret
 }
 
 /*
@@ -724,7 +724,7 @@
 	var i int
 	var alg int
 	var sizeofAlg int
-	var gcprog int
+	var gcprog bool
 	var sptr *Sym
 	var algsym *Sym
 	var zero *Sym
@@ -751,7 +751,7 @@
 		algsym = dalgsym(t)
 	}
 
-	if t.Sym != nil && !(Isptr[t.Etype] != 0) {
+	if t.Sym != nil && Isptr[t.Etype] == 0 {
 		sptr = dtypesym(Ptrto(t))
 	} else {
 		sptr = weaktypesym(Ptrto(t))
@@ -811,10 +811,10 @@
 	if !haspointers(t) {
 		i |= obj.KindNoPointers
 	}
-	if isdirectiface(t) != 0 {
+	if isdirectiface(t) {
 		i |= obj.KindDirectIface
 	}
-	if gcprog != 0 {
+	if gcprog {
 		i |= obj.KindGCProg
 	}
 	ot = duint8(s, ot, uint8(i)) // kind
@@ -825,7 +825,7 @@
 	}
 
 	// gc
-	if gcprog != 0 {
+	if gcprog {
 		gengcprog(t, &gcprog0, &gcprog1)
 		if gcprog0 != nil {
 			ot = dsymptr(s, ot, gcprog0, 0)
@@ -937,7 +937,7 @@
 	var s *Sym
 	var n *Node
 
-	if t == nil || (Isptr[t.Etype] != 0 && t.Type == nil) || isideal(t) != 0 {
+	if t == nil || (Isptr[t.Etype] != 0 && t.Type == nil) || isideal(t) {
 		Fatal("typename %v", Tconv(t, 0))
 	}
 	s = typesym(t)
@@ -987,7 +987,7 @@
  * Returns 1 if t has a reflexive equality operator.
  * That is, if x==x for all x of type t.
  */
-func isreflexive(t *Type) int {
+func isreflexive(t *Type) bool {
 	var t1 *Type
 	switch t.Etype {
 	case TBOOL,
@@ -1007,33 +1007,33 @@
 		TUNSAFEPTR,
 		TSTRING,
 		TCHAN:
-		return 1
+		return true
 
 	case TFLOAT32,
 		TFLOAT64,
 		TCOMPLEX64,
 		TCOMPLEX128,
 		TINTER:
-		return 0
+		return false
 
 	case TARRAY:
-		if Isslice(t) != 0 {
+		if Isslice(t) {
 			Fatal("slice can't be a map key: %v", Tconv(t, 0))
 		}
 		return isreflexive(t.Type)
 
 	case TSTRUCT:
 		for t1 = t.Type; t1 != nil; t1 = t1.Down {
-			if !(isreflexive(t1.Type) != 0) {
-				return 0
+			if !isreflexive(t1.Type) {
+				return false
 			}
 		}
 
-		return 1
+		return true
 
 	default:
 		Fatal("bad type for map key: %v", Tconv(t, 0))
-		return 0
+		return false
 	}
 }
 
@@ -1062,7 +1062,7 @@
 		t = Types[t.Etype]
 	}
 
-	if isideal(t) != 0 {
+	if isideal(t) {
 		Fatal("dtypesym %v", Tconv(t, 0))
 	}
 
@@ -1090,7 +1090,7 @@
 	}
 
 	// named types from other files are defined only by those files
-	if tbase.Sym != nil && !(tbase.Local != 0) {
+	if tbase.Sym != nil && tbase.Local == 0 {
 		return s
 	}
 	if isforw[tbase.Etype] != 0 {
@@ -1230,7 +1230,7 @@
 		}
 
 		ot = duint16(s, ot, uint16(mapbucket(t).Width))
-		ot = duint8(s, ot, uint8(isreflexive(t.Down)))
+		ot = duint8(s, ot, uint8(bool2int(isreflexive(t.Down))))
 
 	case TPTR32,
 		TPTR64:
@@ -1265,7 +1265,7 @@
 		ot = duintxx(s, ot, uint64(n), Widthint)
 		for t1 = t.Type; t1 != nil; t1 = t1.Down {
 			// ../../runtime/type.go:/structField
-			if t1.Sym != nil && !(t1.Embedded != 0) {
+			if t1.Sym != nil && t1.Embedded == 0 {
 				ot = dgostringptr(s, ot, t1.Sym.Name)
 				if exportname(t1.Sym.Name) {
 					ot = dgostringptr(s, ot, "")
@@ -1447,12 +1447,12 @@
 	return s
 }
 
-func usegcprog(t *Type) int {
+func usegcprog(t *Type) bool {
 	var size int64
 	var nptr int64
 
 	if !haspointers(t) {
-		return 0
+		return false
 	}
 	if t.Width == BADWIDTH {
 		dowidth(t)
@@ -1473,7 +1473,7 @@
 	// While large objects usually contain arrays; and even if it don't
 	// the program uses 2-bits per word while mask uses 4-bits per word,
 	// so the program is still smaller.
-	return bool2int(size > int64(2*Widthptr))
+	return size > int64(2*Widthptr)
 }
 
 // Generates sparse GC bitmask (4 bits per word).
@@ -1483,7 +1483,7 @@
 	var nptr int64
 	var i int64
 	var j int64
-	var half int
+	var half bool
 	var bits uint8
 	var pos []byte
 
@@ -1505,7 +1505,7 @@
 	pos = gcmask
 
 	nptr = (t.Width + int64(Widthptr) - 1) / int64(Widthptr)
-	half = 0
+	half = false
 
 	// If number of words is odd, repeat the mask.
 	// This makes simpler handling of arrays in runtime.
@@ -1520,12 +1520,12 @@
 				bits = obj.BitsScalar
 			}
 			bits <<= 2
-			if half != 0 {
+			if half {
 				bits <<= 4
 			}
 			pos[0] |= byte(bits)
-			half = bool2int(!(half != 0))
-			if !(half != 0) {
+			half = !half
+			if !half {
 				pos = pos[1:]
 			}
 		}
@@ -1699,7 +1699,7 @@
 		*xoffset += t.Width
 
 	case TARRAY:
-		if Isslice(t) != 0 {
+		if Isslice(t) {
 			proggendata(g, obj.BitsPointer)
 			proggendata(g, obj.BitsScalar)
 			proggendata(g, obj.BitsScalar)
diff --git a/src/cmd/internal/gc/reg.go b/src/cmd/internal/gc/reg.go
index 4cc9286..37a394c 100644
--- a/src/cmd/internal/gc/reg.go
+++ b/src/cmd/internal/gc/reg.go
@@ -74,7 +74,7 @@
 	var v *Var
 	var node *Node
 
-	for bany(&bit) != 0 {
+	for bany(&bit) {
 		// convert each bit to a variable
 		i = bnum(bit)
 
@@ -169,9 +169,9 @@
 	p1.From.Type = obj.TYPE_REG
 	p1.From.Reg = int16(rn)
 	p1.From.Name = obj.NAME_NONE
-	if !(f != 0) {
+	if f == 0 {
 		p1.From = *a
-		*a = obj.Zprog.From
+		*a = obj.Addr{}
 		a.Type = obj.TYPE_REG
 		a.Reg = int16(rn)
 	}
@@ -182,18 +182,18 @@
 	Ostats.Nspill++
 }
 
-func overlap_reg(o1 int64, w1 int, o2 int64, w2 int) int {
+func overlap_reg(o1 int64, w1 int, o2 int64, w2 int) bool {
 	var t1 int64
 	var t2 int64
 
 	t1 = o1 + int64(w1)
 	t2 = o2 + int64(w2)
 
-	if !(t1 > o2 && t2 > o1) {
-		return 0
+	if t1 <= o2 || t2 <= o1 {
+		return false
 	}
 
-	return 1
+	return true
 }
 
 func mkvar(f *Flow, a *obj.Addr) Bits {
@@ -292,7 +292,7 @@
 				if int(v.etype) == et {
 					if int64(v.width) == w {
 						// TODO(rsc): Remove special case for arm here.
-						if !(flag != 0) || Thearch.Thechar != '5' {
+						if flag == 0 || Thearch.Thechar != '5' {
 							return blsh(uint(i))
 						}
 					}
@@ -300,7 +300,7 @@
 			}
 
 			// if they overlap, disable both
-			if overlap_reg(v.offset, v.width, o, int(w)) != 0 {
+			if overlap_reg(v.offset, v.width, o, int(w)) {
 				//				print("disable overlap %s %d %d %d %d, %E != %E\n", s->name, v->offset, v->width, o, w, v->etype, et);
 				v.addr = 1
 
@@ -446,7 +446,7 @@
 
 		switch f1.Prog.As {
 		case obj.ACALL:
-			if Noreturn(f1.Prog) != 0 {
+			if Noreturn(f1.Prog) {
 				break
 			}
 
@@ -499,7 +499,7 @@
 					// This will set the bits at most twice, keeping the overall loop linear.
 					v1, _ = v.node.Opt.(*Var)
 
-					if v == v1 || !(btest(&cal, uint(v1.id)) != 0) {
+					if v == v1 || !btest(&cal, uint(v1.id)) {
 						for ; v1 != nil; v1 = v1.nextinnode {
 							biset(&cal, uint(v1.id))
 						}
@@ -633,7 +633,7 @@
 		return
 	}
 	for {
-		if !(r.refbehind.b[z]&bb != 0) {
+		if r.refbehind.b[z]&bb == 0 {
 			break
 		}
 		f1 = f.P1
@@ -641,7 +641,7 @@
 			break
 		}
 		r1 = f1.Data.(*Reg)
-		if !(r1.refahead.b[z]&bb != 0) {
+		if r1.refahead.b[z]&bb == 0 {
 			break
 		}
 		if r1.act.b[z]&bb != 0 {
@@ -679,7 +679,7 @@
 			}
 		}
 
-		if !(r.refahead.b[z]&bb != 0) {
+		if r.refahead.b[z]&bb == 0 {
 			break
 		}
 		f1 = f.S2
@@ -696,7 +696,7 @@
 		if r.act.b[z]&bb != 0 {
 			break
 		}
-		if !(r.refbehind.b[z]&bb != 0) {
+		if r.refbehind.b[z]&bb == 0 {
 			break
 		}
 	}
@@ -714,11 +714,11 @@
 	bb = 1 << uint(bn%64)
 	vreg = regbits
 	r = f.Data.(*Reg)
-	if !(r.act.b[z]&bb != 0) {
+	if r.act.b[z]&bb == 0 {
 		return vreg
 	}
 	for {
-		if !(r.refbehind.b[z]&bb != 0) {
+		if r.refbehind.b[z]&bb == 0 {
 			break
 		}
 		f1 = f.P1
@@ -726,10 +726,10 @@
 			break
 		}
 		r1 = f1.Data.(*Reg)
-		if !(r1.refahead.b[z]&bb != 0) {
+		if r1.refahead.b[z]&bb == 0 {
 			break
 		}
-		if !(r1.act.b[z]&bb != 0) {
+		if r1.act.b[z]&bb == 0 {
 			break
 		}
 		f = f1
@@ -753,7 +753,7 @@
 			}
 		}
 
-		if !(r.refahead.b[z]&bb != 0) {
+		if r.refahead.b[z]&bb == 0 {
 			break
 		}
 		f1 = f.S2
@@ -767,10 +767,10 @@
 			break
 		}
 		r = f.Data.(*Reg)
-		if !(r.act.b[z]&bb != 0) {
+		if r.act.b[z]&bb == 0 {
 			break
 		}
-		if !(r.refbehind.b[z]&bb != 0) {
+		if r.refbehind.b[z]&bb == 0 {
 			break
 		}
 	}
@@ -793,7 +793,7 @@
 		return
 	}
 	for {
-		if !(r.refbehind.b[z]&bb != 0) {
+		if r.refbehind.b[z]&bb == 0 {
 			break
 		}
 		f1 = f.P1
@@ -801,7 +801,7 @@
 			break
 		}
 		r1 = f1.Data.(*Reg)
-		if !(r1.refahead.b[z]&bb != 0) {
+		if r1.refahead.b[z]&bb == 0 {
 			break
 		}
 		if r1.act.b[z]&bb != 0 {
@@ -851,7 +851,7 @@
 			}
 		}
 
-		if !(r.refahead.b[z]&bb != 0) {
+		if r.refahead.b[z]&bb == 0 {
 			break
 		}
 		f1 = f.S2
@@ -868,7 +868,7 @@
 		if r.act.b[z]&bb != 0 {
 			break
 		}
-		if !(r.refbehind.b[z]&bb != 0) {
+		if r.refbehind.b[z]&bb == 0 {
 			break
 		}
 	}
@@ -896,33 +896,33 @@
 		for z = 0; z < BITS; z++ {
 			bit.b[z] = r.set.b[z] | r.use1.b[z] | r.use2.b[z] | r.refbehind.b[z] | r.refahead.b[z] | r.calbehind.b[z] | r.calahead.b[z] | r.regdiff.b[z] | r.act.b[z] | 0
 		}
-		if bany(&bit) != 0 {
+		if bany(&bit) {
 			fmt.Printf("\t")
-			if bany(&r.set) != 0 {
+			if bany(&r.set) {
 				fmt.Printf(" s:%v", Qconv(r.set, 0))
 			}
-			if bany(&r.use1) != 0 {
+			if bany(&r.use1) {
 				fmt.Printf(" u1:%v", Qconv(r.use1, 0))
 			}
-			if bany(&r.use2) != 0 {
+			if bany(&r.use2) {
 				fmt.Printf(" u2:%v", Qconv(r.use2, 0))
 			}
-			if bany(&r.refbehind) != 0 {
+			if bany(&r.refbehind) {
 				fmt.Printf(" rb:%v ", Qconv(r.refbehind, 0))
 			}
-			if bany(&r.refahead) != 0 {
+			if bany(&r.refahead) {
 				fmt.Printf(" ra:%v ", Qconv(r.refahead, 0))
 			}
-			if bany(&r.calbehind) != 0 {
+			if bany(&r.calbehind) {
 				fmt.Printf(" cb:%v ", Qconv(r.calbehind, 0))
 			}
-			if bany(&r.calahead) != 0 {
+			if bany(&r.calahead) {
 				fmt.Printf(" ca:%v ", Qconv(r.calahead, 0))
 			}
-			if bany(&r.regdiff) != 0 {
+			if bany(&r.regdiff) {
 				fmt.Printf(" d:%v ", Qconv(r.regdiff, 0))
 			}
-			if bany(&r.act) != 0 {
+			if bany(&r.act) {
 				fmt.Printf(" a:%v ", Qconv(r.act, 0))
 			}
 		}
@@ -1052,7 +1052,7 @@
 		r.set.b[0] |= info.Regset
 
 		bit = mkvar(f, &p.From)
-		if bany(&bit) != 0 {
+		if bany(&bit) {
 			if info.Flags&LeftAddr != 0 {
 				setaddrs(bit)
 			}
@@ -1080,7 +1080,7 @@
 		}
 
 		bit = mkvar(f, &p.To)
-		if bany(&bit) != 0 {
+		if bany(&bit) {
 			if info.Flags&RightAddr != 0 {
 				setaddrs(bit)
 			}
@@ -1143,7 +1143,7 @@
 
 	for f = firstf; f != nil; f = f.Link {
 		p = f.Prog
-		if p.As == obj.AVARDEF && Isfat(((p.To.Node).(*Node)).Type) != 0 && ((p.To.Node).(*Node)).Opt != nil {
+		if p.As == obj.AVARDEF && Isfat(((p.To.Node).(*Node)).Type) && ((p.To.Node).(*Node)).Opt != nil {
 			active++
 			walkvardef(p.To.Node.(*Node), f, active)
 		}
@@ -1172,7 +1172,7 @@
 
 	for f = firstf; f != nil; f = f1 {
 		f1 = f.Link
-		if f1 != nil && f1.Active != 0 && !(f.Active != 0) {
+		if f1 != nil && f1.Active != 0 && f.Active == 0 {
 			prop(f, zbits, zbits)
 			i = 1
 		}
@@ -1244,7 +1244,7 @@
 		for z = 0; z < BITS; z++ {
 			bit.b[z] = (r.refahead.b[z] | r.calahead.b[z]) &^ (externs.b[z] | params.b[z] | addrs.b[z] | consts.b[z])
 		}
-		if bany(&bit) != 0 && !(f.Refset != 0) {
+		if bany(&bit) && f.Refset == 0 {
 			// should never happen - all variables are preset
 			if Debug['w'] != 0 {
 				fmt.Printf("%v: used and not set: %v\n", f.Prog.Line(), Qconv(bit, 0))
@@ -1262,7 +1262,7 @@
 		for z = 0; z < BITS; z++ {
 			bit.b[z] = r.set.b[z] &^ (r.refahead.b[z] | r.calahead.b[z] | addrs.b[z])
 		}
-		if bany(&bit) != 0 && !(f.Refset != 0) {
+		if bany(&bit) && f.Refset == 0 {
 			if Debug['w'] != 0 {
 				fmt.Printf("%v: set and not used: %v\n", f.Prog.Line(), Qconv(bit, 0))
 			}
@@ -1273,7 +1273,7 @@
 		for z = 0; z < BITS; z++ {
 			bit.b[z] = LOAD(r, z) &^ (r.act.b[z] | addrs.b[z])
 		}
-		for bany(&bit) != 0 {
+		for bany(&bit) {
 			i = bnum(bit)
 			change = 0
 			paint1(f, i)
@@ -1354,7 +1354,7 @@
 	 * pass 7
 	 * peep-hole on basic block
 	 */
-	if !(Debug['R'] != 0) || Debug['P'] != 0 {
+	if Debug['R'] == 0 || Debug['P'] != 0 {
 		Thearch.Peep(firstp)
 	}
 
diff --git a/src/cmd/internal/gc/select.go b/src/cmd/internal/gc/select.go
index 9e659d1..ab7a144 100644
--- a/src/cmd/internal/gc/select.go
+++ b/src/cmd/internal/gc/select.go
@@ -134,7 +134,6 @@
 			switch n.Op {
 			default:
 				Fatal("select %v", Oconv(int(n.Op), 0))
-				fallthrough
 
 				// ok already
 			case OSEND:
@@ -232,7 +231,6 @@
 		switch n.Op {
 		default:
 			Fatal("select %v", Oconv(int(n.Op), 0))
-			fallthrough
 
 			// if selectnbsend(c, v) { body } else { default body }
 		case OSEND:
@@ -299,7 +297,6 @@
 			switch n.Op {
 			default:
 				Fatal("select %v", Oconv(int(n.Op), 0))
-				fallthrough
 
 				// selectsend(sel *byte, hchan *chan any, elem *any) (selected bool);
 			case OSEND:
diff --git a/src/cmd/internal/gc/sinit.go b/src/cmd/internal/gc/sinit.go
index 6d044f1..57422b4 100644
--- a/src/cmd/internal/gc/sinit.go
+++ b/src/cmd/internal/gc/sinit.go
@@ -155,7 +155,7 @@
 			if n.Defn.Left != n {
 				goto bad
 			}
-			if isblank(n.Defn.Left) && candiscard(n.Defn.Right) != 0 {
+			if isblank(n.Defn.Left) && candiscard(n.Defn.Right) {
 				n.Defn.Op = OEMPTY
 				n.Defn.Left = nil
 				n.Defn.Right = nil
@@ -166,7 +166,7 @@
 			if Debug['j'] != 0 {
 				fmt.Printf("%v\n", Sconv(n.Sym, 0))
 			}
-			if isblank(n) || !(staticinit(n, out) != 0) {
+			if isblank(n) || !staticinit(n, out) {
 				if Debug['%'] != 0 {
 					Dump("nonstatic", n.Defn)
 				}
@@ -275,7 +275,7 @@
  * compilation of top-level (static) assignments
  * into DATA statements if at all possible.
  */
-func staticinit(n *Node, out **NodeList) int {
+func staticinit(n *Node, out **NodeList) bool {
 	var l *Node
 	var r *Node
 
@@ -291,7 +291,7 @@
 
 // like staticassign but we are copying an already
 // initialized value r.
-func staticcopy(l *Node, r *Node, out **NodeList) int {
+func staticcopy(l *Node, r *Node, out **NodeList) bool {
 	var i int
 	var e *InitEntry
 	var p *InitPlan
@@ -302,37 +302,37 @@
 	var n1 Node
 
 	if r.Op != ONAME || r.Class != PEXTERN || r.Sym.Pkg != localpkg {
-		return 0
+		return false
 	}
 	if r.Defn == nil { // probably zeroed but perhaps supplied externally and of unknown value
-		return 0
+		return false
 	}
 	if r.Defn.Op != OAS {
-		return 0
+		return false
 	}
 	orig = r
 	r = r.Defn.Right
 
 	switch r.Op {
 	case ONAME:
-		if staticcopy(l, r, out) != 0 {
-			return 1
+		if staticcopy(l, r, out) {
+			return true
 		}
 		*out = list(*out, Nod(OAS, l, r))
-		return 1
+		return true
 
 	case OLITERAL:
-		if iszero(r) != 0 {
-			return 1
+		if iszero(r) {
+			return true
 		}
 		gdata(l, r, int(l.Type.Width))
-		return 1
+		return true
 
 	case OADDR:
 		switch r.Left.Op {
 		case ONAME:
 			gdata(l, r, int(l.Type.Width))
-			return 1
+			return true
 		}
 
 	case OPTRLIT:
@@ -347,11 +347,11 @@
 			OMAPLIT:
 			gdata(l, Nod(OADDR, r.Nname, nil), int(l.Type.Width))
 
-			return 1
+			return true
 		}
 
 	case OARRAYLIT:
-		if Isslice(r.Type) != 0 {
+		if Isslice(r.Type) {
 			// copy slice
 			a = r.Nname
 
@@ -362,7 +362,7 @@
 			gdata(&n1, r.Right, Widthint)
 			n1.Xoffset = l.Xoffset + int64(Array_cap)
 			gdata(&n1, r.Right, Widthint)
-			return 1
+			return true
 		}
 		fallthrough
 
@@ -381,7 +381,7 @@
 				ll = Nod(OXXX, nil, nil)
 				*ll = n1
 				ll.Orig = ll // completely separate copy
-				if !(staticassign(ll, e.Expr, out) != 0) {
+				if !staticassign(ll, e.Expr, out) {
 					// Requires computation, but we're
 					// copying someone else's computation.
 					rr = Nod(OXXX, nil, nil)
@@ -395,13 +395,13 @@
 			}
 		}
 
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
-func staticassign(l *Node, r *Node, out **NodeList) int {
+func staticassign(l *Node, r *Node, out **NodeList) bool {
 	var a *Node
 	var n1 Node
 	var nam Node
@@ -422,18 +422,18 @@
 		}
 
 	case OLITERAL:
-		if iszero(r) != 0 {
-			return 1
+		if iszero(r) {
+			return true
 		}
 		gdata(l, r, int(l.Type.Width))
-		return 1
+		return true
 
 	case OADDR:
-		if stataddr(&nam, r.Left) != 0 {
+		if stataddr(&nam, r.Left) {
 			n1 = *r
 			n1.Left = &nam
 			gdata(l, &n1, int(l.Type.Width))
-			return 1
+			return true
 		}
 		fallthrough
 
@@ -453,22 +453,22 @@
 			gdata(l, Nod(OADDR, a, nil), int(l.Type.Width))
 
 			// Init underlying literal.
-			if !(staticassign(a, r.Left, out) != 0) {
+			if !staticassign(a, r.Left, out) {
 				*out = list(*out, Nod(OAS, a, r.Left))
 			}
-			return 1
+			return true
 		}
 
 	case OSTRARRAYBYTE:
 		if l.Class == PEXTERN && r.Left.Op == OLITERAL {
 			sval = r.Left.Val.U.Sval
 			slicebytes(l, sval.S, len(sval.S))
-			return 1
+			return true
 		}
 
 	case OARRAYLIT:
 		initplan(r)
-		if Isslice(r.Type) != 0 {
+		if Isslice(r.Type) {
 			// Init slice.
 			ta = typ(TARRAY)
 
@@ -505,20 +505,20 @@
 				a = Nod(OXXX, nil, nil)
 				*a = n1
 				a.Orig = a // completely separate copy
-				if !(staticassign(a, e.Expr, out) != 0) {
+				if !staticassign(a, e.Expr, out) {
 					*out = list(*out, Nod(OAS, a, e.Expr))
 				}
 			}
 		}
 
-		return 1
+		return true
 
 		// TODO: Table-driven map insert.
 	case OMAPLIT:
 		break
 	}
 
-	return 0
+	return false
 }
 
 /*
@@ -534,27 +534,27 @@
 	namebuf = fmt.Sprintf("statictmp_%.4d", statuniqgen)
 	statuniqgen++
 	n = newname(Lookup(namebuf))
-	if !(ctxt != 0) {
+	if ctxt == 0 {
 		n.Readonly = 1
 	}
 	addvar(n, t, PEXTERN)
 	return n
 }
 
-func isliteral(n *Node) int {
+func isliteral(n *Node) bool {
 	if n.Op == OLITERAL {
 		if n.Val.Ctype != CTNIL {
-			return 1
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
-func simplename(n *Node) int {
+func simplename(n *Node) bool {
 	if n.Op != ONAME {
 		goto no
 	}
-	if !(n.Addable != 0) {
+	if n.Addable == 0 {
 		goto no
 	}
 	if n.Class&PHEAP != 0 {
@@ -563,10 +563,10 @@
 	if n.Class == PPARAMREF {
 		goto no
 	}
-	return 1
+	return true
 
 no:
-	return 0
+	return false
 }
 
 func litas(l *Node, r *Node, init **NodeList) {
@@ -591,13 +591,13 @@
 	mode = 0
 	switch n.Op {
 	default:
-		if isliteral(n) != 0 {
+		if isliteral(n) {
 			return MODECONST
 		}
 		return MODEDYNAM
 
 	case OARRAYLIT:
-		if !(top != 0) && n.Type.Bound < 0 {
+		if top == 0 && n.Type.Bound < 0 {
 			return MODEDYNAM
 		}
 		fallthrough
@@ -657,7 +657,7 @@
 			continue
 		}
 
-		if isliteral(value) != 0 {
+		if isliteral(value) {
 			if pass == 2 {
 				continue
 			}
@@ -725,7 +725,7 @@
 			continue
 		}
 
-		if isliteral(index) != 0 && isliteral(value) != 0 {
+		if isliteral(index) && isliteral(value) {
 			if pass == 2 {
 				continue
 			}
@@ -881,7 +881,7 @@
 		index = r.Left
 		value = r.Right
 		a = Nod(OINDEX, var_, index)
-		a.Bounded = 1
+		a.Bounded = true
 
 		// TODO need to check bounds?
 
@@ -898,7 +898,7 @@
 			continue
 		}
 
-		if isliteral(index) != 0 && isliteral(value) != 0 {
+		if isliteral(index) && isliteral(value) {
 			continue
 		}
 
@@ -951,7 +951,7 @@
 		index = r.Left
 		value = r.Right
 
-		if isliteral(index) != 0 && isliteral(value) != 0 {
+		if isliteral(index) && isliteral(value) {
 			b++
 		}
 	}
@@ -999,7 +999,7 @@
 			index = r.Left
 			value = r.Right
 
-			if isliteral(index) != 0 && isliteral(value) != 0 {
+			if isliteral(index) && isliteral(value) {
 				// build vstat[b].a = key;
 				a = Nodintconst(b)
 
@@ -1033,11 +1033,11 @@
 		index = temp(Types[TINT])
 
 		a = Nod(OINDEX, vstat, index)
-		a.Bounded = 1
+		a.Bounded = true
 		a = Nod(ODOT, a, newname(symb))
 
 		r = Nod(OINDEX, vstat, index)
-		r.Bounded = 1
+		r.Bounded = true
 		r = Nod(ODOT, r, newname(syma))
 		r = Nod(OINDEX, var_, r)
 
@@ -1068,7 +1068,7 @@
 		index = r.Left
 		value = r.Right
 
-		if isliteral(index) != 0 && isliteral(value) != 0 {
+		if isliteral(index) && isliteral(value) {
 			continue
 		}
 
@@ -1118,10 +1118,9 @@
 	switch n.Op {
 	default:
 		Fatal("anylit: not lit")
-		fallthrough
 
 	case OPTRLIT:
-		if !(Isptr[t.Etype] != 0) {
+		if Isptr[t.Etype] == 0 {
 			Fatal("anylit: not ptr")
 		}
 
@@ -1150,7 +1149,7 @@
 			Fatal("anylit: not struct")
 		}
 
-		if simplename(var_) != 0 && count(n.List) > 4 {
+		if simplename(var_) && count(n.List) > 4 {
 			if ctxt == 0 {
 				// lay out static data
 				vstat = staticname(t, ctxt)
@@ -1176,7 +1175,7 @@
 		}
 
 		// initialize of not completely specified
-		if simplename(var_) != 0 || count(n.List) < structcount(t) {
+		if simplename(var_) || count(n.List) < structcount(t) {
 			a = Nod(OAS, var_, nil)
 			typecheck(&a, Etop)
 			walkexpr(&a, init)
@@ -1194,7 +1193,7 @@
 			break
 		}
 
-		if simplename(var_) != 0 && count(n.List) > 4 {
+		if simplename(var_) && count(n.List) > 4 {
 			if ctxt == 0 {
 				// lay out static data
 				vstat = staticname(t, ctxt)
@@ -1220,7 +1219,7 @@
 		}
 
 		// initialize of not completely specified
-		if simplename(var_) != 0 || int64(count(n.List)) < t.Bound {
+		if simplename(var_) || int64(count(n.List)) < t.Bound {
 			a = Nod(OAS, var_, nil)
 			typecheck(&a, Etop)
 			walkexpr(&a, init)
@@ -1237,7 +1236,7 @@
 	}
 }
 
-func oaslit(n *Node, init **NodeList) int {
+func oaslit(n *Node, init **NodeList) bool {
 	var ctxt int
 
 	if n.Left == nil || n.Right == nil {
@@ -1246,7 +1245,7 @@
 	if n.Left.Type == nil || n.Right.Type == nil {
 		goto no
 	}
-	if !(simplename(n.Left) != 0) {
+	if !simplename(n.Left) {
 		goto no
 	}
 	if !Eqtype(n.Left.Type, n.Right.Type) {
@@ -1268,28 +1267,28 @@
 	case OSTRUCTLIT,
 		OARRAYLIT,
 		OMAPLIT:
-		if vmatch1(n.Left, n.Right) != 0 {
+		if vmatch1(n.Left, n.Right) {
 			goto no
 		}
 		anylit(ctxt, n.Right, n.Left, init)
 	}
 
 	n.Op = OEMPTY
-	return 1
+	return true
 
 	// not a special composit literal assignment
 no:
-	return 0
+	return false
 }
 
 func getlit(lit *Node) int {
-	if Smallintconst(lit) != 0 {
+	if Smallintconst(lit) {
 		return int(Mpgetfix(lit.Val.U.Xval))
 	}
 	return -1
 }
 
-func stataddr(nam *Node, n *Node) int {
+func stataddr(nam *Node, n *Node) bool {
 	var l int
 
 	if n == nil {
@@ -1299,21 +1298,21 @@
 	switch n.Op {
 	case ONAME:
 		*nam = *n
-		return int(n.Addable)
+		return n.Addable != 0
 
 	case ODOT:
-		if !(stataddr(nam, n.Left) != 0) {
+		if !stataddr(nam, n.Left) {
 			break
 		}
 		nam.Xoffset += n.Xoffset
 		nam.Type = n.Type
-		return 1
+		return true
 
 	case OINDEX:
 		if n.Left.Type.Bound < 0 {
 			break
 		}
-		if !(stataddr(nam, n.Left) != 0) {
+		if !stataddr(nam, n.Left) {
 			break
 		}
 		l = getlit(n.Right)
@@ -1327,11 +1326,11 @@
 		}
 		nam.Xoffset += int64(l) * n.Type.Width
 		nam.Type = n.Type
-		return 1
+		return true
 	}
 
 no:
-	return 0
+	return false
 }
 
 func initplan(n *Node) {
@@ -1347,12 +1346,11 @@
 	switch n.Op {
 	default:
 		Fatal("initplan")
-		fallthrough
 
 	case OARRAYLIT:
 		for l = n.List; l != nil; l = l.Next {
 			a = l.N
-			if a.Op != OKEY || !(Smallintconst(a.Left) != 0) {
+			if a.Op != OKEY || !Smallintconst(a.Left) {
 				Fatal("initplan arraylit")
 			}
 			addvalue(p, n.Type.Type.Width*Mpgetfix(a.Left.Val.U.Xval), nil, a.Right)
@@ -1384,13 +1382,13 @@
 	var e *InitEntry
 
 	// special case: zero can be dropped entirely
-	if iszero(n) != 0 {
+	if iszero(n) {
 		p.Zero += n.Type.Width
 		return
 	}
 
 	// special case: inline struct and array (not slice) literals
-	if isvaluelit(n) != 0 {
+	if isvaluelit(n) {
 		initplan(n)
 		q = n.Initplan
 		for i = 0; i < len(q.E); i++ {
@@ -1414,7 +1412,7 @@
 	e.Expr = n
 }
 
-func iszero(n *Node) int {
+func iszero(n *Node) bool {
 	var l *NodeList
 
 	switch n.Op {
@@ -1423,30 +1421,29 @@
 		default:
 			Dump("unexpected literal", n)
 			Fatal("iszero")
-			fallthrough
 
 		case CTNIL:
-			return 1
+			return true
 
 		case CTSTR:
-			return bool2int(n.Val.U.Sval == nil || len(n.Val.U.Sval.S) == 0)
+			return n.Val.U.Sval == nil || len(n.Val.U.Sval.S) == 0
 
 		case CTBOOL:
-			return bool2int(n.Val.U.Bval == 0)
+			return n.Val.U.Bval == 0
 
 		case CTINT,
 			CTRUNE:
-			return bool2int(mpcmpfixc(n.Val.U.Xval, 0) == 0)
+			return mpcmpfixc(n.Val.U.Xval, 0) == 0
 
 		case CTFLT:
-			return bool2int(mpcmpfltc(n.Val.U.Fval, 0) == 0)
+			return mpcmpfltc(n.Val.U.Fval, 0) == 0
 
 		case CTCPLX:
-			return bool2int(mpcmpfltc(&n.Val.U.Cval.Real, 0) == 0 && mpcmpfltc(&n.Val.U.Cval.Imag, 0) == 0)
+			return mpcmpfltc(&n.Val.U.Cval.Real, 0) == 0 && mpcmpfltc(&n.Val.U.Cval.Imag, 0) == 0
 		}
 
 	case OARRAYLIT:
-		if Isslice(n.Type) != 0 {
+		if Isslice(n.Type) {
 			break
 		}
 		fallthrough
@@ -1454,18 +1451,18 @@
 		// fall through
 	case OSTRUCTLIT:
 		for l = n.List; l != nil; l = l.Next {
-			if !(iszero(l.N.Right) != 0) {
-				return 0
+			if !iszero(l.N.Right) {
+				return false
 			}
 		}
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
-func isvaluelit(n *Node) int {
-	return bool2int((n.Op == OARRAYLIT && Isfixedarray(n.Type) != 0) || n.Op == OSTRUCTLIT)
+func isvaluelit(n *Node) bool {
+	return (n.Op == OARRAYLIT && Isfixedarray(n.Type)) || n.Op == OSTRUCTLIT
 }
 
 func entry(p *InitPlan) *InitEntry {
@@ -1473,7 +1470,7 @@
 	return &p.E[len(p.E)-1]
 }
 
-func gen_as_init(n *Node) int {
+func gen_as_init(n *Node) bool {
 	var nr *Node
 	var nl *Node
 	var nam Node
@@ -1486,7 +1483,7 @@
 	nr = n.Right
 	nl = n.Left
 	if nr == nil {
-		if !(stataddr(&nam, nl) != 0) {
+		if !stataddr(&nam, nl) {
 			goto no
 		}
 		if nam.Class != PEXTERN {
@@ -1499,7 +1496,7 @@
 		goto no
 	}
 
-	if !(stataddr(&nam, nl) != 0) {
+	if !stataddr(&nam, nl) {
 		goto no
 	}
 
@@ -1562,7 +1559,7 @@
 	}
 
 yes:
-	return 1
+	return true
 
 slice:
 	gused(nil) // in case the data is the dest of a goto
@@ -1598,5 +1595,5 @@
 		Fatal("gen_as_init couldnt make data statement")
 	}
 
-	return 0
+	return false
 }
diff --git a/src/cmd/internal/gc/subr.go b/src/cmd/internal/gc/subr.go
index c28bfbd..c8e613c 100644
--- a/src/cmd/internal/gc/subr.go
+++ b/src/cmd/internal/gc/subr.go
@@ -119,7 +119,7 @@
 
 	hcrash()
 	nerrors++
-	if nsavederrors+nerrors >= 10 && !(Debug['e'] != 0) {
+	if nsavederrors+nerrors >= 10 && Debug['e'] == 0 {
 		Flusherrors()
 		fmt.Printf("%v: too many errors\n", Ctxt.Line(line))
 		errorexit()
@@ -192,7 +192,7 @@
 
 	hcrash()
 	nerrors++
-	if nsavederrors+nerrors >= 10 && !(Debug['e'] != 0) {
+	if nsavederrors+nerrors >= 10 && Debug['e'] == 0 {
 		Flusherrors()
 		fmt.Printf("%v: too many errors\n", Ctxt.Line(parserline()))
 		errorexit()
@@ -248,7 +248,7 @@
 		fmt.Printf(" at line %v\n", Ctxt.Line(int(lexlineno)))
 	}
 
-	if off < 0 && file[0] != '/' && !(relative != 0) {
+	if off < 0 && file[0] != '/' && relative == 0 {
 		file = fmt.Sprintf("%s/%s", Ctxt.Pathname, file)
 	}
 	obj.Linklinehist(Ctxt, int(lexlineno), file, int(off))
@@ -384,6 +384,26 @@
 	}
 }
 
+func gethunk() {
+	var h string
+	var nh int32
+
+	nh = NHUNK
+	if thunk >= 10*NHUNK {
+		nh = 10 * NHUNK
+	}
+	h = string(make([]byte, nh))
+	if h == "" {
+		Flusherrors()
+		Yyerror("out of memory")
+		errorexit()
+	}
+
+	hunk = h
+	nhunk = nh
+	thunk += nh
+}
+
 func Nod(op int, nleft *Node, nright *Node) *Node {
 	var n *Node
 
@@ -412,14 +432,14 @@
 // ispaddedfield reports whether the given field
 // is followed by padding. For the case where t is
 // the last field, total gives the size of the enclosing struct.
-func ispaddedfield(t *Type, total int64) int {
+func ispaddedfield(t *Type, total int64) bool {
 	if t.Etype != TFIELD {
 		Fatal("ispaddedfield called non-field %v", Tconv(t, 0))
 	}
 	if t.Down == nil {
-		return bool2int(t.Width+t.Type.Width != total)
+		return t.Width+t.Type.Width != total
 	}
-	return bool2int(t.Width+t.Type.Width != t.Down.Width)
+	return t.Width+t.Type.Width != t.Down.Width
 }
 
 func algtype1(t *Type, bad **Type) int {
@@ -486,13 +506,13 @@
 		return ASTRING
 
 	case TINTER:
-		if isnilinter(t) != 0 {
+		if isnilinter(t) {
 			return ANILINTER
 		}
 		return AINTER
 
 	case TARRAY:
-		if Isslice(t) != 0 {
+		if Isslice(t) {
 			if bad != nil {
 				*bad = t
 			}
@@ -526,7 +546,7 @@
 
 			// Blank fields, padded fields, fields with non-memory
 			// equality need special compare.
-			if a != AMEM || isblanksym(t1.Sym) || ispaddedfield(t1, t.Width) != 0 {
+			if a != AMEM || isblanksym(t1.Sym) || ispaddedfield(t1, t.Width) {
 				ret = -1
 				continue
 			}
@@ -544,7 +564,7 @@
 
 	a = algtype1(t, nil)
 	if a == AMEM || a == ANOEQ {
-		if Isslice(t) != 0 {
+		if Isslice(t) {
 			return ASLICE
 		}
 		switch t.Width {
@@ -687,7 +707,7 @@
 	for {
 		tmp11 := i
 		i--
-		if !(tmp11 > 0) {
+		if tmp11 <= 0 {
 			break
 		}
 		a[i].Down = f
@@ -748,12 +768,12 @@
 	return c
 }
 
-func Nodbool(b int) *Node {
+func Nodbool(b bool) *Node {
 	var c *Node
 
 	c = Nodintconst(0)
 	c.Val.Ctype = CTBOOL
-	c.Val.U.Bval = int16(b)
+	c.Val.U.Bval = int16(bool2int(b))
 	c.Type = idealbool
 	return c
 }
@@ -829,46 +849,46 @@
 	return m
 }
 
-func isnil(n *Node) int {
+func isnil(n *Node) bool {
 	if n == nil {
-		return 0
+		return false
 	}
 	if n.Op != OLITERAL {
-		return 0
+		return false
 	}
 	if n.Val.Ctype != CTNIL {
-		return 0
+		return false
 	}
-	return 1
+	return true
 }
 
-func isptrto(t *Type, et int) int {
+func isptrto(t *Type, et int) bool {
 	if t == nil {
-		return 0
+		return false
 	}
-	if !(Isptr[t.Etype] != 0) {
-		return 0
+	if Isptr[t.Etype] == 0 {
+		return false
 	}
 	t = t.Type
 	if t == nil {
-		return 0
+		return false
 	}
 	if int(t.Etype) != et {
-		return 0
+		return false
 	}
-	return 1
+	return true
 }
 
-func Istype(t *Type, et int) int {
-	return bool2int(t != nil && int(t.Etype) == et)
+func Istype(t *Type, et int) bool {
+	return t != nil && int(t.Etype) == et
 }
 
-func Isfixedarray(t *Type) int {
-	return bool2int(t != nil && t.Etype == TARRAY && t.Bound >= 0)
+func Isfixedarray(t *Type) bool {
+	return t != nil && t.Etype == TARRAY && t.Bound >= 0
 }
 
-func Isslice(t *Type) int {
-	return bool2int(t != nil && t.Etype == TARRAY && t.Bound < 0)
+func Isslice(t *Type) bool {
+	return t != nil && t.Etype == TARRAY && t.Bound < 0
 }
 
 func isblank(n *Node) bool {
@@ -882,34 +902,34 @@
 	return s != nil && s.Name == "_"
 }
 
-func Isinter(t *Type) int {
-	return bool2int(t != nil && t.Etype == TINTER)
+func Isinter(t *Type) bool {
+	return t != nil && t.Etype == TINTER
 }
 
-func isnilinter(t *Type) int {
-	if !(Isinter(t) != 0) {
-		return 0
+func isnilinter(t *Type) bool {
+	if !Isinter(t) {
+		return false
 	}
 	if t.Type != nil {
-		return 0
+		return false
 	}
-	return 1
+	return true
 }
 
-func isideal(t *Type) int {
+func isideal(t *Type) bool {
 	if t == nil {
-		return 0
+		return false
 	}
 	if t == idealstring || t == idealbool {
-		return 1
+		return true
 	}
 	switch t.Etype {
 	case TNIL,
 		TIDEAL:
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
 /*
@@ -938,7 +958,7 @@
 	}
 
 	// check types
-	if !(issimple[t.Etype] != 0) {
+	if issimple[t.Etype] == 0 {
 		switch t.Etype {
 		default:
 			return nil
@@ -979,13 +999,13 @@
 	next *TypePairList
 }
 
-func onlist(l *TypePairList, t1 *Type, t2 *Type) int {
+func onlist(l *TypePairList, t1 *Type, t2 *Type) bool {
 	for ; l != nil; l = l.next {
 		if (l.t1 == t1 && l.t2 == t2) || (l.t1 == t2 && l.t2 == t1) {
-			return 1
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
 // Return 1 if t1 and t2 are identical, following the spec rules.
@@ -995,17 +1015,17 @@
 // pointer (t1 == t2), so there's no chance of chasing cycles
 // ad infinitum, so no need for a depth counter.
 func Eqtype(t1 *Type, t2 *Type) bool {
-	return eqtype1(t1, t2, nil) != 0
+	return eqtype1(t1, t2, nil)
 }
 
-func eqtype1(t1 *Type, t2 *Type, assumed_equal *TypePairList) int {
+func eqtype1(t1 *Type, t2 *Type, assumed_equal *TypePairList) bool {
 	var l TypePairList
 
 	if t1 == t2 {
-		return 1
+		return true
 	}
 	if t1 == nil || t2 == nil || t1.Etype != t2.Etype {
-		return 0
+		return false
 	}
 	if t1.Sym != nil || t2.Sym != nil {
 		// Special case: we keep byte and uint8 separate
@@ -1013,21 +1033,21 @@
 		switch t1.Etype {
 		case TUINT8:
 			if (t1 == Types[TUINT8] || t1 == bytetype) && (t2 == Types[TUINT8] || t2 == bytetype) {
-				return 1
+				return true
 			}
 
 		case TINT,
 			TINT32:
 			if (t1 == Types[runetype.Etype] || t1 == runetype) && (t2 == Types[runetype.Etype] || t2 == runetype) {
-				return 1
+				return true
 			}
 		}
 
-		return 0
+		return false
 	}
 
-	if onlist(assumed_equal, t1, t2) != 0 {
-		return 1
+	if onlist(assumed_equal, t1, t2) {
+		return true
 	}
 	l.next = assumed_equal
 	l.t1 = t1
@@ -1042,7 +1062,7 @@
 			if t1.Etype != TFIELD || t2.Etype != TFIELD {
 				Fatal("struct/interface missing field: %v %v", Tconv(t1, 0), Tconv(t2, 0))
 			}
-			if t1.Sym != t2.Sym || t1.Embedded != t2.Embedded || !(eqtype1(t1.Type, t2.Type, &l) != 0) || !eqnote(t1.Note, t2.Note) {
+			if t1.Sym != t2.Sym || t1.Embedded != t2.Embedded || !eqtype1(t1.Type, t2.Type, &l) || !eqnote(t1.Note, t2.Note) {
 				goto no
 			}
 		}
@@ -1071,7 +1091,7 @@
 				if ta.Etype != TFIELD || tb.Etype != TFIELD {
 					Fatal("func struct missing field: %v %v", Tconv(ta, 0), Tconv(tb, 0))
 				}
-				if ta.Isddd != tb.Isddd || !(eqtype1(ta.Type, tb.Type, &l) != 0) {
+				if ta.Isddd != tb.Isddd || !eqtype1(ta.Type, tb.Type, &l) {
 					goto no
 				}
 			}
@@ -1097,34 +1117,34 @@
 		}
 	}
 
-	if eqtype1(t1.Down, t2.Down, &l) != 0 && eqtype1(t1.Type, t2.Type, &l) != 0 {
+	if eqtype1(t1.Down, t2.Down, &l) && eqtype1(t1.Type, t2.Type, &l) {
 		goto yes
 	}
 	goto no
 
 yes:
-	return 1
+	return true
 
 no:
-	return 0
+	return false
 }
 
 // Are t1 and t2 equal struct types when field names are ignored?
 // For deciding whether the result struct from g can be copied
 // directly when compiling f(g()).
-func eqtypenoname(t1 *Type, t2 *Type) int {
+func eqtypenoname(t1 *Type, t2 *Type) bool {
 	if t1 == nil || t2 == nil || t1.Etype != TSTRUCT || t2.Etype != TSTRUCT {
-		return 0
+		return false
 	}
 
 	t1 = t1.Type
 	t2 = t2.Type
 	for {
 		if !Eqtype(t1, t2) {
-			return 0
+			return false
 		}
 		if t1 == nil {
-			return 1
+			return true
 		}
 		t1 = t1.Down
 		t2 = t2.Down
@@ -1167,13 +1187,13 @@
 	// both are empty interface types.
 	// For assignable but different non-empty interface types,
 	// we want to recompute the itab.
-	if Eqtype(src.Orig, dst.Orig) && (src.Sym == nil || dst.Sym == nil || isnilinter(src) != 0) {
+	if Eqtype(src.Orig, dst.Orig) && (src.Sym == nil || dst.Sym == nil || isnilinter(src)) {
 		return OCONVNOP
 	}
 
 	// 3. dst is an interface type and src implements dst.
 	if dst.Etype == TINTER && src.Etype != TNIL {
-		if implements(src, dst, &missing, &have, &ptr) != 0 {
+		if implements(src, dst, &missing, &have, &ptr) {
 			return OCONVIFACE
 		}
 
@@ -1183,9 +1203,9 @@
 		}
 
 		if why != nil {
-			if isptrto(src, TINTER) != 0 {
+			if isptrto(src, TINTER) {
 				*why = fmt.Sprintf(":\n\t%v is pointer to interface, not interface", Tconv(src, 0))
-			} else if have != nil && have.Sym == missing.Sym && have.Nointerface != 0 {
+			} else if have != nil && have.Sym == missing.Sym && have.Nointerface {
 				*why = fmt.Sprintf(":\n\t%v does not implement %v (%v method is marked 'nointerface')", Tconv(src, 0), Tconv(dst, 0), Sconv(missing.Sym, 0))
 			} else if have != nil && have.Sym == missing.Sym {
 				*why = fmt.Sprintf(":\n\t%v does not implement %v (wrong type for %v method)\n"+"\t\thave %v%v\n\t\twant %v%v", Tconv(src, 0), Tconv(dst, 0), Sconv(missing.Sym, 0), Sconv(have.Sym, 0), Tconv(have.Type, obj.FmtShort|obj.FmtByte), Sconv(missing.Sym, 0), Tconv(missing.Type, obj.FmtShort|obj.FmtByte))
@@ -1201,7 +1221,7 @@
 		return 0
 	}
 
-	if isptrto(dst, TINTER) != 0 {
+	if isptrto(dst, TINTER) {
 		if why != nil {
 			*why = fmt.Sprintf(":\n\t%v is pointer to interface, not interface", Tconv(dst, 0))
 		}
@@ -1209,7 +1229,7 @@
 	}
 
 	if src.Etype == TINTER && dst.Etype != TBLANK {
-		if why != nil && implements(dst, src, &missing, &have, &ptr) != 0 {
+		if why != nil && implements(dst, src, &missing, &have, &ptr) {
 			*why = ": need type assertion"
 		}
 		return 0
@@ -1322,7 +1342,7 @@
 		return ORUNESTR
 	}
 
-	if Isslice(src) != 0 && dst.Etype == TSTRING {
+	if Isslice(src) && dst.Etype == TSTRING {
 		if src.Type.Etype == bytetype.Etype {
 			return OARRAYBYTESTR
 		}
@@ -1333,7 +1353,7 @@
 
 	// 7. src is a string and dst is []byte or []rune.
 	// String to slice.
-	if src.Etype == TSTRING && Isslice(dst) != 0 {
+	if src.Etype == TSTRING && Isslice(dst) {
 		if dst.Type.Etype == bytetype.Etype {
 			return OSTRARRAYBYTE
 		}
@@ -1408,23 +1428,23 @@
 	return r
 }
 
-func subtype(stp **Type, t *Type, d int) int {
+func subtype(stp **Type, t *Type, d int) bool {
 	var st *Type
 
 loop:
 	st = *stp
 	if st == nil {
-		return 0
+		return false
 	}
 
 	d++
 	if d >= 10 {
-		return 0
+		return false
 	}
 
 	switch st.Etype {
 	default:
-		return 0
+		return false
 
 	case TPTR32,
 		TPTR64,
@@ -1434,13 +1454,13 @@
 		goto loop
 
 	case TANY:
-		if !(st.Copyany != 0) {
-			return 0
+		if st.Copyany == 0 {
+			return false
 		}
 		*stp = t
 
 	case TMAP:
-		if subtype(&st.Down, t, d) != 0 {
+		if subtype(&st.Down, t, d) {
 			break
 		}
 		stp = &st.Type
@@ -1448,51 +1468,51 @@
 
 	case TFUNC:
 		for {
-			if subtype(&st.Type, t, d) != 0 {
+			if subtype(&st.Type, t, d) {
 				break
 			}
-			if subtype(&st.Type.Down.Down, t, d) != 0 {
+			if subtype(&st.Type.Down.Down, t, d) {
 				break
 			}
-			if subtype(&st.Type.Down, t, d) != 0 {
+			if subtype(&st.Type.Down, t, d) {
 				break
 			}
-			return 0
+			return false
 		}
 
 	case TSTRUCT:
 		for st = st.Type; st != nil; st = st.Down {
-			if subtype(&st.Type, t, d) != 0 {
-				return 1
+			if subtype(&st.Type, t, d) {
+				return true
 			}
 		}
-		return 0
+		return false
 	}
 
-	return 1
+	return true
 }
 
 /*
  * Is this a 64-bit type?
  */
-func Is64(t *Type) int {
+func Is64(t *Type) bool {
 	if t == nil {
-		return 0
+		return false
 	}
 	switch Simtype[t.Etype] {
 	case TINT64,
 		TUINT64,
 		TPTR64:
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
 /*
  * Is a conversion between t1 and t2 a no-op?
  */
-func Noconv(t1 *Type, t2 *Type) int {
+func Noconv(t1 *Type, t2 *Type) bool {
 	var e1 int
 	var e2 int
 
@@ -1502,35 +1522,35 @@
 	switch e1 {
 	case TINT8,
 		TUINT8:
-		return bool2int(e2 == TINT8 || e2 == TUINT8)
+		return e2 == TINT8 || e2 == TUINT8
 
 	case TINT16,
 		TUINT16:
-		return bool2int(e2 == TINT16 || e2 == TUINT16)
+		return e2 == TINT16 || e2 == TUINT16
 
 	case TINT32,
 		TUINT32,
 		TPTR32:
-		return bool2int(e2 == TINT32 || e2 == TUINT32 || e2 == TPTR32)
+		return e2 == TINT32 || e2 == TUINT32 || e2 == TPTR32
 
 	case TINT64,
 		TUINT64,
 		TPTR64:
-		return bool2int(e2 == TINT64 || e2 == TUINT64 || e2 == TPTR64)
+		return e2 == TINT64 || e2 == TUINT64 || e2 == TPTR64
 
 	case TFLOAT32:
-		return bool2int(e2 == TFLOAT32)
+		return e2 == TFLOAT32
 
 	case TFLOAT64:
-		return bool2int(e2 == TFLOAT64)
+		return e2 == TFLOAT64
 	}
 
-	return 0
+	return false
 }
 
 func argtype(on *Node, t *Type) {
 	dowidth(t)
-	if !(subtype(&on.Type, t, 0) != 0) {
+	if !subtype(&on.Type, t, 0) {
 		Fatal("argtype: failed %v %v\n", Nconv(on, 0), Tconv(t, 0))
 	}
 }
@@ -1607,7 +1627,7 @@
 		Fatal("syslook: can't find runtime.%s", name)
 	}
 
-	if !(copy != 0) {
+	if copy == 0 {
 		return s.Def
 	}
 
@@ -1886,7 +1906,7 @@
 	var fp *Type
 
 	fp = structnext(s)
-	if fp == nil && !(s.Done != 0) {
+	if fp == nil && s.Done == 0 {
 		s.Done = 1
 		fp = Structfirst(s, getinarg(s.Tfunc))
 	}
@@ -2039,7 +2059,7 @@
 	}
 
 	// make a copy; must not be used as an lvalue
-	if islvalue(n) != 0 {
+	if islvalue(n) {
 		Fatal("missing lvalue case in safeexpr: %v", Nconv(n, 0))
 	}
 	return cheapexpr(n, init)
@@ -2077,7 +2097,7 @@
  * assignment to it.
  */
 func localexpr(n *Node, t *Type, init **NodeList) *Node {
-	if n.Op == ONAME && (!(n.Addrtaken != 0) || strings.HasPrefix(n.Sym.Name, "autotmp_")) && (n.Class == PAUTO || n.Class == PPARAM || n.Class == PPARAMOUT) && convertop(n.Type, t, nil) == OCONVNOP {
+	if n.Op == ONAME && (n.Addrtaken == 0 || strings.HasPrefix(n.Sym.Name, "autotmp_")) && (n.Class == PAUTO || n.Class == PPARAM || n.Class == PPARAMOUT) && convertop(n.Type, t, nil) == OCONVNOP {
 		return n
 	}
 
@@ -2182,7 +2202,7 @@
 
 	d--
 	for f = u.Type; f != nil; f = f.Down {
-		if !(f.Embedded != 0) {
+		if f.Embedded == 0 {
 			continue
 		}
 		if f.Sym == nil {
@@ -2343,7 +2363,7 @@
 	}
 
 	for f = u.Type; f != nil; f = f.Down {
-		if !(f.Embedded != 0) {
+		if f.Embedded == 0 {
 			continue
 		}
 		if f.Sym == nil {
@@ -2583,10 +2603,10 @@
 	dot = adddot(Nod(OXDOT, this.Left, newname(method.Sym)))
 
 	// generate call
-	if !(flag_race != 0) && Isptr[rcvr.Etype] != 0 && Isptr[methodrcvr.Etype] != 0 && method.Embedded != 0 && !(isifacemethod(method.Type) != 0) {
+	if flag_race == 0 && Isptr[rcvr.Etype] != 0 && Isptr[methodrcvr.Etype] != 0 && method.Embedded != 0 && !isifacemethod(method.Type) {
 		// generate tail call: adjust pointer receiver and jump to embedded method.
 		dot = dot.Left // skip final .M
-		if !(Isptr[dotlist[0].field.Type.Etype] != 0) {
+		if Isptr[dotlist[0].field.Type.Etype] == 0 {
 			dot = Nod(OADDR, dot, nil)
 		}
 		as = Nod(OAS, this.Left, Nod(OCONVNOP, dot, nil))
@@ -2625,7 +2645,7 @@
 
 	// Set inl_nonlocal to whether we are calling a method on a
 	// type defined in a different package.  Checked in inlvar.
-	if !(methodrcvr.Local != 0) {
+	if methodrcvr.Local == 0 {
 		inl_nonlocal = 1
 	}
 
@@ -2666,7 +2686,6 @@
 	switch a {
 	case AMEM:
 		Fatal("hashfor with AMEM type")
-		fallthrough
 
 	case AINTER:
 		sym = Pkglookup("interhash", Runtimepkg)
@@ -2760,10 +2779,9 @@
 	switch t.Etype {
 	default:
 		Fatal("genhash %v", Tconv(t, 0))
-		fallthrough
 
 	case TARRAY:
-		if Isslice(t) != 0 {
+		if Isslice(t) {
 			Fatal("genhash %v", Tconv(t, 0))
 		}
 
@@ -2798,7 +2816,7 @@
 		call = Nod(OCALL, hashel, nil)
 
 		nx = Nod(OINDEX, np, ni)
-		nx.Bounded = 1
+		nx.Bounded = true
 		na = Nod(OADDR, nx, nil)
 		na.Etype = 1 // no escape to heap
 		call.List = list(call.List, na)
@@ -2821,7 +2839,7 @@
 				}
 
 				// If it's a memory field but it's padded, stop here.
-				if ispaddedfield(t1, t.Width) != 0 {
+				if ispaddedfield(t1, t.Width) {
 					t1 = t1.Down
 				} else {
 					continue
@@ -2924,7 +2942,7 @@
 	nif = Nod(OIF, nil, nil)
 	nif.Ntest = Nod(ONE, nx, ny)
 	r = Nod(ORETURN, nil, nil)
-	r.List = list(r.List, Nodbool(0))
+	r.List = list(r.List, Nodbool(false))
 	nif.Nbody = list(nif.Nbody, r)
 	return nif
 }
@@ -2981,7 +2999,7 @@
 	nif.Ninit = list(nif.Ninit, call)
 	nif.Ntest = Nod(ONOT, call, nil)
 	r = Nod(ORETURN, nil, nil)
-	r.List = list(r.List, Nodbool(0))
+	r.List = list(r.List, Nodbool(false))
 	nif.Nbody = list(nif.Nbody, r)
 	return nif
 }
@@ -3040,10 +3058,9 @@
 	switch t.Etype {
 	default:
 		Fatal("geneq %v", Tconv(t, 0))
-		fallthrough
 
 	case TARRAY:
-		if Isslice(t) != 0 {
+		if Isslice(t) {
 			Fatal("geneq %v", Tconv(t, 0))
 		}
 
@@ -3064,14 +3081,14 @@
 		// if p[i] != q[i] { return false }
 		nx = Nod(OINDEX, np, ni)
 
-		nx.Bounded = 1
+		nx.Bounded = true
 		ny = Nod(OINDEX, nq, ni)
-		ny.Bounded = 1
+		ny.Bounded = true
 
 		nif = Nod(OIF, nil, nil)
 		nif.Ntest = Nod(ONE, nx, ny)
 		r = Nod(ORETURN, nil, nil)
-		r.List = list(r.List, Nodbool(0))
+		r.List = list(r.List, Nodbool(false))
 		nif.Nbody = list(nif.Nbody, r)
 		nrange.Nbody = list(nrange.Nbody, nif)
 		fn.Nbody = list(fn.Nbody, nrange)
@@ -3091,7 +3108,7 @@
 				}
 
 				// If it's a memory field but it's padded, stop here.
-				if ispaddedfield(t1, t.Width) != 0 {
+				if ispaddedfield(t1, t.Width) {
 					t1 = t1.Down
 				} else {
 					continue
@@ -3134,7 +3151,7 @@
 	// return true
 	r = Nod(ORETURN, nil, nil)
 
-	r.List = list(r.List, Nodbool(1))
+	r.List = list(r.List, Nodbool(true))
 	fn.Nbody = list(fn.Nbody, r)
 
 	if Debug['r'] != 0 {
@@ -3199,7 +3216,7 @@
 	return nil
 }
 
-func implements(t *Type, iface *Type, m **Type, samename **Type, ptr *int) int {
+func implements(t *Type, iface *Type, m **Type, samename **Type, ptr *int) bool {
 	var t0 *Type
 	var im *Type
 	var tm *Type
@@ -3209,7 +3226,7 @@
 
 	t0 = t
 	if t == nil {
-		return 0
+		return false
 	}
 
 	// if this is too slow,
@@ -3226,18 +3243,18 @@
 					*m = im
 					*samename = tm
 					*ptr = 0
-					return 0
+					return false
 				}
 			}
 
 			*m = im
 			*samename = nil
 			*ptr = 0
-			return 0
+			return false
 		found:
 		}
 
-		return 1
+		return true
 	}
 
 	t = methtype(t, 0)
@@ -3247,21 +3264,21 @@
 	for im = iface.Type; im != nil; im = im.Down {
 		imtype = methodfunc(im.Type, nil)
 		tm = ifacelookdot(im.Sym, t, &followptr, 0)
-		if tm == nil || tm.Nointerface != 0 || !Eqtype(methodfunc(tm.Type, nil), imtype) {
+		if tm == nil || tm.Nointerface || !Eqtype(methodfunc(tm.Type, nil), imtype) {
 			if tm == nil {
 				tm = ifacelookdot(im.Sym, t, &followptr, 1)
 			}
 			*m = im
 			*samename = tm
 			*ptr = 0
-			return 0
+			return false
 		}
 
 		// if pointer receiver in method,
 		// the method does not exist for value types.
 		rcvr = getthisx(tm.Type).Type.Type
 
-		if Isptr[rcvr.Etype] != 0 && !(Isptr[t0.Etype] != 0) && !(followptr != 0) && !(isifacemethod(tm.Type) != 0) {
+		if Isptr[rcvr.Etype] != 0 && Isptr[t0.Etype] == 0 && followptr == 0 && !isifacemethod(tm.Type) {
 			if false && Debug['r'] != 0 {
 				Yyerror("interface pointer mismatch")
 			}
@@ -3269,11 +3286,11 @@
 			*m = im
 			*samename = nil
 			*ptr = 1
-			return 0
+			return false
 		}
 	}
 
-	return 1
+	return true
 }
 
 /*
@@ -3470,7 +3487,7 @@
 	if n == nil || n.Op != OLITERAL || n.Type == nil {
 		goto no
 	}
-	if !(Isint[n.Type.Etype] != 0) {
+	if Isint[n.Type.Etype] == 0 {
 		goto no
 	}
 
@@ -3483,7 +3500,7 @@
 		b = b << 1
 	}
 
-	if !(Issigned[n.Type.Etype] != 0) {
+	if Issigned[n.Type.Etype] == 0 {
 		goto no
 	}
 
@@ -3895,7 +3912,7 @@
 func checknil(x *Node, init **NodeList) {
 	var n *Node
 
-	if Isinter(x.Type) != 0 {
+	if Isinter(x.Type) {
 		x = Nod(OITAB, x, nil)
 		typecheck(&x, Erv)
 	}
@@ -3909,7 +3926,7 @@
  * Can this type be stored directly in an interface word?
  * Yes, if the representation is a single pointer.
  */
-func isdirectiface(t *Type) int {
+func isdirectiface(t *Type) bool {
 	switch t.Etype {
 	case TPTR32,
 		TPTR64,
@@ -3917,16 +3934,16 @@
 		TMAP,
 		TFUNC,
 		TUNSAFEPTR:
-		return 1
+		return true
 
 		// Array of 1 direct iface type can be direct.
 	case TARRAY:
-		return bool2int(t.Bound == 1 && isdirectiface(t.Type) != 0)
+		return t.Bound == 1 && isdirectiface(t.Type)
 
 		// Struct with 1 field of direct iface type can be direct.
 	case TSTRUCT:
-		return bool2int(t.Type != nil && t.Type.Down == nil && isdirectiface(t.Type.Type) != 0)
+		return t.Type != nil && t.Type.Down == nil && isdirectiface(t.Type.Type)
 	}
 
-	return 0
+	return false
 }
diff --git a/src/cmd/internal/gc/swt.go b/src/cmd/internal/gc/swt.go
index cf1f7d4..7c25041 100644
--- a/src/cmd/internal/gc/swt.go
+++ b/src/cmd/internal/gc/swt.go
@@ -281,7 +281,7 @@
 	var go_ *Node
 	var br *Node
 	var lno int32
-	var needvar int32
+	var needvar bool
 
 	if sw.List == nil {
 		return
@@ -301,7 +301,7 @@
 			Fatal("casebody %v", Oconv(int(n.Op), 0))
 		}
 		n.Op = OCASE
-		needvar = int32(bool2int(count(n.List) != 1 || n.List.N.Op == OLITERAL))
+		needvar = count(n.List) != 1 || n.List.N.Op == OLITERAL
 
 		go_ = Nod(OGOTO, newlabel_swt(), nil)
 		if n.List == nil {
@@ -332,7 +332,7 @@
 		}
 
 		stat = list(stat, Nod(OLABEL, go_.Left, nil))
-		if typeswvar != nil && needvar != 0 && n.Nname != nil {
+		if typeswvar != nil && needvar && n.Nname != nil {
 			var l *NodeList
 
 			l = list1(Nod(ODCL, n.Nname, nil))
@@ -410,7 +410,7 @@
 				continue
 			}
 
-			if Istype(n.Left.Type, TINTER) != 0 {
+			if Istype(n.Left.Type, TINTER) {
 				c.type_ = Ttypevar
 				continue
 			}
@@ -552,7 +552,7 @@
 	casebody(sw, nil)
 
 	arg = Snorm
-	if Isconst(sw.Ntest, CTBOOL) != 0 {
+	if Isconst(sw.Ntest, CTBOOL) {
 		arg = Strue
 		if sw.Ntest.Val.U.Bval == 0 {
 			arg = Sfalse
@@ -572,7 +572,7 @@
 
 	cas = nil
 	if arg == Strue || arg == Sfalse {
-		exprname = Nodbool(bool2int(arg == Strue))
+		exprname = Nodbool(arg == Strue)
 	} else if consttype(sw.Ntest) >= 0 {
 		// leave constants to enable dead code elimination (issue 9608)
 		exprname = sw.Ntest
@@ -600,7 +600,7 @@
 	}
 
 	// deal with the variables one-at-a-time
-	if !(okforcmp[t.Etype] != 0) || c0.type_ != Texprconst {
+	if okforcmp[t.Etype] == 0 || c0.type_ != Texprconst {
 		a = exprbsw(c0, 1, arg)
 		cas = list(cas, a)
 		c0 = c0.link
@@ -738,7 +738,7 @@
 	}
 
 	walkexpr(&sw.Ntest.Right, &sw.Ninit)
-	if !(Istype(sw.Ntest.Right.Type, TINTER) != 0) {
+	if !Istype(sw.Ntest.Right.Type, TINTER) {
 		Yyerror("type switch must be on an interface")
 		return
 	}
@@ -764,7 +764,7 @@
 	typecheck(&hashname, Erv)
 
 	t = sw.Ntest.Right.Type
-	if isnilinter(t) != 0 {
+	if isnilinter(t) {
 		a = syslook("efacethash", 1)
 	} else {
 		a = syslook("ifacethash", 1)
@@ -871,7 +871,7 @@
 	 * both have inserted OBREAK statements
 	 */
 	if sw.Ntest == nil {
-		sw.Ntest = Nodbool(1)
+		sw.Ntest = Nodbool(true)
 		typecheck(&sw.Ntest, Erv)
 	}
 
@@ -933,11 +933,11 @@
 			t = Types[TBOOL]
 		}
 		if t != nil {
-			if !(okforeq[t.Etype] != 0) {
+			if okforeq[t.Etype] == 0 {
 				Yyerror("cannot switch on %v", Nconv(n.Ntest, obj.FmtLong))
-			} else if t.Etype == TARRAY && !(Isfixedarray(t) != 0) {
+			} else if t.Etype == TARRAY && !Isfixedarray(t) {
 				nilonly = "slice"
-			} else if t.Etype == TARRAY && Isfixedarray(t) != 0 && algtype1(t, nil) == ANOEQ {
+			} else if t.Etype == TARRAY && Isfixedarray(t) && algtype1(t, nil) == ANOEQ {
 				Yyerror("cannot switch on %v", Nconv(n.Ntest, obj.FmtLong))
 			} else if t.Etype == TSTRUCT && algtype1(t, &badtype) == ANOEQ {
 				Yyerror("cannot switch on %v (struct containing %v cannot be compared)", Nconv(n.Ntest, obj.FmtLong), Tconv(badtype, 0))
@@ -976,27 +976,27 @@
 
 					if ll.N.Op == OTYPE {
 						Yyerror("type %v is not an expression", Tconv(ll.N.Type, 0))
-					} else if ll.N.Type != nil && !(assignop(ll.N.Type, t, nil) != 0) && !(assignop(t, ll.N.Type, nil) != 0) {
+					} else if ll.N.Type != nil && assignop(ll.N.Type, t, nil) == 0 && assignop(t, ll.N.Type, nil) == 0 {
 						if n.Ntest != nil {
 							Yyerror("invalid case %v in switch on %v (mismatched types %v and %v)", Nconv(ll.N, 0), Nconv(n.Ntest, 0), Tconv(ll.N.Type, 0), Tconv(t, 0))
 						} else {
 							Yyerror("invalid case %v in switch (mismatched types %v and bool)", Nconv(ll.N, 0), Tconv(ll.N.Type, 0))
 						}
-					} else if nilonly != "" && !(Isconst(ll.N, CTNIL) != 0) {
+					} else if nilonly != "" && !Isconst(ll.N, CTNIL) {
 						Yyerror("invalid case %v in switch (can only compare %s %v to nil)", Nconv(ll.N, 0), nilonly, Nconv(n.Ntest, 0))
 					}
 
 				case Etype: // type switch
-					if ll.N.Op == OLITERAL && Istype(ll.N.Type, TNIL) != 0 {
+					if ll.N.Op == OLITERAL && Istype(ll.N.Type, TNIL) {
 					} else if ll.N.Op != OTYPE && ll.N.Type != nil { // should this be ||?
 						Yyerror("%v is not a type", Nconv(ll.N, obj.FmtLong))
 
 						// reset to original type
 						ll.N = n.Ntest.Right
-					} else if ll.N.Type.Etype != TINTER && t.Etype == TINTER && !(implements(ll.N.Type, t, &missing, &have, &ptr) != 0) {
-						if have != nil && !(missing.Broke != 0) && !(have.Broke != 0) {
+					} else if ll.N.Type.Etype != TINTER && t.Etype == TINTER && !implements(ll.N.Type, t, &missing, &have, &ptr) {
+						if have != nil && missing.Broke == 0 && have.Broke == 0 {
 							Yyerror("impossible type switch case: %v cannot have dynamic type %v"+" (wrong type for %v method)\n\thave %v%v\n\twant %v%v", Nconv(n.Ntest.Right, obj.FmtLong), Tconv(ll.N.Type, 0), Sconv(missing.Sym, 0), Sconv(have.Sym, 0), Tconv(have.Type, obj.FmtShort), Sconv(missing.Sym, 0), Tconv(missing.Type, obj.FmtShort))
-						} else if !(missing.Broke != 0) {
+						} else if missing.Broke == 0 {
 							Yyerror("impossible type switch case: %v cannot have dynamic type %v"+" (missing %v method)", Nconv(n.Ntest.Right, obj.FmtLong), Tconv(ll.N.Type, 0), Sconv(missing.Sym, 0))
 						}
 					}
@@ -1008,7 +1008,7 @@
 			ll = ncase.List
 			nvar = ncase.Nname
 			if nvar != nil {
-				if ll != nil && ll.Next == nil && ll.N.Type != nil && !(Istype(ll.N.Type, TNIL) != 0) {
+				if ll != nil && ll.Next == nil && ll.N.Type != nil && !Istype(ll.N.Type, TNIL) {
 					// single entry type switch
 					nvar.Ntype = typenod(ll.N.Type)
 				} else {
diff --git a/src/cmd/internal/gc/typecheck.go b/src/cmd/internal/gc/typecheck.go
index 9bba6e7..3cd7408 100644
--- a/src/cmd/internal/gc/typecheck.go
+++ b/src/cmd/internal/gc/typecheck.go
@@ -83,7 +83,7 @@
 	var et int
 	var s string
 
-	if Isslice(t) != 0 {
+	if Isslice(t) {
 		return "slice"
 	}
 	et = int(t.Etype)
@@ -133,7 +133,7 @@
 	var l *NodeList
 
 	// cannot type check until all the source has been parsed
-	if !(typecheckok != 0) {
+	if typecheckok == 0 {
 		Fatal("early typecheck")
 	}
 
@@ -233,9 +233,9 @@
 /*
  * does n contain a call or receive operation?
  */
-func callrecv(n *Node) int {
+func callrecv(n *Node) bool {
 	if n == nil {
-		return 0
+		return false
 	}
 
 	switch n.Op {
@@ -250,19 +250,19 @@
 		ONEW,
 		OAPPEND,
 		ODELETE:
-		return 1
+		return true
 	}
 
-	return bool2int(callrecv(n.Left) != 0 || callrecv(n.Right) != 0 || callrecv(n.Ntest) != 0 || callrecv(n.Nincr) != 0 || callrecvlist(n.Ninit) != 0 || callrecvlist(n.Nbody) != 0 || callrecvlist(n.Nelse) != 0 || callrecvlist(n.List) != 0 || callrecvlist(n.Rlist) != 0)
+	return callrecv(n.Left) || callrecv(n.Right) || callrecv(n.Ntest) || callrecv(n.Nincr) || callrecvlist(n.Ninit) || callrecvlist(n.Nbody) || callrecvlist(n.Nelse) || callrecvlist(n.List) || callrecvlist(n.Rlist)
 }
 
-func callrecvlist(l *NodeList) int {
+func callrecvlist(l *NodeList) bool {
 	for ; l != nil; l = l.Next {
-		if callrecv(l.N) != 0 {
-			return 1
+		if callrecv(l.N) {
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
 // indexlit implements typechecking of untyped values as
@@ -273,7 +273,7 @@
 	var n *Node
 
 	n = *np
-	if n == nil || !(isideal(n.Type) != 0) {
+	if n == nil || !isideal(n.Type) {
 		return
 	}
 	switch consttype(n) {
@@ -315,7 +315,7 @@
 	n = *np
 
 	if n.Sym != nil {
-		if n.Op == ONAME && n.Etype != 0 && !(top&Ecall != 0) {
+		if n.Op == ONAME && n.Etype != 0 && top&Ecall == 0 {
 			Yyerror("use of builtin %v not in function call", Sconv(n.Sym, 0))
 			goto error
 		}
@@ -336,7 +336,6 @@
 		Dump("typecheck", n)
 
 		Fatal("typecheck %v", Oconv(int(n.Op), 0))
-		fallthrough
 
 		/*
 		 * names
@@ -362,7 +361,7 @@
 			goto ret
 		}
 
-		if !(top&Easgn != 0) {
+		if top&Easgn == 0 {
 			// not a write to the variable
 			if isblank(n) {
 				Yyerror("cannot use _ as value")
@@ -372,7 +371,7 @@
 			n.Used = 1
 		}
 
-		if !(top&Ecall != 0) && isunsafebuiltin(n) != 0 {
+		if top&Ecall == 0 && isunsafebuiltin(n) {
 			Yyerror("%v is not an expression, must be called", Nconv(n, 0))
 			goto error
 		}
@@ -406,7 +405,7 @@
 			t.Bound = -1 // slice
 		} else if l.Op == ODDD {
 			t.Bound = -100 // to be filled in
-			if !(top&Ecomplit != 0) && !(n.Diag != 0) {
+			if top&Ecomplit == 0 && n.Diag == 0 {
 				t.Broke = 1
 				n.Diag = 1
 				Yyerror("use of [...] array outside of array literal")
@@ -431,7 +430,7 @@
 			}
 
 			t.Bound = Mpgetfix(v.U.Xval)
-			if doesoverflow(v, Types[TINT]) != 0 {
+			if doesoverflow(v, Types[TINT]) {
 				Yyerror("array bound is too large")
 				goto error
 			} else if t.Bound < 0 {
@@ -510,7 +509,7 @@
 	case OIND:
 		ntop = Erv | Etype
 
-		if !(top&Eaddr != 0) { // The *x in &*x is not an indirect.
+		if top&Eaddr == 0 {
 			ntop |= Eindir
 		}
 		ntop |= top & Ecomplit
@@ -527,7 +526,7 @@
 			goto ret
 		}
 
-		if !(Isptr[t.Etype] != 0) {
+		if Isptr[t.Etype] == 0 {
 			if top&(Erv|Etop) != 0 {
 				Yyerror("invalid indirect of %v", Nconv(n.Left, obj.FmtLong))
 				goto error
@@ -593,7 +592,7 @@
 		if t == nil {
 			goto error
 		}
-		if !(okfor[n.Op][t.Etype] != 0) {
+		if okfor[n.Op][t.Etype] == 0 {
 			Yyerror("invalid operation: %v %v", Oconv(int(n.Op), 0), Tconv(t, 0))
 			goto error
 		}
@@ -671,8 +670,8 @@
 		r = n.Right
 
 		if n.Left.Op == OTYPE {
-			if !(looktypedot(n, t, 0) != 0) {
-				if looktypedot(n, t, 1) != 0 {
+			if !looktypedot(n, t, 0) {
+				if looktypedot(n, t, 1) {
 					Yyerror("%v undefined (cannot refer to unexported method %v)", Nconv(n, 0), Sconv(n.Right.Sym, 0))
 				} else {
 					Yyerror("%v undefined (type %v has no method %v)", Nconv(n, 0), Tconv(t, 0), Sconv(n.Right.Sym, 0))
@@ -709,8 +708,8 @@
 			goto error
 		}
 
-		if !(lookdot(n, t, 0) != 0) {
-			if lookdot(n, t, 1) != 0 {
+		if !lookdot(n, t, 0) {
+			if lookdot(n, t, 1) {
 				Yyerror("%v undefined (cannot refer to unexported field or method %v)", Nconv(n, 0), Sconv(n.Right.Sym, 0))
 			} else {
 				Yyerror("%v undefined (type %v has no field or method %v)", Nconv(n, 0), Tconv(n.Left.Type, 0), Sconv(n.Right.Sym, 0))
@@ -743,7 +742,7 @@
 		if t == nil {
 			goto error
 		}
-		if !(Isinter(t) != 0) {
+		if !Isinter(t) {
 			Yyerror("invalid type assertion: %v (non-interface type %v on left)", Nconv(n, 0), Tconv(t, 0))
 			goto error
 		}
@@ -758,7 +757,7 @@
 		}
 
 		if n.Type != nil && n.Type.Etype != TINTER {
-			if !(implements(n.Type, t, &missing, &have, &ptr) != 0) {
+			if !implements(n.Type, t, &missing, &have, &ptr) {
 				if have != nil && have.Sym == missing.Sym {
 					Yyerror("impossible type assertion:\n\t%v does not implement %v (wrong type for %v method)\n"+"\t\thave %v%v\n\t\twant %v%v", Tconv(n.Type, 0), Tconv(t, 0), Sconv(missing.Sym, 0), Sconv(have.Sym, 0), Tconv(have.Type, obj.FmtShort|obj.FmtByte), Sconv(missing.Sym, 0), Tconv(missing.Type, obj.FmtShort|obj.FmtByte))
 				} else if ptr != 0 {
@@ -801,25 +800,25 @@
 			}
 			why = "string"
 			if t.Etype == TARRAY {
-				if Isfixedarray(t) != 0 {
+				if Isfixedarray(t) {
 					why = "array"
 				} else {
 					why = "slice"
 				}
 			}
 
-			if n.Right.Type != nil && !(Isint[n.Right.Type.Etype] != 0) {
+			if n.Right.Type != nil && Isint[n.Right.Type.Etype] == 0 {
 				Yyerror("non-integer %s index %v", why, Nconv(n.Right, 0))
 				break
 			}
 
-			if Isconst(n.Right, CTINT) != 0 {
+			if Isconst(n.Right, CTINT) {
 				x = Mpgetfix(n.Right.Val.U.Xval)
 				if x < 0 {
 					Yyerror("invalid %s index %v (index must be non-negative)", why, Nconv(n.Right, 0))
-				} else if Isfixedarray(t) != 0 && t.Bound > 0 && x >= t.Bound {
+				} else if Isfixedarray(t) && t.Bound > 0 && x >= t.Bound {
 					Yyerror("invalid array index %v (out of bounds for %d-element array)", Nconv(n.Right, 0), t.Bound)
-				} else if Isconst(n.Left, CTSTR) != 0 && x >= int64(len(n.Left.Val.U.Sval.S)) {
+				} else if Isconst(n.Left, CTSTR) && x >= int64(len(n.Left.Val.U.Sval.S)) {
 					Yyerror("invalid string index %v (out of bounds for %d-byte string)", Nconv(n.Right, 0), len(n.Left.Val.U.Sval.S))
 				} else if Mpcmpfixfix(n.Right.Val.U.Xval, Maxintval[TINT]) > 0 {
 					Yyerror("invalid %s index %v (index too large)", why, Nconv(n.Right, 0))
@@ -852,7 +851,7 @@
 			goto error
 		}
 
-		if !(t.Chan&Crecv != 0) {
+		if t.Chan&Crecv == 0 {
 			Yyerror("invalid operation: %v (receive from send-only type %v)", Nconv(n, 0), Tconv(t, 0))
 			goto error
 		}
@@ -875,7 +874,7 @@
 			goto error
 		}
 
-		if !(t.Chan&Csend != 0) {
+		if t.Chan&Csend == 0 {
 			Yyerror("invalid operation: %v (send to receive-only type %v)", Nconv(n, 0), Tconv(t, 0))
 			goto error
 		}
@@ -902,8 +901,8 @@
 		indexlit(&n.Right.Left)
 		indexlit(&n.Right.Right)
 		l = n.Left
-		if Isfixedarray(l.Type) != 0 {
-			if !(islvalue(n.Left) != 0) {
+		if Isfixedarray(l.Type) {
+			if !islvalue(n.Left) {
 				Yyerror("invalid operation %v (slice of unaddressable value)", Nconv(n, 0))
 				goto error
 			}
@@ -919,17 +918,17 @@
 			goto error
 		}
 		tp = nil
-		if Istype(t, TSTRING) != 0 {
+		if Istype(t, TSTRING) {
 			n.Type = t
 			n.Op = OSLICESTR
-		} else if Isptr[t.Etype] != 0 && Isfixedarray(t.Type) != 0 {
+		} else if Isptr[t.Etype] != 0 && Isfixedarray(t.Type) {
 			tp = t.Type
 			n.Type = typ(TARRAY)
 			n.Type.Type = tp.Type
 			n.Type.Bound = -1
 			dowidth(n.Type)
 			n.Op = OSLICEARR
-		} else if Isslice(t) != 0 {
+		} else if Isslice(t) {
 			n.Type = t
 		} else {
 			Yyerror("cannot slice %v (type %v)", Nconv(l, 0), Tconv(t, 0))
@@ -960,8 +959,8 @@
 		indexlit(&n.Right.Right.Left)
 		indexlit(&n.Right.Right.Right)
 		l = n.Left
-		if Isfixedarray(l.Type) != 0 {
-			if !(islvalue(n.Left) != 0) {
+		if Isfixedarray(l.Type) {
+			if !islvalue(n.Left) {
 				Yyerror("invalid operation %v (slice of unaddressable value)", Nconv(n, 0))
 				goto error
 			}
@@ -977,19 +976,19 @@
 			goto error
 		}
 		tp = nil
-		if Istype(t, TSTRING) != 0 {
+		if Istype(t, TSTRING) {
 			Yyerror("invalid operation %v (3-index slice of string)", Nconv(n, 0))
 			goto error
 		}
 
-		if Isptr[t.Etype] != 0 && Isfixedarray(t.Type) != 0 {
+		if Isptr[t.Etype] != 0 && Isfixedarray(t.Type) {
 			tp = t.Type
 			n.Type = typ(TARRAY)
 			n.Type.Type = tp.Type
 			n.Type.Bound = -1
 			dowidth(n.Type)
 			n.Op = OSLICE3ARR
-		} else if Isslice(t) != 0 {
+		} else if Isslice(t) {
 			n.Type = t
 		} else {
 			Yyerror("cannot slice %v (type %v)", Nconv(l, 0), Tconv(t, 0))
@@ -1050,7 +1049,7 @@
 		l = n.Left
 		if l.Op == OTYPE {
 			if n.Isddd != 0 || l.Type.Bound == -100 {
-				if !(l.Type.Broke != 0) {
+				if l.Type.Broke == 0 {
 					Yyerror("invalid use of ... in type conversion", l)
 				}
 				n.Diag = 1
@@ -1070,7 +1069,7 @@
 			goto doconv
 		}
 
-		if count(n.List) == 1 && !(n.Isddd != 0) {
+		if count(n.List) == 1 && n.Isddd == 0 {
 			typecheck(&n.List.N, Erv|Efnstruct)
 		} else {
 			typechecklist(n.List, Erv)
@@ -1127,7 +1126,7 @@
 		}
 
 		// multiple return
-		if !(top&(Efnstruct|Etop) != 0) {
+		if top&(Efnstruct|Etop) == 0 {
 			Yyerror("multiple-value %v() in single-value context", Nconv(l, 0))
 			goto ret
 		}
@@ -1153,21 +1152,21 @@
 		}
 		switch n.Op {
 		case OCAP:
-			if !(okforcap[t.Etype] != 0) {
+			if okforcap[t.Etype] == 0 {
 				goto badcall1
 			}
 
 		case OLEN:
-			if !(okforlen[t.Etype] != 0) {
+			if okforlen[t.Etype] == 0 {
 				goto badcall1
 			}
 
 		case OREAL,
 			OIMAG:
-			if !(Iscomplex[t.Etype] != 0) {
+			if Iscomplex[t.Etype] == 0 {
 				goto badcall1
 			}
-			if Isconst(l, CTCPLX) != 0 {
+			if Isconst(l, CTCPLX) {
 				r = n
 				if n.Op == OREAL {
 					n = nodfltconst(&l.Val.U.Cval.Real)
@@ -1184,7 +1183,7 @@
 		// might be constant
 		switch t.Etype {
 		case TSTRING:
-			if Isconst(l, CTSTR) != 0 {
+			if Isconst(l, CTSTR) {
 				r = Nod(OXXX, nil, nil)
 				Nodconst(r, Types[TINT], int64(len(l.Val.U.Sval.S)))
 				r.Orig = n
@@ -1195,7 +1194,7 @@
 			if t.Bound < 0 { // slice
 				break
 			}
-			if callrecv(l) != 0 { // has call or receive
+			if callrecv(l) { // has call or receive
 				break
 			}
 			r = Nod(OXXX, nil, nil)
@@ -1289,7 +1288,7 @@
 			goto error
 		}
 
-		if !(t.Chan&Csend != 0) {
+		if t.Chan&Csend == 0 {
 			Yyerror("invalid operation: %v (cannot close receive-only channel)", Nconv(n, 0))
 			goto error
 		}
@@ -1334,7 +1333,7 @@
 			goto error
 		}
 
-		if count(args) == 1 && !(n.Isddd != 0) {
+		if count(args) == 1 && n.Isddd == 0 {
 			typecheck(&args.N, Erv|Efnstruct)
 		} else {
 			typechecklist(args, Erv)
@@ -1346,16 +1345,16 @@
 		}
 
 		// Unpack multiple-return result before type-checking.
-		if Istype(t, TSTRUCT) != 0 && t.Funarg != 0 {
+		if Istype(t, TSTRUCT) && t.Funarg != 0 {
 			t = t.Type
-			if Istype(t, TFIELD) != 0 {
+			if Istype(t, TFIELD) {
 				t = t.Type
 			}
 		}
 
 		n.Type = t
-		if !(Isslice(t) != 0) {
-			if Isconst(args.N, CTNIL) != 0 {
+		if !Isslice(t) {
+			if Isconst(args.N, CTNIL) {
 				Yyerror("first argument to append must be typed slice; have untyped nil", t)
 				goto error
 			}
@@ -1375,7 +1374,7 @@
 				goto error
 			}
 
-			if Istype(t.Type, TUINT8) != 0 && Istype(args.Next.N.Type, TSTRING) != 0 {
+			if Istype(t.Type, TUINT8) && Istype(args.Next.N.Type, TSTRING) {
 				defaultlit(&args.Next.N, Types[TSTRING])
 				goto ret
 			}
@@ -1422,7 +1421,7 @@
 		}
 
 		// copy([]byte, string)
-		if Isslice(n.Left.Type) != 0 && n.Right.Type.Etype == TSTRING {
+		if Isslice(n.Left.Type) && n.Right.Type.Etype == TSTRING {
 			if Eqtype(n.Left.Type.Type, bytetype) {
 				goto ret
 			}
@@ -1430,10 +1429,10 @@
 			goto error
 		}
 
-		if !(Isslice(n.Left.Type) != 0) || !(Isslice(n.Right.Type) != 0) {
-			if !(Isslice(n.Left.Type) != 0) && !(Isslice(n.Right.Type) != 0) {
+		if !Isslice(n.Left.Type) || !Isslice(n.Right.Type) {
+			if !Isslice(n.Left.Type) && !Isslice(n.Right.Type) {
 				Yyerror("arguments to copy must be slices; have %v, %v", Tconv(n.Left.Type, obj.FmtLong), Tconv(n.Right.Type, obj.FmtLong))
-			} else if !(Isslice(n.Left.Type) != 0) {
+			} else if !Isslice(n.Left.Type) {
 				Yyerror("first argument to copy should be slice; have %v", Tconv(n.Left.Type, obj.FmtLong))
 			} else {
 				Yyerror("second argument to copy should be slice or string; have %v", Tconv(n.Right.Type, obj.FmtLong))
@@ -1474,7 +1473,7 @@
 			goto error
 
 		case TARRAY:
-			if !(Isslice(t) != 0) {
+			if !Isslice(t) {
 				Yyerror("cannot make type %v", Tconv(t, 0))
 				goto error
 			}
@@ -1502,7 +1501,7 @@
 			if et != 0 {
 				goto error
 			}
-			if Isconst(l, CTINT) != 0 && r != nil && Isconst(r, CTINT) != 0 && Mpcmpfixfix(l.Val.U.Xval, r.Val.U.Xval) > 0 {
+			if Isconst(l, CTINT) && r != nil && Isconst(r, CTINT) && Mpcmpfixfix(l.Val.U.Xval, r.Val.U.Xval) > 0 {
 				Yyerror("len larger than cap in make(%v)", Tconv(t, 0))
 				goto error
 			}
@@ -1587,7 +1586,7 @@
 		typechecklist(n.List, Erv|Eindir) // Eindir: address does not escape
 		for args = n.List; args != nil; args = args.Next {
 			// Special case for print: int constant is int64, not int.
-			if Isconst(args.N, CTINT) != 0 {
+			if Isconst(args.N, CTINT) {
 				defaultlit(&args.N, Types[TINT64])
 			} else {
 				defaultlit(&args.N, nil)
@@ -1646,7 +1645,7 @@
 		if t == nil {
 			goto error
 		}
-		if !(Isslice(t) != 0) && t.Etype != TSTRING {
+		if !Isslice(t) && t.Etype != TSTRING {
 			Fatal("OSPTR of %v", Tconv(t, 0))
 		}
 		if t.Etype == TSTRING {
@@ -1708,7 +1707,7 @@
 	case ODEFER:
 		ok |= Etop
 		typecheck(&n.Left, Etop|Erv)
-		if !(n.Left.Diag != 0) {
+		if n.Left.Diag == 0 {
 			checkdefergo(n)
 		}
 		goto ret
@@ -1809,7 +1808,7 @@
 	case ODCLTYPE:
 		ok |= Etop
 		typecheck(&n.Left, Etype)
-		if !(incannedimport != 0) {
+		if incannedimport == 0 {
 			checkwidth(n.Left.Type)
 		}
 		goto ret
@@ -1850,7 +1849,7 @@
 		if r.Type.Etype != TBLANK {
 			aop = assignop(l.Type, r.Type, nil)
 			if aop != 0 {
-				if Isinter(r.Type) != 0 && !(Isinter(l.Type) != 0) && algtype1(l.Type, nil) == ANOEQ {
+				if Isinter(r.Type) && !Isinter(l.Type) && algtype1(l.Type, nil) == ANOEQ {
 					Yyerror("invalid operation: %v (operator %v not defined on %s)", Nconv(n, 0), Oconv(int(op), 0), typekind(l.Type))
 					goto error
 				}
@@ -1871,7 +1870,7 @@
 		if l.Type.Etype != TBLANK {
 			aop = assignop(r.Type, l.Type, nil)
 			if aop != 0 {
-				if Isinter(l.Type) != 0 && !(Isinter(r.Type) != 0) && algtype1(r.Type, nil) == ANOEQ {
+				if Isinter(l.Type) && !Isinter(r.Type) && algtype1(r.Type, nil) == ANOEQ {
 					Yyerror("invalid operation: %v (operator %v not defined on %s)", Nconv(n, 0), Oconv(int(op), 0), typekind(r.Type))
 					goto error
 				}
@@ -1905,29 +1904,29 @@
 		}
 	}
 
-	if !(okfor[op][et] != 0) {
+	if okfor[op][et] == 0 {
 		Yyerror("invalid operation: %v (operator %v not defined on %s)", Nconv(n, 0), Oconv(int(op), 0), typekind(t))
 		goto error
 	}
 
 	// okfor allows any array == array, map == map, func == func.
 	// restrict to slice/map/func == nil and nil == slice/map/func.
-	if Isfixedarray(l.Type) != 0 && algtype1(l.Type, nil) == ANOEQ {
+	if Isfixedarray(l.Type) && algtype1(l.Type, nil) == ANOEQ {
 		Yyerror("invalid operation: %v (%v cannot be compared)", Nconv(n, 0), Tconv(l.Type, 0))
 		goto error
 	}
 
-	if Isslice(l.Type) != 0 && !(isnil(l) != 0) && !(isnil(r) != 0) {
+	if Isslice(l.Type) && !isnil(l) && !isnil(r) {
 		Yyerror("invalid operation: %v (slice can only be compared to nil)", Nconv(n, 0))
 		goto error
 	}
 
-	if l.Type.Etype == TMAP && !(isnil(l) != 0) && !(isnil(r) != 0) {
+	if l.Type.Etype == TMAP && !isnil(l) && !isnil(r) {
 		Yyerror("invalid operation: %v (map can only be compared to nil)", Nconv(n, 0))
 		goto error
 	}
 
-	if l.Type.Etype == TFUNC && !(isnil(l) != 0) && !(isnil(r) != 0) {
+	if l.Type.Etype == TFUNC && !isnil(l) && !isnil(r) {
 		Yyerror("invalid operation: %v (func can only be compared to nil)", Nconv(n, 0))
 		goto error
 	}
@@ -1997,7 +1996,7 @@
 		}
 	}
 
-	if (op == ODIV || op == OMOD) && Isconst(r, CTINT) != 0 {
+	if (op == ODIV || op == OMOD) && Isconst(r, CTINT) {
 		if mpcmpfixc(r.Val.U.Xval, 0) == 0 {
 			Yyerror("division by zero")
 			goto error
@@ -2011,13 +2010,13 @@
 	defaultlit(&r, Types[TUINT])
 	n.Right = r
 	t = r.Type
-	if !(Isint[t.Etype] != 0) || Issigned[t.Etype] != 0 {
+	if Isint[t.Etype] == 0 || Issigned[t.Etype] != 0 {
 		Yyerror("invalid operation: %v (shift count type %v, must be unsigned integer)", Nconv(n, 0), Tconv(r.Type, 0))
 		goto error
 	}
 
 	t = l.Type
-	if t != nil && t.Etype != TIDEAL && !(Isint[t.Etype] != 0) {
+	if t != nil && t.Etype != TIDEAL && Isint[t.Etype] == 0 {
 		Yyerror("invalid operation: %v (shift of type %v)", Nconv(n, 0), Tconv(t, 0))
 		goto error
 	}
@@ -2032,14 +2031,14 @@
 	ok |= Erv
 	saveorignode(n)
 	typecheck(&n.Left, Erv|top&(Eindir|Eiota))
-	convlit1(&n.Left, n.Type, 1)
+	convlit1(&n.Left, n.Type, true)
 	t = n.Left.Type
 	if t == nil || n.Type == nil {
 		goto error
 	}
 	n.Op = uint8(convertop(t, n.Type, &why))
 	if (n.Op) == 0 {
-		if !(n.Diag != 0) && !(n.Type.Broke != 0) {
+		if n.Diag == 0 && n.Type.Broke == 0 {
 			Yyerror("cannot convert %v to type %v%s", Nconv(n.Left, obj.FmtLong), Tconv(n.Type, 0), why)
 			n.Diag = 1
 		}
@@ -2073,7 +2072,7 @@
 
 ret:
 	t = n.Type
-	if t != nil && !(t.Funarg != 0) && n.Op != OTYPE {
+	if t != nil && t.Funarg == 0 && n.Op != OTYPE {
 		switch t.Etype {
 		case TFUNC, // might have TANY; wait until its called
 			TANY,
@@ -2088,12 +2087,12 @@
 		}
 	}
 
-	if safemode != 0 && !(incannedimport != 0) && !(importpkg != nil) && !(compiling_wrappers != 0) && t != nil && t.Etype == TUNSAFEPTR {
+	if safemode != 0 && incannedimport == 0 && importpkg == nil && compiling_wrappers == 0 && t != nil && t.Etype == TUNSAFEPTR {
 		Yyerror("cannot use unsafe.Pointer")
 	}
 
 	evconst(n)
-	if n.Op == OTYPE && !(top&Etype != 0) {
+	if n.Op == OTYPE && top&Etype == 0 {
 		Yyerror("type %v is not an expression", Tconv(n.Type, 0))
 		goto error
 	}
@@ -2104,12 +2103,12 @@
 	}
 
 	// TODO(rsc): simplify
-	if (top&(Ecall|Erv|Etype) != 0) && !(top&Etop != 0) && !(ok&(Erv|Etype|Ecall) != 0) {
+	if (top&(Ecall|Erv|Etype) != 0) && top&Etop == 0 && ok&(Erv|Etype|Ecall) == 0 {
 		Yyerror("%v used as value", Nconv(n, 0))
 		goto error
 	}
 
-	if (top&Etop != 0) && !(top&(Ecall|Erv|Etype) != 0) && !(ok&Etop != 0) {
+	if (top&Etop != 0) && top&(Ecall|Erv|Etype) == 0 && ok&Etop == 0 {
 		if n.Diag == 0 {
 			Yyerror("%v evaluated but not used", Nconv(n, 0))
 			n.Diag = 1
@@ -2142,7 +2141,7 @@
 	if t == nil {
 		return -1
 	}
-	if !(Isint[t.Etype] != 0) {
+	if Isint[t.Etype] == 0 {
 		Yyerror("invalid slice index %v (type %v)", Nconv(r, 0), Tconv(t, 0))
 		return -1
 	}
@@ -2154,7 +2153,7 @@
 		} else if tp != nil && tp.Bound > 0 && Mpgetfix(r.Val.U.Xval) > tp.Bound {
 			Yyerror("invalid slice index %v (out of bounds for %d-element array)", Nconv(r, 0), tp.Bound)
 			return -1
-		} else if Isconst(l, CTSTR) != 0 && Mpgetfix(r.Val.U.Xval) > int64(len(l.Val.U.Sval.S)) {
+		} else if Isconst(l, CTSTR) && Mpgetfix(r.Val.U.Xval) > int64(len(l.Val.U.Sval.S)) {
 			Yyerror("invalid slice index %v (out of bounds for %d-byte string)", Nconv(r, 0), len(l.Val.U.Sval.S))
 			return -1
 		} else if Mpcmpfixfix(r.Val.U.Xval, Maxintval[TINT]) > 0 {
@@ -2222,7 +2221,7 @@
 		return
 	}
 
-	if !(n.Diag != 0) {
+	if n.Diag == 0 {
 		// The syntax made sure it was a call, so this must be
 		// a conversion.
 		n.Diag = 1
@@ -2239,14 +2238,14 @@
 	n = *nn
 
 	t = n.Type
-	if t == nil || !(Isptr[t.Etype] != 0) {
+	if t == nil || Isptr[t.Etype] == 0 {
 		return
 	}
 	t = t.Type
 	if t == nil {
 		return
 	}
-	if !(Isfixedarray(t) != 0) {
+	if !Isfixedarray(t) {
 		return
 	}
 	n = Nod(OIND, n, nil)
@@ -2335,7 +2334,7 @@
 	return r
 }
 
-func looktypedot(n *Node, t *Type, dostrcmp int) int {
+func looktypedot(n *Node, t *Type, dostrcmp int) bool {
 	var f1 *Type
 	var f2 *Type
 	var s *Sym
@@ -2345,14 +2344,14 @@
 	if t.Etype == TINTER {
 		f1 = lookdot1(n, s, t, t.Type, dostrcmp)
 		if f1 == nil {
-			return 0
+			return false
 		}
 
 		n.Right = methodname(n.Right, t)
 		n.Xoffset = f1.Width
 		n.Type = f1.Type
 		n.Op = ODOTINTER
-		return 1
+		return true
 	}
 
 	// Find the base type: methtype will fail if t
@@ -2360,26 +2359,26 @@
 	f2 = methtype(t, 0)
 
 	if f2 == nil {
-		return 0
+		return false
 	}
 
 	expandmeth(f2)
 	f2 = lookdot1(n, s, f2, f2.Xmethod, dostrcmp)
 	if f2 == nil {
-		return 0
+		return false
 	}
 
 	// disallow T.m if m requires *T receiver
-	if Isptr[getthisx(f2.Type).Type.Type.Etype] != 0 && !(Isptr[t.Etype] != 0) && f2.Embedded != 2 && !(isifacemethod(f2.Type) != 0) {
+	if Isptr[getthisx(f2.Type).Type.Type.Etype] != 0 && Isptr[t.Etype] == 0 && f2.Embedded != 2 && !isifacemethod(f2.Type) {
 		Yyerror("invalid method expression %v (needs pointer receiver: (*%v).%v)", Nconv(n, 0), Tconv(t, 0), Sconv(f2.Sym, obj.FmtShort))
-		return 0
+		return false
 	}
 
 	n.Right = methodname(n.Right, t)
 	n.Xoffset = f2.Width
 	n.Type = f2.Type
 	n.Op = ODOTMETH
-	return 1
+	return true
 }
 
 func derefall(t *Type) *Type {
@@ -2389,7 +2388,7 @@
 	return t
 }
 
-func lookdot(n *Node, t *Type, dostrcmp int) int {
+func lookdot(n *Node, t *Type, dostrcmp int) bool {
 	var f1 *Type
 	var f2 *Type
 	var tt *Type
@@ -2434,7 +2433,7 @@
 			n.Op = ODOTINTER
 		}
 
-		return 1
+		return true
 	}
 
 	if f2 != nil {
@@ -2475,31 +2474,31 @@
 		//		print("lookdot found [%p] %T\n", f2->type, f2->type);
 		n.Op = ODOTMETH
 
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
-func nokeys(l *NodeList) int {
+func nokeys(l *NodeList) bool {
 	for ; l != nil; l = l.Next {
 		if l.N.Op == OKEY {
-			return 0
+			return false
 		}
 	}
-	return 1
+	return true
 }
 
-func hasddd(t *Type) int {
+func hasddd(t *Type) bool {
 	var tl *Type
 
 	for tl = t.Type; tl != nil; tl = tl.Down {
 		if tl.Isddd != 0 {
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
 func downcount(t *Type) int {
@@ -2538,7 +2537,7 @@
 		n = nl.N
 		if n.Type != nil {
 			if n.Type.Etype == TSTRUCT && n.Type.Funarg != 0 {
-				if !(hasddd(tstruct) != 0) {
+				if !hasddd(tstruct) {
 					n1 = downcount(tstruct)
 					n2 = downcount(n.Type)
 					if n2 > n1 {
@@ -2589,7 +2588,7 @@
 
 	n1 = downcount(tstruct)
 	n2 = count(nl)
-	if !(hasddd(tstruct) != 0) {
+	if !hasddd(tstruct) {
 		if n2 > n1 {
 			goto toomany
 		}
@@ -2597,7 +2596,7 @@
 			goto notenough
 		}
 	} else {
-		if !(isddd != 0) {
+		if isddd == 0 {
 			if n2 < n1-1 {
 				goto notenough
 			}
@@ -2667,7 +2666,7 @@
 	return
 
 notenough:
-	if n == nil || !(n.Diag != 0) {
+	if n == nil || n.Diag == 0 {
 		if call != nil {
 			Yyerror("not enough arguments in call to %v", Nconv(call, 0))
 		} else {
@@ -2809,15 +2808,15 @@
 	hash[h] = n
 }
 
-func prime(h uint32, sr uint32) int {
+func prime(h uint32, sr uint32) bool {
 	var n uint32
 
 	for n = 3; n <= sr; n += 2 {
 		if h%n == 0 {
-			return 0
+			return false
 		}
 	}
-	return 1
+	return true
 }
 
 func inithash(n *Node, autohash []*Node) []*Node {
@@ -2855,7 +2854,7 @@
 	}
 
 	// check for primeality
-	for !(prime(h, sr) != 0) {
+	for !prime(h, sr) {
 		h += 2
 	}
 
@@ -2863,12 +2862,12 @@
 	return make([]*Node, h)
 }
 
-func iscomptype(t *Type) int {
+func iscomptype(t *Type) bool {
 	switch t.Etype {
 	case TARRAY,
 		TSTRUCT,
 		TMAP:
-		return 1
+		return true
 
 	case TPTR32,
 		TPTR64:
@@ -2876,15 +2875,15 @@
 		case TARRAY,
 			TSTRUCT,
 			TMAP:
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
 func pushtype(n *Node, t *Type) {
-	if n == nil || n.Op != OCOMPLIT || !(iscomptype(t) != 0) {
+	if n == nil || n.Op != OCOMPLIT || !iscomptype(t) {
 		return
 	}
 
@@ -2946,13 +2945,13 @@
 	if Isptr[t.Etype] != 0 {
 		// For better or worse, we don't allow pointers as the composite literal type,
 		// except when using the &T syntax, which sets implicit on the OIND.
-		if !(n.Right.Implicit != 0) {
+		if n.Right.Implicit == 0 {
 			Yyerror("invalid pointer type %v for composite literal (use &%v instead)", Tconv(t, 0), Tconv(t.Type, 0))
 			goto error
 		}
 
 		// Also, the underlying type must be a struct, map, slice, or array.
-		if !(iscomptype(t) != 0) {
+		if !iscomptype(t) {
 			Yyerror("invalid pointer type %v for composite literal", Tconv(t, 0))
 			goto error
 		}
@@ -2983,7 +2982,7 @@
 			typecheck(&l.Left, Erv)
 			evconst(l.Left)
 			i = nonnegconst(l.Left)
-			if i < 0 && !(l.Left.Diag != 0) {
+			if i < 0 && l.Left.Diag == 0 {
 				Yyerror("array index must be non-negative integer constant")
 				l.Left.Diag = 1
 				i = -(1 << 30) // stay negative for a while
@@ -3047,7 +3046,7 @@
 
 	case TSTRUCT:
 		bad = 0
-		if n.List != nil && nokeys(n.List) != 0 {
+		if n.List != nil && nokeys(n.List) {
 			// simple list of variables
 			f = t.Type
 
@@ -3057,7 +3056,7 @@
 				if f == nil {
 					tmp12 := bad
 					bad++
-					if !(tmp12 != 0) {
+					if tmp12 == 0 {
 						Yyerror("too many values in struct initializer")
 					}
 					continue
@@ -3090,7 +3089,7 @@
 				if l.Op != OKEY {
 					tmp13 := bad
 					bad++
-					if !(tmp13 != 0) {
+					if tmp13 == 0 {
 						Yyerror("mixture of field:value and value initializers")
 					}
 					typecheck(&ll.N, Erv)
@@ -3164,14 +3163,14 @@
 /*
  * lvalue etc
  */
-func islvalue(n *Node) int {
+func islvalue(n *Node) bool {
 	switch n.Op {
 	case OINDEX:
-		if Isfixedarray(n.Left.Type) != 0 {
+		if Isfixedarray(n.Left.Type) {
 			return islvalue(n.Left)
 		}
 		if n.Left.Type != nil && n.Left.Type.Etype == TSTRING {
-			return 0
+			return false
 		}
 		fallthrough
 
@@ -3180,23 +3179,23 @@
 		ODOTPTR,
 		OCLOSUREVAR,
 		OPARAM:
-		return 1
+		return true
 
 	case ODOT:
 		return islvalue(n.Left)
 
 	case ONAME:
 		if n.Class == PFUNC {
-			return 0
+			return false
 		}
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
 func checklvalue(n *Node, verb string) {
-	if !(islvalue(n) != 0) {
+	if !islvalue(n) {
 		Yyerror("cannot %s %v", verb, Nconv(n, 0))
 	}
 }
@@ -3221,7 +3220,7 @@
 		}
 	}
 
-	if islvalue(n) != 0 {
+	if islvalue(n) {
 		return
 	}
 	if n.Op == OINDEXMAP {
@@ -3245,28 +3244,28 @@
 
 // Check whether l and r are the same side effect-free expression,
 // so that it is safe to reuse one instead of computing both.
-func samesafeexpr(l *Node, r *Node) int {
+func samesafeexpr(l *Node, r *Node) bool {
 	if l.Op != r.Op || !Eqtype(l.Type, r.Type) {
-		return 0
+		return false
 	}
 
 	switch l.Op {
 	case ONAME,
 		OCLOSUREVAR:
-		return bool2int(l == r)
+		return l == r
 
 	case ODOT,
 		ODOTPTR:
-		return bool2int(l.Right != nil && r.Right != nil && l.Right.Sym == r.Right.Sym && samesafeexpr(l.Left, r.Left) != 0)
+		return l.Right != nil && r.Right != nil && l.Right.Sym == r.Right.Sym && samesafeexpr(l.Left, r.Left)
 
 	case OIND:
 		return samesafeexpr(l.Left, r.Left)
 
 	case OINDEX:
-		return bool2int(samesafeexpr(l.Left, r.Left) != 0 && samesafeexpr(l.Right, r.Right) != 0)
+		return samesafeexpr(l.Left, r.Left) && samesafeexpr(l.Right, r.Right)
 	}
 
-	return 0
+	return false
 }
 
 /*
@@ -3313,14 +3312,14 @@
 	// Recognize slices being updated in place, for better code generation later.
 	// Don't rewrite if using race detector, to avoid needing to teach race detector
 	// about this optimization.
-	if n.Left != nil && n.Left.Op != OINDEXMAP && n.Right != nil && !(flag_race != 0) {
+	if n.Left != nil && n.Left.Op != OINDEXMAP && n.Right != nil && flag_race == 0 {
 		switch n.Right.Op {
 		// For x = x[0:y], x can be updated in place, without touching pointer.
 		// TODO(rsc): Reenable once it is actually updated in place without touching the pointer.
 		case OSLICE,
 			OSLICE3,
 			OSLICESTR:
-			if false && samesafeexpr(n.Left, n.Right.Left) != 0 && (n.Right.Right.Left == nil || iszero(n.Right.Right.Left) != 0) {
+			if false && samesafeexpr(n.Left, n.Right.Left) && (n.Right.Right.Left == nil || iszero(n.Right.Right.Left)) {
 				n.Right.Reslice = 1
 			}
 
@@ -3329,7 +3328,7 @@
 		// can take care of updating the pointer, and only in that case.
 		// 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) != 0 {
+			if false && n.Right.List != nil && samesafeexpr(n.Left, n.Right.List.N) {
 				n.Right.Reslice = 1
 			}
 		}
@@ -3664,7 +3663,7 @@
 	if ntypecheckdeftype == 1 {
 		for {
 			l = methodqueue
-			if !(l != nil) {
+			if l == nil {
 				break
 			}
 			methodqueue = nil
@@ -3704,7 +3703,7 @@
 	setlineno(n)
 
 	if n.Op == ONONAME {
-		if !(n.Diag != 0) {
+		if n.Diag == 0 {
 			n.Diag = 1
 			if n.Lineno != 0 {
 				lineno = n.Lineno
@@ -3746,7 +3745,6 @@
 	switch n.Op {
 	default:
 		Fatal("typecheckdef %v", Oconv(int(n.Op), 0))
-		fallthrough
 
 		// not really syms
 	case OGOTO,
@@ -3773,13 +3771,13 @@
 		}
 
 		typecheck(&e, Erv|Eiota)
-		if Isconst(e, CTNIL) != 0 {
+		if Isconst(e, CTNIL) {
 			Yyerror("const initializer cannot be nil")
 			goto ret
 		}
 
-		if e.Type != nil && e.Op != OLITERAL || !(isgoconst(e) != 0) {
-			if !(e.Diag != 0) {
+		if e.Type != nil && e.Op != OLITERAL || !isgoconst(e) {
+			if e.Diag == 0 {
 				Yyerror("const initializer %v is not a constant", Nconv(e, 0))
 				e.Diag = 1
 			}
@@ -3789,12 +3787,12 @@
 
 		t = n.Type
 		if t != nil {
-			if !(okforconst[t.Etype] != 0) {
+			if okforconst[t.Etype] == 0 {
 				Yyerror("invalid constant type %v", Tconv(t, 0))
 				goto ret
 			}
 
-			if !(isideal(e.Type) != 0) && !Eqtype(t, e.Type) {
+			if !isideal(e.Type) && !Eqtype(t, e.Type) {
 				Yyerror("cannot use %v as type %v in const initializer", Nconv(e, obj.FmtLong), Tconv(t, 0))
 				goto ret
 			}
@@ -3867,7 +3865,7 @@
 	}
 
 ret:
-	if n.Op != OLITERAL && n.Type != nil && isideal(n.Type) != 0 {
+	if n.Op != OLITERAL && n.Type != nil && isideal(n.Type) {
 		Fatal("got %v for %v", Tconv(n.Type, 0), Nconv(n, 0))
 	}
 	if typecheckdefstack.N != n {
@@ -3910,7 +3908,7 @@
 		}
 	}
 
-	if !(Isint[n.Type.Etype] != 0) && n.Type.Etype != TIDEAL {
+	if Isint[n.Type.Etype] == 0 && n.Type.Etype != TIDEAL {
 		Yyerror("non-integer %s argument in make(%v) - %v", arg, Tconv(t, 0), Tconv(n.Type, 0))
 		return -1
 	}
@@ -3991,12 +3989,12 @@
 	}
 }
 
-func isterminating(l *NodeList, top int) int {
+func isterminating(l *NodeList, top int) bool {
 	var def int
 	var n *Node
 
 	if l == nil {
-		return 0
+		return false
 	}
 	if top != 0 {
 		for l.Next != nil && l.N.Op != OLABEL {
@@ -4011,7 +4009,7 @@
 	n = l.N
 
 	if n == nil {
-		return 0
+		return false
 	}
 
 	switch n.Op {
@@ -4028,48 +4026,48 @@
 		ORETJMP,
 		OPANIC,
 		OXFALL:
-		return 1
+		return true
 
 	case OFOR:
 		if n.Ntest != nil {
-			return 0
+			return false
 		}
 		if n.Hasbreak != 0 {
-			return 0
+			return false
 		}
-		return 1
+		return true
 
 	case OIF:
-		return bool2int(isterminating(n.Nbody, 0) != 0 && isterminating(n.Nelse, 0) != 0)
+		return isterminating(n.Nbody, 0) && isterminating(n.Nelse, 0)
 
 	case OSWITCH,
 		OTYPESW,
 		OSELECT:
 		if n.Hasbreak != 0 {
-			return 0
+			return false
 		}
 		def = 0
 		for l = n.List; l != nil; l = l.Next {
-			if !(isterminating(l.N.Nbody, 0) != 0) {
-				return 0
+			if !isterminating(l.N.Nbody, 0) {
+				return false
 			}
 			if l.N.List == nil { // default
 				def = 1
 			}
 		}
 
-		if n.Op != OSELECT && !(def != 0) {
-			return 0
+		if n.Op != OSELECT && def == 0 {
+			return false
 		}
-		return 1
+		return true
 	}
 
-	return 0
+	return false
 }
 
 func checkreturn(fn *Node) {
 	if fn.Type.Outtuple != 0 && fn.Nbody != nil {
-		if !(isterminating(fn.Nbody, 1) != 0) {
+		if !isterminating(fn.Nbody, 1) {
 			yyerrorl(int(fn.Endlineno), "missing return at end of function")
 		}
 	}
diff --git a/src/cmd/internal/gc/unsafe.go b/src/cmd/internal/gc/unsafe.go
index e50ea19..3970468 100644
--- a/src/cmd/internal/gc/unsafe.go
+++ b/src/cmd/internal/gc/unsafe.go
@@ -161,18 +161,18 @@
 	return n
 }
 
-func isunsafebuiltin(n *Node) int {
+func isunsafebuiltin(n *Node) bool {
 	if n == nil || n.Op != ONAME || n.Sym == nil || n.Sym.Pkg != unsafepkg {
-		return 0
+		return false
 	}
 	if n.Sym.Name == "Sizeof" {
-		return 1
+		return true
 	}
 	if n.Sym.Name == "Offsetof" {
-		return 1
+		return true
 	}
 	if n.Sym.Name == "Alignof" {
-		return 1
+		return true
 	}
-	return 0
+	return false
 }
diff --git a/src/cmd/internal/gc/walk.go b/src/cmd/internal/gc/walk.go
index 37299ca..dfb965e 100644
--- a/src/cmd/internal/gc/walk.go
+++ b/src/cmd/internal/gc/walk.go
@@ -86,13 +86,13 @@
 	}
 }
 
-func samelist(a *NodeList, b *NodeList) int {
+func samelist(a *NodeList, b *NodeList) bool {
 	for ; a != nil && b != nil; (func() { a = a.Next; b = b.Next })() {
 		if a.N != b.N {
-			return 0
+			return false
 		}
 	}
-	return bool2int(a == b)
+	return a == b
 }
 
 func paramoutheap(fn *Node) int {
@@ -314,7 +314,7 @@
 				}
 			}
 
-			if samelist(rl, n.List) != 0 {
+			if samelist(rl, n.List) {
 				// special return in disguise
 				n.List = nil
 
@@ -520,7 +520,7 @@
 		if Isptr[t.Etype] != 0 {
 			t = t.Type
 		}
-		if Isfixedarray(t) != 0 {
+		if Isfixedarray(t) {
 			safeexpr(n.Left, init)
 			Nodconst(n, n.Type, t.Bound)
 			n.Typecheck = 1
@@ -533,8 +533,8 @@
 		walkexpr(&n.Left, init)
 		walkexpr(&n.Right, init)
 		t = n.Left.Type
-		n.Bounded = uint8(bounded(n.Right, 8*t.Width))
-		if Debug['m'] != 0 && n.Etype != 0 && !(Isconst(n.Right, CTINT) != 0) {
+		n.Bounded = bounded(n.Right, 8*t.Width)
+		if Debug['m'] != 0 && n.Etype != 0 && !Isconst(n.Right, CTINT) {
 			Warn("shift bounds check elided")
 		}
 		goto ret
@@ -620,7 +620,7 @@
 		goto ret
 
 	case ONAME:
-		if !(n.Class&PHEAP != 0) && n.Class != PPARAMREF {
+		if n.Class&PHEAP == 0 && n.Class != PPARAMREF {
 			n.Addable = 1
 		}
 		goto ret
@@ -696,11 +696,11 @@
 		walkexpr(&n.Left, init)
 		n.Left = safeexpr(n.Left, init)
 
-		if oaslit(n, init) != 0 {
+		if oaslit(n, init) {
 			goto ret
 		}
 
-		if n.Right == nil || iszero(n.Right) != 0 && !(flag_race != 0) {
+		if n.Right == nil || iszero(n.Right) && flag_race == 0 {
 			goto ret
 		}
 
@@ -719,12 +719,12 @@
 			from = "I"
 
 			to = "T"
-			if isnilinter(r.Left.Type) != 0 {
+			if isnilinter(r.Left.Type) {
 				from = "E"
 			}
-			if isnilinter(r.Type) != 0 {
+			if isnilinter(r.Type) {
 				to = "E"
-			} else if Isinter(r.Type) != 0 {
+			} else if Isinter(r.Type) {
 				to = "I"
 			}
 
@@ -920,12 +920,12 @@
 		from = "I"
 
 		to = "T"
-		if isnilinter(r.Left.Type) != 0 {
+		if isnilinter(r.Left.Type) {
 			from = "E"
 		}
-		if isnilinter(r.Type) != 0 {
+		if isnilinter(r.Type) {
 			to = "E"
-		} else if Isinter(r.Type) != 0 {
+		} else if Isinter(r.Type) {
 			to = "I"
 		}
 		buf = fmt.Sprintf("assert%s2%s2", from, to)
@@ -947,13 +947,12 @@
 	case ODOTTYPE,
 		ODOTTYPE2:
 		Fatal("walkexpr ODOTTYPE") // should see inside OAS or OAS2 only
-		fallthrough
 
 	case OCONVIFACE:
 		walkexpr(&n.Left, init)
 
 		// Optimize convT2E as a two-word copy when T is pointer-shaped.
-		if isnilinter(n.Type) != 0 && isdirectiface(n.Left.Type) != 0 {
+		if isnilinter(n.Type) && isdirectiface(n.Left.Type) {
 			l = Nod(OEFACE, typename(n.Left.Type), n.Left)
 			l.Type = n.Type
 			l.Typecheck = n.Typecheck
@@ -967,25 +966,25 @@
 		from = "T"
 
 		to = "I"
-		if isnilinter(n.Left.Type) != 0 {
+		if isnilinter(n.Left.Type) {
 			from = "E"
-		} else if Isinter(n.Left.Type) != 0 {
+		} else if Isinter(n.Left.Type) {
 			from = "I"
 		}
-		if isnilinter(n.Type) != 0 {
+		if isnilinter(n.Type) {
 			to = "E"
 		}
 		buf = fmt.Sprintf("conv%s2%s", from, to)
 
 		fn = syslook(buf, 1)
 		ll = nil
-		if !(Isinter(n.Left.Type) != 0) {
+		if !Isinter(n.Left.Type) {
 			ll = list(ll, typename(n.Left.Type))
 		}
-		if !(isnilinter(n.Type) != 0) {
+		if !isnilinter(n.Type) {
 			ll = list(ll, typename(n.Type))
 		}
-		if !(Isinter(n.Left.Type) != 0) && !(isnilinter(n.Type) != 0) {
+		if !Isinter(n.Left.Type) && !isnilinter(n.Type) {
 			sym = Pkglookup(fmt.Sprintf("%v.%v", Tconv(n.Left.Type, obj.FmtLeft), Tconv(n.Type, obj.FmtLeft)), itabpkg)
 			if sym.Def == nil {
 				l = Nod(ONAME, nil, nil)
@@ -1002,7 +1001,7 @@
 			l.Addable = 1
 			ll = list(ll, l)
 
-			if isdirectiface(n.Left.Type) != 0 {
+			if isdirectiface(n.Left.Type) {
 				/* For pointer types, we can make a special form of optimization
 				 *
 				 * These statements are put onto the expression init list:
@@ -1040,7 +1039,7 @@
 			}
 		}
 
-		if Isinter(n.Left.Type) != 0 {
+		if Isinter(n.Left.Type) {
 			ll = list(ll, n.Left)
 		} else {
 			// regular types are passed by reference to avoid C vararg calls
@@ -1049,7 +1048,7 @@
 			// with a non-interface, especially in a switch on interface value
 			// with non-interface cases, is not visible to orderstmt, so we
 			// have to fall back on allocating a temp here.
-			if islvalue(n.Left) != 0 {
+			if islvalue(n.Left) {
 				ll = list(ll, Nod(OADDR, n.Left, nil))
 			} else {
 				ll = list(ll, Nod(OADDR, copyexpr(n.Left, n.Left.Type, init), nil))
@@ -1174,28 +1173,28 @@
 
 		// if range of type cannot exceed static array bound,
 		// disable bounds check.
-		if n.Bounded != 0 {
+		if n.Bounded {
 			goto ret
 		}
 		t = n.Left.Type
 		if t != nil && Isptr[t.Etype] != 0 {
 			t = t.Type
 		}
-		if Isfixedarray(t) != 0 {
-			n.Bounded = uint8(bounded(r, t.Bound))
-			if Debug['m'] != 0 && n.Bounded != 0 && !(Isconst(n.Right, CTINT) != 0) {
+		if Isfixedarray(t) {
+			n.Bounded = bounded(r, t.Bound)
+			if Debug['m'] != 0 && n.Bounded && !Isconst(n.Right, CTINT) {
 				Warn("index bounds check elided")
 			}
-			if Smallintconst(n.Right) != 0 && !(n.Bounded != 0) {
+			if Smallintconst(n.Right) && !n.Bounded {
 				Yyerror("index out of bounds")
 			}
-		} else if Isconst(n.Left, CTSTR) != 0 {
-			n.Bounded = uint8(bounded(r, int64(len(n.Left.Val.U.Sval.S))))
-			if Debug['m'] != 0 && n.Bounded != 0 && !(Isconst(n.Right, CTINT) != 0) {
+		} else if Isconst(n.Left, CTSTR) {
+			n.Bounded = bounded(r, int64(len(n.Left.Val.U.Sval.S)))
+			if Debug['m'] != 0 && n.Bounded && !Isconst(n.Right, CTINT) {
 				Warn("index bounds check elided")
 			}
-			if Smallintconst(n.Right) != 0 {
-				if !(n.Bounded != 0) {
+			if Smallintconst(n.Right) {
+				if !n.Bounded {
 					Yyerror("index out of bounds")
 				} else {
 					// replace "abc"[1] with 'b'.
@@ -1209,7 +1208,7 @@
 			}
 		}
 
-		if Isconst(n.Right, CTINT) != 0 {
+		if Isconst(n.Right, CTINT) {
 			if Mpcmpfixfix(n.Right.Val.U.Xval, &mpzero) < 0 || Mpcmpfixfix(n.Right.Val.U.Xval, Maxintval[TINT]) > 0 {
 				Yyerror("index out of bounds")
 			}
@@ -1264,7 +1263,6 @@
 
 	case ORECV:
 		Fatal("walkexpr ORECV") // should see inside OAS only
-		fallthrough
 
 	case OSLICE:
 		if n.Right != nil && n.Right.Left == nil && n.Right.Right == nil { // noop
@@ -1344,7 +1342,7 @@
 	// comparing the lengths instead will yield the same result
 	// without the function call.
 	case OCMPSTR:
-		if (Isconst(n.Left, CTSTR) != 0 && len(n.Left.Val.U.Sval.S) == 0) || (Isconst(n.Right, CTSTR) != 0 && len(n.Right.Val.U.Sval.S) == 0) {
+		if (Isconst(n.Left, CTSTR) && len(n.Left.Val.U.Sval.S) == 0) || (Isconst(n.Right, CTSTR) && len(n.Right.Val.U.Sval.S) == 0) {
 			r = Nod(int(n.Etype), Nod(OLEN, n.Left, nil), Nod(OLEN, n.Right, nil))
 			typecheck(&r, Erv)
 			walkexpr(&r, init)
@@ -1354,7 +1352,7 @@
 		}
 
 		// s + "badgerbadgerbadger" == "badgerbadgerbadger"
-		if (n.Etype == OEQ || n.Etype == ONE) && Isconst(n.Right, CTSTR) != 0 && n.Left.Op == OADDSTR && count(n.Left.List) == 2 && Isconst(n.Left.List.Next.N, CTSTR) != 0 && cmpslit(n.Right, n.Left.List.Next.N) == 0 {
+		if (n.Etype == OEQ || n.Etype == ONE) && Isconst(n.Right, CTSTR) && n.Left.Op == OADDSTR && count(n.Left.List) == 2 && Isconst(n.Left.List.Next.N, CTSTR) && cmpslit(n.Right, n.Left.List.Next.N) == 0 {
 			r = Nod(int(n.Etype), Nod(OLEN, n.Left.List.N, nil), Nodintconst(0))
 			typecheck(&r, Erv)
 			walkexpr(&r, init)
@@ -1470,7 +1468,7 @@
 			l = r
 		}
 		t = n.Type
-		if n.Esc == EscNone && Smallintconst(l) != 0 && Smallintconst(r) != 0 && (t.Type.Width == 0 || Mpgetfix(r.Val.U.Xval) < (1<<16)/t.Type.Width) {
+		if n.Esc == EscNone && Smallintconst(l) && Smallintconst(r) && (t.Type.Width == 0 || Mpgetfix(r.Val.U.Xval) < (1<<16)/t.Type.Width) {
 			// var arr [r]T
 			// n = arr[:l]
 			t = aindex(r, t.Type) // [r]T
@@ -1579,7 +1577,7 @@
 		if !Eqtype(n.Left.Type, n.Right.Type) {
 			Fatal("ifaceeq %v %v %v", Oconv(int(n.Op), 0), Tconv(n.Left.Type, 0), Tconv(n.Right.Type, 0))
 		}
-		if isnilinter(n.Left.Type) != 0 {
+		if isnilinter(n.Left.Type) {
 			fn = syslook("efaceeq", 1)
 		} else {
 			fn = syslook("ifaceeq", 1)
@@ -1715,20 +1713,20 @@
  * evaluating the lv or a function call
  * in the conversion of the types
  */
-func fncall(l *Node, rt *Type) int {
+func fncall(l *Node, rt *Type) bool {
 	var r Node
 
 	if l.Ullman >= UINF || l.Op == OINDEXMAP {
-		return 1
+		return true
 	}
 	r = Node{}
-	if needwritebarrier(l, &r) != 0 {
-		return 1
+	if needwritebarrier(l, &r) {
+		return true
 	}
 	if Eqtype(l.Type, rt) {
-		return 0
+		return false
 	}
-	return 1
+	return true
 }
 
 func ascompatet(op int, nl *NodeList, nr **Type, fp int, init **NodeList) *NodeList {
@@ -1765,7 +1763,7 @@
 		// any lv that causes a fn call must be
 		// deferred until all the return arguments
 		// have been pulled from the output arguments
-		if fncall(l, r.Type) != 0 {
+		if fncall(l, r.Type) {
 			tmp = temp(r.Type)
 			typecheck(&tmp, Erv)
 			a = Nod(OAS, l, tmp)
@@ -1916,7 +1914,7 @@
 	// f(g()) where g has multiple return values
 	if r != nil && lr.Next == nil && r.Type.Etype == TSTRUCT && r.Type.Funarg != 0 {
 		// optimization - can do block copy
-		if eqtypenoname(r.Type, *nl) != 0 {
+		if eqtypenoname(r.Type, *nl) {
 			a = nodarg(*nl, fp)
 			r = Nod(OCONVNOP, r, nil)
 			r.Type = a.Type
@@ -2013,7 +2011,7 @@
 	var all *NodeList
 	var on *Node
 	var t *Type
-	var notfirst int
+	var notfirst bool
 	var et int
 	var op int
 	var calls *NodeList
@@ -2021,7 +2019,7 @@
 	op = int(nn.Op)
 	all = nn.List
 	calls = nil
-	notfirst = 0
+	notfirst = false
 
 	// Hoist all the argument evaluation up before the lock.
 	walkexprlistcheap(all, init)
@@ -2029,11 +2027,11 @@
 	calls = list(calls, mkcall("printlock", nil, init))
 
 	for l = all; l != nil; l = l.Next {
-		if notfirst != 0 {
+		if notfirst {
 			calls = list(calls, mkcall("printsp", nil, init))
 		}
 
-		notfirst = bool2int(op == OPRINTN)
+		notfirst = op == OPRINTN
 
 		n = l.N
 		if n.Op == OLITERAL {
@@ -2060,8 +2058,8 @@
 
 		t = n.Type
 		et = int(n.Type.Etype)
-		if Isinter(n.Type) != 0 {
-			if isnilinter(n.Type) != 0 {
+		if Isinter(n.Type) {
+			if isnilinter(n.Type) {
 				on = syslook("printeface", 1)
 			} else {
 				on = syslook("printiface", 1)
@@ -2070,7 +2068,7 @@
 		} else if Isptr[et] != 0 || et == TCHAN || et == TMAP || et == TFUNC || et == TUNSAFEPTR {
 			on = syslook("printpointer", 1)
 			argtype(on, n.Type) // any-1
-		} else if Isslice(n.Type) != 0 {
+		} else if Isslice(n.Type) {
 			on = syslook("printslice", 1)
 			argtype(on, n.Type) // any-1
 		} else if Isint[et] != 0 {
@@ -2139,7 +2137,7 @@
 	return mkcall1(fn, Ptrto(t), nil, typename(t))
 }
 
-func isstack(n *Node) int {
+func isstack(n *Node) bool {
 	var defn *Node
 
 	n = outervalue(n)
@@ -2156,81 +2154,81 @@
 	switch n.Op {
 	// OINDREG only ends up in walk if it's indirect of SP.
 	case OINDREG:
-		return 1
+		return true
 
 	case ONAME:
 		switch n.Class {
 		case PAUTO,
 			PPARAM,
 			PPARAMOUT:
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
-func isglobal(n *Node) int {
+func isglobal(n *Node) bool {
 	n = outervalue(n)
 
 	switch n.Op {
 	case ONAME:
 		switch n.Class {
 		case PEXTERN:
-			return 1
+			return true
 		}
 	}
 
-	return 0
+	return false
 }
 
 // Do we need a write barrier for the assignment l = r?
-func needwritebarrier(l *Node, r *Node) int {
-	if !(use_writebarrier != 0) {
-		return 0
+func needwritebarrier(l *Node, r *Node) bool {
+	if use_writebarrier == 0 {
+		return false
 	}
 
 	if l == nil || isblank(l) {
-		return 0
+		return false
 	}
 
 	// No write barrier for write of non-pointers.
 	dowidth(l.Type)
 
 	if !haspointers(l.Type) {
-		return 0
+		return false
 	}
 
 	// No write barrier for write to stack.
-	if isstack(l) != 0 {
-		return 0
+	if isstack(l) {
+		return false
 	}
 
 	// No write barrier for implicit or explicit zeroing.
-	if r == nil || iszero(r) != 0 {
-		return 0
+	if r == nil || iszero(r) {
+		return false
 	}
 
 	// No write barrier for initialization to constant.
 	if r.Op == OLITERAL {
-		return 0
+		return false
 	}
 
 	// No write barrier for storing static (read-only) data.
 	if r.Op == ONAME && strings.HasPrefix(r.Sym.Name, "statictmp_") {
-		return 0
+		return false
 	}
 
 	// No write barrier for storing address of stack values,
 	// which are guaranteed only to be written to the stack.
-	if r.Op == OADDR && isstack(r.Left) != 0 {
-		return 0
+	if r.Op == OADDR && isstack(r.Left) {
+		return false
 	}
 
 	// No write barrier for storing address of global, which
 	// is live no matter what.
-	if r.Op == OADDR && isglobal(r.Left) != 0 {
-		return 0
+	if r.Op == OADDR && isglobal(r.Left) {
+		return false
 	}
 
 	// No write barrier for reslice: x = x[0:y] or x = append(x, ...).
@@ -2253,11 +2251,11 @@
 			Dump("bad reslice-r", r)
 		}
 
-		return 0
+		return false
 	}
 
 	// Otherwise, be conservative and use write barrier.
-	return 1
+	return true
 }
 
 // TODO(rsc): Perhaps componentgen should run before this.
@@ -2271,7 +2269,7 @@
 	var x int64
 	var name string
 
-	if n.Left != nil && n.Right != nil && needwritebarrier(n.Left, n.Right) != 0 {
+	if n.Left != nil && n.Right != nil && needwritebarrier(n.Left, n.Right) {
 		if Curfn != nil && Curfn.Nowritebarrier {
 			Yyerror("write barrier prohibited")
 		}
@@ -2282,9 +2280,9 @@
 			n = mkcall1(writebarrierfn("writebarrierptr", t, n.Right.Type), nil, init, l, n.Right)
 		} else if t.Etype == TSTRING {
 			n = mkcall1(writebarrierfn("writebarrierstring", t, n.Right.Type), nil, init, l, n.Right)
-		} else if Isslice(t) != 0 {
+		} else if Isslice(t) {
 			n = mkcall1(writebarrierfn("writebarrierslice", t, n.Right.Type), nil, init, l, n.Right)
-		} else if Isinter(t) != 0 {
+		} else if Isinter(t) {
 			n = mkcall1(writebarrierfn("writebarrieriface", t, n.Right.Type), nil, init, l, n.Right)
 		} else if t.Width <= int64(4*Widthptr) {
 			x = 0
@@ -2303,7 +2301,6 @@
 			switch t.Width / int64(Widthptr) {
 			default:
 				Fatal("found writebarrierfat for %d-byte object of type %v", int(t.Width), Tconv(t, 0))
-				fallthrough
 
 			case 2:
 				name = fmt.Sprintf("writebarrierfat%d%d", bvget(applywritebarrier_bv, PtrBit), bvget(applywritebarrier_bv, obj.BitsPerPointer+PtrBit))
@@ -2488,7 +2485,7 @@
 				continue
 			}
 
-			if l.Op == OINDEX && Isfixedarray(l.Left.Type) != 0 {
+			if l.Op == OINDEX && Isfixedarray(l.Left.Type) {
 				reorder3save(&l.Right, all, list, &early)
 				l = l.Left
 				continue
@@ -2500,7 +2497,6 @@
 		switch l.Op {
 		default:
 			Fatal("reorder3 unexpected lvalue %v", Oconv(int(l.Op), obj.FmtSharp))
-			fallthrough
 
 		case ONAME:
 			break
@@ -2537,7 +2533,7 @@
 	var q *Node
 
 	n = *np
-	if !(aliased(n, all, stop) != 0) {
+	if !aliased(n, all, stop) {
 		return
 	}
 
@@ -2562,7 +2558,7 @@
 			continue
 		}
 
-		if n.Op == OINDEX && Isfixedarray(n.Left.Type) != 0 {
+		if n.Op == OINDEX && Isfixedarray(n.Left.Type) {
 			n = n.Left
 			continue
 		}
@@ -2577,14 +2573,14 @@
  * Is it possible that the computation of n might be
  * affected by writes in as up to but not including stop?
  */
-func aliased(n *Node, all *NodeList, stop *NodeList) int {
+func aliased(n *Node, all *NodeList, stop *NodeList) bool {
 	var memwrite int
 	var varwrite int
 	var a *Node
 	var l *NodeList
 
 	if n == nil {
-		return 0
+		return false
 	}
 
 	// Look for obvious aliasing: a variable being assigned
@@ -2615,9 +2611,9 @@
 				continue
 			}
 
-			if vmatch2(a, n) != 0 {
+			if vmatch2(a, n) {
 				// Direct hit.
-				return 1
+				return true
 			}
 		}
 	}
@@ -2627,20 +2623,20 @@
 	// that are being written.
 
 	// If no computed addresses are affected by the writes, no aliasing.
-	if !(memwrite != 0) && !(varwrite != 0) {
-		return 0
+	if memwrite == 0 && varwrite == 0 {
+		return false
 	}
 
 	// If n does not refer to computed addresses
 	// (that is, if n only refers to variables whose addresses
 	// have not been taken), no aliasing.
-	if varexpr(n) != 0 {
-		return 0
+	if varexpr(n) {
+		return false
 	}
 
 	// Otherwise, both the writes and n refer to computed memory addresses.
 	// Assume that they might conflict.
-	return 1
+	return true
 }
 
 /*
@@ -2648,26 +2644,26 @@
  * whose addresses have not been taken?
  * (and no other memory)
  */
-func varexpr(n *Node) int {
+func varexpr(n *Node) bool {
 	if n == nil {
-		return 1
+		return true
 	}
 
 	switch n.Op {
 	case OLITERAL:
-		return 1
+		return true
 
 	case ONAME:
 		switch n.Class {
 		case PAUTO,
 			PPARAM,
 			PPARAMOUT:
-			if !(n.Addrtaken != 0) {
-				return 1
+			if n.Addrtaken == 0 {
+				return true
 			}
 		}
 
-		return 0
+		return false
 
 	case OADD,
 		OSUB,
@@ -2691,57 +2687,57 @@
 		OCONVNOP,
 		OCONVIFACE,
 		ODOTTYPE:
-		return bool2int(varexpr(n.Left) != 0 && varexpr(n.Right) != 0)
+		return varexpr(n.Left) && varexpr(n.Right)
 	}
 
 	// Be conservative.
-	return 0
+	return false
 }
 
 /*
  * is the name l mentioned in r?
  */
-func vmatch2(l *Node, r *Node) int {
+func vmatch2(l *Node, r *Node) bool {
 	var ll *NodeList
 
 	if r == nil {
-		return 0
+		return false
 	}
 	switch r.Op {
 	// match each right given left
 	case ONAME:
-		return bool2int(l == r)
+		return l == r
 
 	case OLITERAL:
-		return 0
+		return false
 	}
 
-	if vmatch2(l, r.Left) != 0 {
-		return 1
+	if vmatch2(l, r.Left) {
+		return true
 	}
-	if vmatch2(l, r.Right) != 0 {
-		return 1
+	if vmatch2(l, r.Right) {
+		return true
 	}
 	for ll = r.List; ll != nil; ll = ll.Next {
-		if vmatch2(l, ll.N) != 0 {
-			return 1
+		if vmatch2(l, ll.N) {
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
 /*
  * is any name mentioned in l also mentioned in r?
  * called by sinit.c
  */
-func vmatch1(l *Node, r *Node) int {
+func vmatch1(l *Node, r *Node) bool {
 	var ll *NodeList
 
 	/*
 	 * isolate all left sides
 	 */
 	if l == nil || r == nil {
-		return 0
+		return false
 	}
 	switch l.Op {
 	case ONAME:
@@ -2755,28 +2751,28 @@
 		// must be delayed if right has function calls.
 		default:
 			if r.Ullman >= UINF {
-				return 1
+				return true
 			}
 		}
 
 		return vmatch2(l, r)
 
 	case OLITERAL:
-		return 0
+		return false
 	}
 
-	if vmatch1(l.Left, r) != 0 {
-		return 1
+	if vmatch1(l.Left, r) {
+		return true
 	}
-	if vmatch1(l.Right, r) != 0 {
-		return 1
+	if vmatch1(l.Right, r) {
+		return true
 	}
 	for ll = l.List; ll != nil; ll = ll.Next {
-		if vmatch1(ll.N, r) != 0 {
-			return 1
+		if vmatch1(ll.N, r) {
+			return true
 		}
 	}
-	return 0
+	return false
 }
 
 /*
@@ -2807,7 +2803,7 @@
 			nn = list(nn, Nod(OAS, nodarg(t, 1), nil))
 		}
 
-		if v == nil || !(v.Class&PHEAP != 0) {
+		if v == nil || v.Class&PHEAP == 0 {
 			continue
 		}
 
@@ -3131,7 +3127,7 @@
 		// memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T))
 		nptr1 = Nod(OINDEX, s, Nod(OLEN, l1, nil))
 
-		nptr1.Bounded = 1
+		nptr1.Bounded = true
 		nptr1 = Nod(OADDR, nptr1, nil)
 
 		nptr2 = Nod(OSPTR, l2, nil)
@@ -3198,7 +3194,7 @@
 	nsrc = n.List.N
 
 	// Resolve slice type of multi-valued return.
-	if Istype(nsrc.Type, TSTRUCT) != 0 {
+	if Istype(nsrc.Type, TSTRUCT) {
 		nsrc.Type = nsrc.Type.Type.Type
 	}
 	argc = count(n.List) - 1
@@ -3232,7 +3228,7 @@
 
 	for a = n.List.Next; a != nil; a = a.Next {
 		nx = Nod(OINDEX, ns, nn) // s[n] ...
-		nx.Bounded = 1
+		nx.Bounded = true
 		l = list(l, Nod(OAS, nx, a.N)) // s[n] = arg
 		if a.Next != nil {
 			l = list(l, Nod(OAS, nn, Nod(OADD, nn, Nodintconst(1)))) // n = n + 1
@@ -3326,7 +3322,7 @@
 //
 func sliceany(n *Node, init **NodeList) *Node {
 	var bounded int
-	var slice3 int
+	var slice3 bool
 	var src *Node
 	var lb *Node
 	var hb *Node
@@ -3348,8 +3344,8 @@
 	src = n.Left
 
 	lb = n.Right.Left
-	slice3 = bool2int(n.Op == OSLICE3 || n.Op == OSLICE3ARR)
-	if slice3 != 0 {
+	slice3 = n.Op == OSLICE3 || n.Op == OSLICE3ARR
+	if slice3 {
 		hb = n.Right.Right.Left
 		cb = n.Right.Right.Right
 	} else {
@@ -3371,29 +3367,29 @@
 	// static checks if possible
 	bv = 1 << 50
 
-	if Isconst(bound, CTINT) != 0 {
-		if !(Smallintconst(bound) != 0) {
+	if Isconst(bound, CTINT) {
+		if !Smallintconst(bound) {
 			Yyerror("array len too large")
 		} else {
 			bv = Mpgetfix(bound.Val.U.Xval)
 		}
 	}
 
-	if Isconst(cb, CTINT) != 0 {
+	if Isconst(cb, CTINT) {
 		cbv = Mpgetfix(cb.Val.U.Xval)
 		if cbv < 0 || cbv > bv {
 			Yyerror("slice index out of bounds")
 		}
 	}
 
-	if Isconst(hb, CTINT) != 0 {
+	if Isconst(hb, CTINT) {
 		hbv = Mpgetfix(hb.Val.U.Xval)
 		if hbv < 0 || hbv > bv {
 			Yyerror("slice index out of bounds")
 		}
 	}
 
-	if Isconst(lb, CTINT) != 0 {
+	if Isconst(lb, CTINT) {
 		lbv = Mpgetfix(lb.Val.U.Xval)
 		if lbv < 0 || lbv > bv {
 			Yyerror("slice index out of bounds")
@@ -3430,24 +3426,24 @@
 
 	if cb != nil {
 		cb = cheapexpr(conv(cb, bt), init)
-		if !(bounded != 0) {
+		if bounded == 0 {
 			chk0 = Nod(OLT, bound, cb)
 		}
-	} else if slice3 != 0 {
+	} else if slice3 {
 		// When we figure out what this means, implement it.
 		Fatal("slice3 with cb == N") // rejected by parser
 	}
 
 	if hb != nil {
 		hb = cheapexpr(conv(hb, bt), init)
-		if !(bounded != 0) {
+		if bounded == 0 {
 			if cb != nil {
 				chk1 = Nod(OLT, cb, hb)
 			} else {
 				chk1 = Nod(OLT, bound, hb)
 			}
 		}
-	} else if slice3 != 0 {
+	} else if slice3 {
 		// When we figure out what this means, implement it.
 		Fatal("slice3 with hb == N") // rejected by parser
 	} else if n.Op == OSLICEARR {
@@ -3461,7 +3457,7 @@
 
 	if lb != nil {
 		lb = cheapexpr(conv(lb, bt), init)
-		if !(bounded != 0) {
+		if bounded == 0 {
 			chk2 = Nod(OLT, hb, lb)
 		}
 	}
@@ -3501,7 +3497,7 @@
 	n.Right = nil
 
 	n.List = nil
-	if !(slice3 != 0) {
+	if !slice3 {
 		cb = bound
 	}
 	if lb == nil {
@@ -3623,10 +3619,10 @@
 	l = nil
 
 	r = nil
-	if Isinter(n.Left.Type) != 0 && !(Isinter(n.Right.Type) != 0) {
+	if Isinter(n.Left.Type) && !Isinter(n.Right.Type) {
 		l = n.Left
 		r = n.Right
-	} else if !(Isinter(n.Left.Type) != 0) && Isinter(n.Right.Type) != 0 {
+	} else if !Isinter(n.Left.Type) && Isinter(n.Right.Type) {
 		l = n.Right
 		r = n.Left
 	}
@@ -3667,7 +3663,7 @@
 		return
 
 	case TARRAY:
-		if Isslice(t) != 0 {
+		if Isslice(t) {
 			return
 		}
 
@@ -3684,7 +3680,7 @@
 		cmpr = cmpr.Left
 	}
 
-	if !(islvalue(cmpl) != 0) || !(islvalue(cmpr) != 0) {
+	if !islvalue(cmpl) || !islvalue(cmpr) {
 		Fatal("arguments of comparison must be lvalues - %v %v", Nconv(cmpl, 0), Nconv(cmpr, 0))
 	}
 
@@ -3721,7 +3717,7 @@
 		}
 
 		if expr == nil {
-			expr = Nodbool(bool2int(n.Op == OEQ))
+			expr = Nodbool(n.Op == OEQ)
 		}
 		r = expr
 		goto ret
@@ -3745,7 +3741,7 @@
 		}
 
 		if expr == nil {
-			expr = Nodbool(bool2int(n.Op == OEQ))
+			expr = Nodbool(n.Op == OEQ)
 		}
 		r = expr
 		goto ret
@@ -3778,30 +3774,30 @@
 	return
 }
 
-func samecheap(a *Node, b *Node) int {
+func samecheap(a *Node, b *Node) bool {
 	var ar *Node
 	var br *Node
 	for a != nil && b != nil && a.Op == b.Op {
 		switch a.Op {
 		default:
-			return 0
+			return false
 
 		case ONAME:
-			return bool2int(a == b)
+			return a == b
 
 		case ODOT,
 			ODOTPTR:
 			ar = a.Right
 			br = b.Right
 			if ar.Op != ONAME || br.Op != ONAME || ar.Sym != br.Sym {
-				return 0
+				return false
 			}
 
 		case OINDEX:
 			ar = a.Right
 			br = b.Right
-			if !(Isconst(ar, CTINT) != 0) || !(Isconst(br, CTINT) != 0) || Mpcmpfixfix(ar.Val.U.Xval, br.Val.U.Xval) != 0 {
-				return 0
+			if !Isconst(ar, CTINT) || !Isconst(br, CTINT) || Mpcmpfixfix(ar.Val.U.Xval, br.Val.U.Xval) != 0 {
+				return false
 			}
 		}
 
@@ -3809,7 +3805,7 @@
 		b = b.Left
 	}
 
-	return 0
+	return false
 }
 
 func walkrotate(np **Node) {
@@ -3836,14 +3832,14 @@
 	}
 
 	// Want same, side effect-free expression on lhs of both shifts.
-	if !(samecheap(l.Left, r.Left) != 0) {
+	if !samecheap(l.Left, r.Left) {
 		return
 	}
 
 	// Constants adding to width?
 	w = int(l.Type.Width * 8)
 
-	if Smallintconst(l.Right) != 0 && Smallintconst(r.Right) != 0 {
+	if Smallintconst(l.Right) && Smallintconst(r.Right) {
 		sl = int(Mpgetfix(l.Right.Val.U.Xval))
 		if sl >= 0 {
 			sr = int(Mpgetfix(r.Right.Val.U.Xval))
@@ -3889,7 +3885,7 @@
 	var w int
 
 	n = *np
-	if !(Isint[n.Type.Etype] != 0) {
+	if Isint[n.Type.Etype] == 0 {
 		return
 	}
 
@@ -4240,46 +4236,46 @@
 }
 
 // return 1 if integer n must be in range [0, max), 0 otherwise
-func bounded(n *Node, max int64) int {
+func bounded(n *Node, max int64) bool {
 	var v int64
 	var bits int32
 	var sign int
 
-	if n.Type == nil || !(Isint[n.Type.Etype] != 0) {
-		return 0
+	if n.Type == nil || Isint[n.Type.Etype] == 0 {
+		return false
 	}
 
 	sign = int(Issigned[n.Type.Etype])
 	bits = int32(8 * n.Type.Width)
 
-	if Smallintconst(n) != 0 {
+	if Smallintconst(n) {
 		v = Mpgetfix(n.Val.U.Xval)
-		return bool2int(0 <= v && v < max)
+		return 0 <= v && v < max
 	}
 
 	switch n.Op {
 	case OAND:
 		v = -1
-		if Smallintconst(n.Left) != 0 {
+		if Smallintconst(n.Left) {
 			v = Mpgetfix(n.Left.Val.U.Xval)
-		} else if Smallintconst(n.Right) != 0 {
+		} else if Smallintconst(n.Right) {
 			v = Mpgetfix(n.Right.Val.U.Xval)
 		}
 
 		if 0 <= v && v < max {
-			return 1
+			return true
 		}
 
 	case OMOD:
-		if !(sign != 0) && Smallintconst(n.Right) != 0 {
+		if sign == 0 && Smallintconst(n.Right) {
 			v = Mpgetfix(n.Right.Val.U.Xval)
 			if 0 <= v && v <= max {
-				return 1
+				return true
 			}
 		}
 
 	case ODIV:
-		if !(sign != 0) && Smallintconst(n.Right) != 0 {
+		if sign == 0 && Smallintconst(n.Right) {
 			v = Mpgetfix(n.Right.Val.U.Xval)
 			for bits > 0 && v >= 2 {
 				bits--
@@ -4288,34 +4284,33 @@
 		}
 
 	case ORSH:
-		if !(sign != 0) && Smallintconst(n.Right) != 0 {
+		if sign == 0 && Smallintconst(n.Right) {
 			v = Mpgetfix(n.Right.Val.U.Xval)
 			if v > int64(bits) {
-				return 1
+				return true
 			}
 			bits -= int32(v)
 		}
 	}
 
-	if !(sign != 0) && bits <= 62 && 1<<uint(bits) <= max {
-		return 1
+	if sign == 0 && bits <= 62 && 1<<uint(bits) <= max {
+		return true
 	}
 
-	return 0
+	return false
 }
 
 func usefield(n *Node) {
 	var field *Type
 	var l *Type
 
-	if !(obj.Fieldtrack_enabled != 0) {
+	if obj.Fieldtrack_enabled == 0 {
 		return
 	}
 
 	switch n.Op {
 	default:
 		Fatal("usefield %v", Oconv(int(n.Op), 0))
-		fallthrough
 
 	case ODOT,
 		ODOTPTR:
@@ -4352,23 +4347,23 @@
 	Curfn.Paramfld = l
 }
 
-func candiscardlist(l *NodeList) int {
+func candiscardlist(l *NodeList) bool {
 	for ; l != nil; l = l.Next {
-		if !(candiscard(l.N) != 0) {
-			return 0
+		if !candiscard(l.N) {
+			return false
 		}
 	}
-	return 1
+	return true
 }
 
-func candiscard(n *Node) int {
+func candiscard(n *Node) bool {
 	if n == nil {
-		return 1
+		return true
 	}
 
 	switch n.Op {
 	default:
-		return 0
+		return false
 
 		// Discardable as long as the subpieces are.
 	case ONAME,
@@ -4428,32 +4423,32 @@
 		// Discardable as long as we know it's not division by zero.
 	case ODIV,
 		OMOD:
-		if Isconst(n.Right, CTINT) != 0 && mpcmpfixc(n.Right.Val.U.Xval, 0) != 0 {
+		if Isconst(n.Right, CTINT) && mpcmpfixc(n.Right.Val.U.Xval, 0) != 0 {
 			break
 		}
-		if Isconst(n.Right, CTFLT) != 0 && mpcmpfltc(n.Right.Val.U.Fval, 0) != 0 {
+		if Isconst(n.Right, CTFLT) && mpcmpfltc(n.Right.Val.U.Fval, 0) != 0 {
 			break
 		}
-		return 0
+		return false
 
 		// Discardable as long as we know it won't fail because of a bad size.
 	case OMAKECHAN,
 		OMAKEMAP:
-		if Isconst(n.Left, CTINT) != 0 && mpcmpfixc(n.Left.Val.U.Xval, 0) == 0 {
+		if Isconst(n.Left, CTINT) && mpcmpfixc(n.Left.Val.U.Xval, 0) == 0 {
 			break
 		}
-		return 0
+		return false
 
 		// Difficult to tell what sizes are okay.
 	case OMAKESLICE:
-		return 0
+		return false
 	}
 
-	if !(candiscard(n.Left) != 0) || !(candiscard(n.Right) != 0) || !(candiscard(n.Ntest) != 0) || !(candiscard(n.Nincr) != 0) || !(candiscardlist(n.Ninit) != 0) || !(candiscardlist(n.Nbody) != 0) || !(candiscardlist(n.Nelse) != 0) || !(candiscardlist(n.List) != 0) || !(candiscardlist(n.Rlist) != 0) {
-		return 0
+	if !candiscard(n.Left) || !candiscard(n.Right) || !candiscard(n.Ntest) || !candiscard(n.Nincr) || !candiscardlist(n.Ninit) || !candiscardlist(n.Nbody) || !candiscardlist(n.Nelse) || !candiscardlist(n.List) || !candiscardlist(n.Rlist) {
+		return false
 	}
 
-	return 1
+	return true
 }
 
 // rewrite
diff --git a/src/cmd/internal/gc/y.go b/src/cmd/internal/gc/y.go
index 0e9157c..5b79856 100644
--- a/src/cmd/internal/gc/y.go
+++ b/src/cmd/internal/gc/y.go
@@ -851,6 +851,7 @@
 }
 
 type yyParser interface {
+	Parse(yyLexer) int
 	Lookahead() int
 }
 
@@ -862,6 +863,13 @@
 	return p.lookahead()
 }
 
+func yyNewParser() yyParser {
+	p := &yyParserImpl{
+		lookahead: func() int { return -1 },
+	}
+	return p
+}
+
 const yyFlag = -1000
 
 func yyTokname(c int) string {
@@ -919,6 +927,10 @@
 }
 
 func yyParse(yylex yyLexer) int {
+	return yyNewParser().Parse(yylex)
+}
+
+func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int {
 	var yyn int
 	var yylval yySymType
 	var yyVAL yySymType
@@ -930,19 +942,12 @@
 	yystate := 0
 	yychar := -1
 	yytoken := -1 // yychar translated into internal numbering
-	if lx, ok := yylex.(interface {
-		SetParser(yyParser)
-	}); ok {
-		p := &yyParserImpl{
-			lookahead: func() int { return yychar },
-		}
-		lx.SetParser(p)
-		defer func() {
-			// Make sure we report no lookahead when not parsing.
-			yychar = -1
-			yytoken = -1
-		}()
-	}
+	yyrcvr.lookahead = func() int { return yychar }
+	defer func() {
+		// Make sure we report no lookahead when not parsing.
+		yychar = -1
+		yytoken = -1
+	}()
 	yyp := -1
 	goto yystack