cmd/compile: optimize len check when make slice

In CL 226278, we did:

	if len < 0 { panicmakeslicelen }
	if len > cap { panicmakeslicecap }

But due to the fact that cap is constrained to [0,2^31), so it is safe
to do:

	if uint64(len) > cap {
	    if len < 0 { panicmakeslicelen() }
	    panicmakeslicecap()
	}

save us a comparison in common case when len is within range.

Passes toolstash-check.

Change-Id: I0ebd52914ccde4cbb45f16c9e020b0c8f42e0663
Reviewed-on: https://go-review.googlesource.com/c/go/+/226737
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index dfc9d9a..14d088c 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -1338,15 +1338,16 @@
 				Fatalf("walkexpr: invalid index %v", r)
 			}
 
-			// if len < 0 { panicmakeslicelen }
-			nif := nod(OIF, nod(OLT, l, nodintconst(0)), nil)
-			nif.Nbody.Set1(mkcall("panicmakeslicelen", nil, init))
-			nif = typecheck(nif, ctxStmt)
-			init.Append(nif)
-
-			// if len > cap { panicmakeslicecap }
-			nif = nod(OIF, nod(OGT, conv(l, types.Types[TUINT64]), nodintconst(i)), nil)
-			nif.Nbody.Set1(mkcall("panicmakeslicecap", nil, init))
+			// cap is constrained to [0,2^31), so it's safe to do:
+			//
+			// if uint64(len) > cap {
+			//     if len < 0 { panicmakeslicelen() }
+			//     panicmakeslicecap()
+			// }
+			nif := nod(OIF, nod(OGT, conv(l, types.Types[TUINT64]), nodintconst(i)), nil)
+			niflen := nod(OIF, nod(OLT, l, nodintconst(0)), nil)
+			niflen.Nbody.Set1(mkcall("panicmakeslicelen", nil, init))
+			nif.Nbody.Append(niflen, mkcall("panicmakeslicecap", nil, init))
 			nif = typecheck(nif, ctxStmt)
 			init.Append(nif)