cmd/compile: simplify keydup

Use a type switch instead of calling Val.Ctype (which in turn just
uses a type switch anyway).

Use continue statements to simplify the control flow.

Change-Id: I65c139d706d4d78e5b4ce09d1b1505a3e424496b
Reviewed-on: https://go-review.googlesource.com/21173
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go
index 6feb5fb..78c177e 100644
--- a/src/cmd/compile/internal/gc/go.go
+++ b/src/cmd/compile/internal/gc/go.go
@@ -12,7 +12,6 @@
 
 const (
 	UINF            = 100
-	PRIME1          = 3
 	BADWIDTH        = -1000000000
 	MaxStackVarSize = 10 * 1024 * 1024
 )
diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go
index 1f9b1c8..e364d56 100644
--- a/src/cmd/compile/internal/gc/typecheck.go
+++ b/src/cmd/compile/internal/gc/typecheck.go
@@ -2782,27 +2782,26 @@
 		return // we don't check variables
 	}
 
+	const PRIME1 = 3
+
 	var h uint32
-	switch n.Val().Ctype() {
+	switch v := n.Val().U.(type) {
 	default: // unknown, bool, nil
 		h = 23
 
-	case CTINT, CTRUNE:
-		h = uint32(n.Val().U.(*Mpint).Int64())
+	case *Mpint:
+		h = uint32(v.Int64())
 
-	case CTFLT:
-		d := n.Val().U.(*Mpflt).Float64()
-		x := math.Float64bits(d)
+	case *Mpflt:
+		x := math.Float64bits(v.Float64())
 		for i := 0; i < 8; i++ {
 			h = h*PRIME1 + uint32(x&0xFF)
 			x >>= 8
 		}
 
-	case CTSTR:
-		h = 0
-		s := n.Val().U.(string)
-		for i := 0; i < len(s); i++ {
-			h = h*PRIME1 + uint32(s[i])
+	case string:
+		for i := 0; i < len(v); i++ {
+			h = h*PRIME1 + uint32(v[i])
 		}
 	}
 
@@ -2810,25 +2809,19 @@
 	for _, a := range hash[h] {
 		cmp.Op = OEQ
 		cmp.Left = n
-		b := false
 		if a.Op == OCONVIFACE && orign.Op == OCONVIFACE {
-			if Eqtype(a.Left.Type, n.Type) {
-				cmp.Right = a.Left
-				evconst(&cmp)
-				if cmp.Op == OLITERAL {
-					// Sometimes evconst fails. See issue 12536.
-					b = cmp.Val().U.(bool)
-				}
-			}
-		} else if Eqtype(a.Type, n.Type) {
-			cmp.Right = a
-			evconst(&cmp)
-			if cmp.Op == OLITERAL {
-				b = cmp.Val().U.(bool)
-			}
+			a = a.Left
 		}
-
-		if b {
+		if !Eqtype(a.Type, n.Type) {
+			continue
+		}
+		cmp.Right = a
+		evconst(&cmp)
+		if cmp.Op != OLITERAL {
+			// Sometimes evconst fails. See issue 12536.
+			continue
+		}
+		if cmp.Val().U.(bool) {
 			Yyerror("duplicate key %v in map literal", n)
 			return
 		}