1
0
mirror of https://github.com/golang/go synced 2024-11-18 08:44:43 -07:00

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>
This commit is contained in:
Cuong Manh Le 2020-04-01 05:27:49 +07:00 committed by Matthew Dempsky
parent 82253ddc7a
commit 6edd7971bb

View File

@ -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)