From: Cuong Manh Le Date: Tue, 31 Mar 2020 22:27:49 +0000 (+0700) Subject: cmd/compile: optimize len check when make slice X-Git-Tag: go1.15beta1~696 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6edd7971bb3e83356544b2cd6e7a93fdabff1246;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index dfc9d9aa22..14d088c7fd 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -1338,15 +1338,16 @@ opswitch: 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)