go/src
Brian Kessler 4d9dd35806 cmd/compile: add signed divisibility rules
"Division by invariant integers using multiplication" paper
by Granlund and Montgomery contains a method for directly computing
divisibility (x%c == 0 for c constant) by means of the modular inverse.
The method is further elaborated in "Hacker's Delight" by Warren Section 10-17

This general rule can compute divisibilty by one multiplication, and add
and a compare for odd divisors and an additional rotate for even divisors.

To apply the divisibility rule, we must take into account
the rules to rewrite x%c = x-((x/c)*c) and (x/c) for c constant on the first
optimization pass "opt".  This complicates the matching as we want to match
only in the cases where the result of (x/c) is not also needed.
So, we must match on the expanded form of (x/c) in the expression x == c*(x/c)
in the "late opt" pass after common subexpresion elimination.

Note, that if there is an intermediate opt pass introduced in the future we
could simplify these rules by delaying the magic division rewrite to "late opt"
and matching directly on (x/c) in the intermediate opt pass.

On amd64, the divisibility check is 30-45% faster.

name                     old time/op  new time/op  delta`
DivisiblePow2constI64-4  0.83ns ± 1%  0.82ns ± 0%     ~     (p=0.079 n=5+4)
DivisibleconstI64-4      2.68ns ± 1%  1.87ns ± 0%  -30.33%  (p=0.000 n=5+4)
DivisibleWDivconstI64-4  2.69ns ± 1%  2.71ns ± 3%     ~     (p=1.000 n=5+5)
DivisiblePow2constI32-4  1.15ns ± 1%  1.15ns ± 0%     ~     (p=0.238 n=5+4)
DivisibleconstI32-4      2.24ns ± 1%  1.20ns ± 0%  -46.48%  (p=0.016 n=5+4)
DivisibleWDivconstI32-4  2.27ns ± 1%  2.27ns ± 1%     ~     (p=0.683 n=5+5)
DivisiblePow2constI16-4  0.81ns ± 1%  0.82ns ± 1%     ~     (p=0.135 n=5+5)
DivisibleconstI16-4      2.11ns ± 2%  1.20ns ± 1%  -42.99%  (p=0.008 n=5+5)
DivisibleWDivconstI16-4  2.23ns ± 0%  2.27ns ± 2%   +1.79%  (p=0.029 n=4+4)
DivisiblePow2constI8-4   0.81ns ± 1%  0.81ns ± 1%     ~     (p=0.286 n=5+5)
DivisibleconstI8-4       2.13ns ± 3%  1.19ns ± 1%  -43.84%  (p=0.008 n=5+5)
DivisibleWDivconstI8-4   2.23ns ± 1%  2.25ns ± 1%     ~     (p=0.183 n=5+5)

Fixes #30282
Fixes #15806

Change-Id: Id20d78263a4fdfe0509229ae4dfa2fede83fc1d0
Reviewed-on: https://go-review.googlesource.com/c/go/+/173998
Run-TryBot: Brian Kessler <brian.m.kessler@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
2019-04-30 22:02:07 +00:00
..
archive
bufio
builtin
bytes bytes, internal/bytealg: simplify Equal 2019-04-24 00:56:36 +00:00
cmd cmd/compile: add signed divisibility rules 2019-04-30 22:02:07 +00:00
compress
container
context all: s/cancelation/cancellation/ 2019-04-16 20:27:15 +00:00
crypto all: remove a few unused parameters 2019-04-29 13:31:54 +00:00
database/sql database/sql: add NullInt32 2019-04-26 21:54:41 +00:00
debug all: add new GOOS=illumos, split out of GOOS=solaris 2019-04-30 16:59:13 +00:00
encoding encoding/gob: adding missing fuzz skip to one of the fuzz tests 2019-04-30 18:20:58 +00:00
errors
expvar expvar: improve Map.addKey for large number of keys 2019-04-16 17:18:01 +00:00
flag
fmt
go all: add new GOOS=illumos, split out of GOOS=solaris 2019-04-30 16:59:13 +00:00
hash
html html: add a Fuzz function 2019-04-30 15:48:46 +00:00
image
index/suffixarray
internal bytes, internal/bytealg: simplify Equal 2019-04-24 00:56:36 +00:00
io
log
math math: consolidate assembly stub implementations 2019-04-23 14:50:16 +00:00
mime
net net/http: make Server return 501 for unsupported transfer-encodings 2019-04-30 19:23:58 +00:00
os os: fix tests on self-hosted Go builds 2019-04-30 20:30:30 +00:00
path
plugin
reflect all: refer to map elements as elements instead of values 2019-04-30 18:18:12 +00:00
regexp
runtime all: refer to map elements as elements instead of values 2019-04-30 18:18:12 +00:00
sort
strconv strconv: Document ParseFloat's special cases 2019-04-29 11:07:31 +00:00
strings strings: remove "a copy of the string" from ToUpper/ToLower comments 2019-04-14 16:19:31 +00:00
sync sync: update comment 2019-04-19 16:15:36 +00:00
syscall all: add new GOOS=illumos, split out of GOOS=solaris 2019-04-30 16:59:13 +00:00
testdata
testing testing: delay flag registration; move to an Init function 2019-04-29 19:54:30 +00:00
text all: remove a few unused parameters 2019-04-29 13:31:54 +00:00
time time: look for zoneinfo.zip in GOROOT 2019-04-30 19:13:43 +00:00
unicode all: update to Unicode 11 2019-04-25 20:33:22 +00:00
unsafe
vendor vendor: pull in text@v0.3.2 2019-04-26 19:27:51 +00:00
Make.dist
all.bash
all.bat
all.rc
bootstrap.bash bootstrap.bash: preserve file times when copying 2019-04-27 14:36:00 +00:00
buildall.bash
clean.bash
clean.bat
clean.rc
cmp.bash
go.mod vendor: pull in text@v0.3.2 2019-04-26 19:27:51 +00:00
go.sum vendor: pull in text@v0.3.2 2019-04-26 19:27:51 +00:00
iostest.bash
make.bash cmd/go: add env -w and env -u to set and unset default env vars 2019-04-23 00:58:08 +00:00
make.bat cmd/go: add env -w and env -u to set and unset default env vars 2019-04-23 00:58:08 +00:00
make.rc cmd/go: add env -w and env -u to set and unset default env vars 2019-04-23 00:58:08 +00:00
naclmake.bash
nacltest.bash
race.bash
race.bat
run.bash
run.bat
run.rc