cmd/compile: cleanup code in getInstInfo to use switch statement

Simple cleanup: convert a bunch of if's to a switch statement in
getInstInfo. Also, use a few extra variables to avoid repeated node
conversions (such as n.(*ir.CallExpr))

Change-Id: I7a2a4efb569415256a8bc9350fb100bd2d8cfb39
Reviewed-on: https://go-review.googlesource.com/c/go/+/356311
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Trust: Dan Scales <danscales@google.com>
diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go
index 3a1baea..592de70 100644
--- a/src/cmd/compile/internal/noder/stencil.go
+++ b/src/cmd/compile/internal/noder/stencil.go
@@ -28,8 +28,8 @@
 	base.Assert(p)
 }
 
-// Temporary - for outputting information on derived types, dictionaries, sub-dictionaries.
-// Turn off when running tests.
+// For outputting debug information on dictionary format and instantiated dictionaries
+// (type arg, derived types, sub-dictionary, and itab entries).
 var infoPrintMode = false
 
 func infoPrint(format string, a ...interface{}) {
@@ -1861,15 +1861,16 @@
 
 	var visitFunc func(ir.Node)
 	visitFunc = func(n ir.Node) {
-		if n.Op() == ir.OFUNCINST && !callMap[n] {
-			if hasShapeNodes(n.(*ir.InstExpr).Targs) {
+		switch n.Op() {
+		case ir.OFUNCINST:
+			if !callMap[n] && hasShapeNodes(n.(*ir.InstExpr).Targs) {
 				infoPrint("  Closure&subdictionary required at generic function value %v\n", n.(*ir.InstExpr).X)
 				info.subDictCalls = append(info.subDictCalls, n)
 			}
-		} else if (n.Op() == ir.OMETHEXPR || n.Op() == ir.OMETHVALUE) && !callMap[n] &&
-			!types.IsInterfaceMethod(n.(*ir.SelectorExpr).Selection.Type) &&
-			len(deref(n.(*ir.SelectorExpr).X.Type()).RParams()) > 0 {
-			if hasShapeTypes(deref(n.(*ir.SelectorExpr).X.Type()).RParams()) {
+		case ir.OMETHEXPR, ir.OMETHVALUE:
+			if !callMap[n] && !types.IsInterfaceMethod(n.(*ir.SelectorExpr).Selection.Type) &&
+				len(deref(n.(*ir.SelectorExpr).X.Type()).RParams()) > 0 &&
+				hasShapeTypes(deref(n.(*ir.SelectorExpr).X.Type()).RParams()) {
 				if n.(*ir.SelectorExpr).X.Op() == ir.OTYPE {
 					infoPrint("  Closure&subdictionary required at generic meth expr %v\n", n)
 				} else {
@@ -1877,43 +1878,48 @@
 				}
 				info.subDictCalls = append(info.subDictCalls, n)
 			}
-		}
-		if n.Op() == ir.OCALL && n.(*ir.CallExpr).X.Op() == ir.OFUNCINST {
-			callMap[n.(*ir.CallExpr).X] = true
-			if hasShapeNodes(n.(*ir.CallExpr).X.(*ir.InstExpr).Targs) {
-				infoPrint("  Subdictionary at generic function/method call: %v - %v\n", n.(*ir.CallExpr).X.(*ir.InstExpr).X, n)
+		case ir.OCALL:
+			ce := n.(*ir.CallExpr)
+			if ce.X.Op() == ir.OFUNCINST {
+				callMap[ce.X] = true
+				if hasShapeNodes(ce.X.(*ir.InstExpr).Targs) {
+					infoPrint("  Subdictionary at generic function/method call: %v - %v\n", ce.X.(*ir.InstExpr).X, n)
+					info.subDictCalls = append(info.subDictCalls, n)
+				}
+			}
+			if ce.X.Op() == ir.OXDOT &&
+				isShapeDeref(ce.X.(*ir.SelectorExpr).X.Type()) {
+				callMap[ce.X] = true
+				infoPrint("  Optional subdictionary at generic bound call: %v\n", n)
 				info.subDictCalls = append(info.subDictCalls, n)
 			}
-		}
-		if n.Op() == ir.OCALLMETH && n.(*ir.CallExpr).X.Op() == ir.ODOTMETH &&
-			len(deref(n.(*ir.CallExpr).X.(*ir.SelectorExpr).X.Type()).RParams()) > 0 {
-			callMap[n.(*ir.CallExpr).X] = true
-			if hasShapeTypes(deref(n.(*ir.CallExpr).X.(*ir.SelectorExpr).X.Type()).RParams()) {
-				infoPrint("  Subdictionary at generic method call: %v\n", n)
-				info.subDictCalls = append(info.subDictCalls, n)
+		case ir.OCALLMETH:
+			ce := n.(*ir.CallExpr)
+			if ce.X.Op() == ir.ODOTMETH &&
+				len(deref(ce.X.(*ir.SelectorExpr).X.Type()).RParams()) > 0 {
+				callMap[ce.X] = true
+				if hasShapeTypes(deref(ce.X.(*ir.SelectorExpr).X.Type()).RParams()) {
+					infoPrint("  Subdictionary at generic method call: %v\n", n)
+					info.subDictCalls = append(info.subDictCalls, n)
+				}
 			}
-		}
-		if n.Op() == ir.OCALL && n.(*ir.CallExpr).X.Op() == ir.OXDOT &&
-			isShapeDeref(n.(*ir.CallExpr).X.(*ir.SelectorExpr).X.Type()) {
-			callMap[n.(*ir.CallExpr).X] = true
-			infoPrint("  Optional subdictionary at generic bound call: %v\n", n)
-			info.subDictCalls = append(info.subDictCalls, n)
-		}
-		if n.Op() == ir.OCONVIFACE && n.Type().IsInterface() &&
-			!n.Type().IsEmptyInterface() &&
-			n.(*ir.ConvExpr).X.Type().HasShape() {
-			infoPrint("  Itab for interface conv: %v\n", n)
-			info.itabConvs = append(info.itabConvs, n)
-		}
-		if n.Op() == ir.OXDOT && n.(*ir.SelectorExpr).X.Type().IsShape() {
-			infoPrint("  Itab for bound call: %v\n", n)
-			info.itabConvs = append(info.itabConvs, n)
-		}
-		if (n.Op() == ir.ODOTTYPE || n.Op() == ir.ODOTTYPE2) && !n.(*ir.TypeAssertExpr).Type().IsInterface() && !n.(*ir.TypeAssertExpr).X.Type().IsEmptyInterface() {
-			infoPrint("  Itab for dot type: %v\n", n)
-			info.itabConvs = append(info.itabConvs, n)
-		}
-		if n.Op() == ir.OCLOSURE {
+		case ir.OCONVIFACE:
+			if n.Type().IsInterface() && !n.Type().IsEmptyInterface() &&
+				n.(*ir.ConvExpr).X.Type().HasShape() {
+				infoPrint("  Itab for interface conv: %v\n", n)
+				info.itabConvs = append(info.itabConvs, n)
+			}
+		case ir.OXDOT:
+			if n.(*ir.SelectorExpr).X.Type().IsShape() {
+				infoPrint("  Itab for bound call: %v\n", n)
+				info.itabConvs = append(info.itabConvs, n)
+			}
+		case ir.ODOTTYPE, ir.ODOTTYPE2:
+			if !n.(*ir.TypeAssertExpr).Type().IsInterface() && !n.(*ir.TypeAssertExpr).X.Type().IsEmptyInterface() {
+				infoPrint("  Itab for dot type: %v\n", n)
+				info.itabConvs = append(info.itabConvs, n)
+			}
+		case ir.OCLOSURE:
 			// Visit the closure body and add all relevant entries to the
 			// dictionary of the outer function (closure will just use
 			// the dictionary of the outer function).
@@ -1924,18 +1930,21 @@
 			for _, n := range cfunc.Dcl {
 				n.DictIndex = uint16(findDictType(instInfo, n.Type()) + 1)
 			}
-		}
-		if n.Op() == ir.OSWITCH && n.(*ir.SwitchStmt).Tag != nil && n.(*ir.SwitchStmt).Tag.Op() == ir.OTYPESW && !n.(*ir.SwitchStmt).Tag.(*ir.TypeSwitchGuard).X.Type().IsEmptyInterface() {
-			for _, cc := range n.(*ir.SwitchStmt).Cases {
-				for _, c := range cc.List {
-					if c.Op() == ir.OTYPE && c.Type().HasShape() {
-						// Type switch from a non-empty interface - might need an itab.
-						infoPrint("  Itab for type switch: %v\n", c)
-						info.itabConvs = append(info.itabConvs, c)
-						if info.type2switchType == nil {
-							info.type2switchType = map[ir.Node]*types.Type{}
+		case ir.OSWITCH:
+			ss := n.(*ir.SwitchStmt)
+			if ss.Tag != nil && ss.Tag.Op() == ir.OTYPESW &&
+				!ss.Tag.(*ir.TypeSwitchGuard).X.Type().IsEmptyInterface() {
+				for _, cc := range ss.Cases {
+					for _, c := range cc.List {
+						if c.Op() == ir.OTYPE && c.Type().HasShape() {
+							// Type switch from a non-empty interface - might need an itab.
+							infoPrint("  Itab for type switch: %v\n", c)
+							info.itabConvs = append(info.itabConvs, c)
+							if info.type2switchType == nil {
+								info.type2switchType = map[ir.Node]*types.Type{}
+							}
+							info.type2switchType[c] = ss.Tag.(*ir.TypeSwitchGuard).X.Type()
 						}
-						info.type2switchType[c] = n.(*ir.SwitchStmt).Tag.(*ir.TypeSwitchGuard).X.Type()
 					}
 				}
 			}