mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: recognize integer ranges in switch statements
Consider a switch statement like:
switch x {
case 1:
// ...
case 2, 3, 4, 5, 6:
// ...
case 5:
// ...
}
Prior to this CL, the generated code treated
2, 3, 4, 5, and 6 independently in a binary search.
With this CL, the generated code checks whether
2 <= x && x <= 6.
walkinrange then optimizes that range check
into a single unsigned comparison.
Experiments suggest that the best min range size
is 2, using binary size as a proxy for optimization.
Binary sizes before/after this CL:
cmd/compile: 14209728 / 14165360
cmd/go: 9543100 / 9539004
Change-Id: If2f7fb97ca80468fa70351ef540866200c4c996c
Reviewed-on: https://go-review.googlesource.com/26770
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
5c3edc46a6
commit
8c85e23087
3 changed files with 141 additions and 22 deletions
|
|
@ -436,7 +436,7 @@ const (
|
|||
// statements
|
||||
OBLOCK // { List } (block of code)
|
||||
OBREAK // break
|
||||
OCASE // case Left: Nbody (select case after processing; Left==nil means default)
|
||||
OCASE // case Left or List[0]..List[1]: Nbody (select case after processing; Left==nil and List==nil means default)
|
||||
OXCASE // case List: Nbody (select case before processing; List==nil means default)
|
||||
OCONTINUE // continue
|
||||
ODEFER // defer Left (Left must be call)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue