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:
parent
82253ddc7a
commit
6edd7971bb
@ -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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user