1
0
mirror of https://github.com/golang/go synced 2024-11-24 08:40:14 -07:00
go/test
Alexandru Moșoi b91cc53033 cmd/compile/internal/ssa: BCE for induction variables
There are 5293 loop in the main go repository.
A survey of the top most common for loops:

     18 for __k__ := 0; i < len(sa.Addr); i++ {
     19 for __k__ := 0; ; i++ {
     19 for __k__ := 0; i < 16; i++ {
     25 for __k__ := 0; i < length; i++ {
     30 for __k__ := 0; i < 8; i++ {
     49 for __k__ := 0; i < len(s); i++ {
     67 for __k__ := 0; i < n; i++ {
    376 for __k__ := range __slice__ {
    685 for __k__, __v__ := range __slice__ {
   2074 for __, __v__ := range __slice__ {

The algorithm to find induction variables handles all cases
with an upper limit. It currently doesn't find related induction
variables such as c * ind or c + ind.

842 out of 22954 bound checks are removed for src/make.bash.
1957 out of 42952 bounds checks are removed for src/all.bash.

Things to do in follow-up CLs:
* Find the associated pointer for `for _, v := range a {}`
* Drop the NilChecks on the pointer.
* Replace the implicit induction variable by a loop over the pointer

Generated garbage can be reduced if we share the sdom between passes.

% benchstat old.txt new.txt
name       old time/op     new time/op     delta
Template       337ms ± 3%      333ms ± 3%    ~             (p=0.258 n=9+9)
GoTypes        1.11s ± 2%      1.10s ± 2%    ~           (p=0.912 n=10+10)
Compiler       5.25s ± 1%      5.29s ± 2%    ~             (p=0.077 n=9+9)
MakeBash       33.5s ± 1%      34.1s ± 2%  +1.85%          (p=0.011 n=9+9)

name       old alloc/op    new alloc/op    delta
Template      63.6MB ± 0%     63.9MB ± 0%  +0.52%         (p=0.000 n=10+9)
GoTypes        218MB ± 0%      219MB ± 0%  +0.59%         (p=0.000 n=10+9)
Compiler       978MB ± 0%      985MB ± 0%  +0.69%        (p=0.000 n=10+10)

name       old allocs/op   new allocs/op   delta
Template        582k ± 0%       583k ± 0%  +0.10%        (p=0.000 n=10+10)
GoTypes        1.78M ± 0%      1.78M ± 0%  +0.12%        (p=0.000 n=10+10)
Compiler       7.68M ± 0%      7.69M ± 0%  +0.05%        (p=0.000 n=10+10)

name       old text-bytes  new text-bytes  delta
HelloSize       581k ± 0%       581k ± 0%  -0.08%        (p=0.000 n=10+10)
CmdGoSize      6.40M ± 0%      6.39M ± 0%  -0.08%        (p=0.000 n=10+10)

name       old data-bytes  new data-bytes  delta
HelloSize      3.66k ± 0%      3.66k ± 0%    ~     (all samples are equal)
CmdGoSize       134k ± 0%       134k ± 0%    ~     (all samples are equal)

name       old bss-bytes   new bss-bytes   delta
HelloSize       126k ± 0%       126k ± 0%    ~     (all samples are equal)
CmdGoSize       149k ± 0%       149k ± 0%    ~     (all samples are equal)

name       old exe-bytes   new exe-bytes   delta
HelloSize       947k ± 0%       946k ± 0%  -0.01%        (p=0.000 n=10+10)
CmdGoSize      9.92M ± 0%      9.91M ± 0%  -0.06%        (p=0.000 n=10+10)

Change-Id: Ie74bdff46fd602db41bb457333d3a762a0c3dc4d
Reviewed-on: https://go-review.googlesource.com/20517
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
2016-04-01 09:37:58 +00:00
..
bench encoding/base64: fix streaming decode of padding-free base64 2016-01-08 15:07:45 +00:00
bugs
chan
ddd2.dir
dwarf
fixedbugs cmd/compile: ignore OXXX nodes in closure captured vars list 2016-04-01 02:08:56 +00:00
import2.dir
import4.dir
interface
intrinsic.dir cmd/compile: added some intrinsics to SSA back end 2016-03-28 16:29:59 +00:00
ken
method4.dir
safe
stress
syntax cmd/compile: use bufio.Reader directly in lexer 2016-03-11 21:27:23 +00:00
64bit.go
235.go
alias1.go
alias.go
append.go
args.go
assign1.go
assign.go
atomicload.go cmd/compile: keep value use counts in SSA 2016-03-17 04:20:02 +00:00
bigalg.go
bigmap.go
blank1.go cmd/compile: don't allow blank method declarations on builtins 2015-12-02 18:26:38 +00:00
blank.go
bom.go
bombad.go
bounds.go
chancap.go
chanlinear.go
char_lit1.go
char_lit.go
clearfat.go
closedchan.go
closure1.go
closure2.go
closure.go
cmp6.go
cmp.go
cmplx.go
cmplxdivide1.go
cmplxdivide.c
cmplxdivide.go
complit1.go
complit.go
compos.go
const1.go
const2.go
const3.go
const4.go
const5.go
const6.go
const.go
convert1.go
convert3.go
convert.go
convlit1.go
convlit.go
convT2X.go
copy.go
crlf.go
ddd1.go
ddd2.go
ddd.go
decl.go
declbad.go
defer.go
deferfin.go
deferprint.go
deferprint.out
divide.go
divmod.go
empty.go
env.go
eof1.go
eof.go
errchk
escape2.go cmd/compile: better modeling of escape across loop levels 2016-01-13 04:01:00 +00:00
escape2n.go cmd/compile: better modeling of escape across loop levels 2016-01-13 04:01:00 +00:00
escape3.go
escape4.go
escape5.go
escape_array.go
escape_because.go cmd/compile: escape analysis explanations added to -m -m output 2016-03-17 13:29:48 +00:00
escape_calls.go
escape_closure.go
escape_field.go
escape_iface.go cmd/compile: avoid leak of dottype expression if type does not contain pointers. 2016-02-19 16:10:14 +00:00
escape_indir.go
escape_level.go
escape_map.go
escape_param.go
escape_slice.go
escape_struct_param1.go
escape_struct_param2.go
escape_struct_return.go
escape.go
fibo.go
finprofiled.go
float_lit2.go
float_lit3.go
float_lit.go
floatcmp.go
for.go
func1.go
func2.go
func3.go
func4.go
func5.go
func6.go
func7.go
func8.go
func.go
funcdup2.go
funcdup.go
gc1.go
gc2.go
gc.go
gcstring.go
goprint.go
goprint.out
goto.go
heapsampling.go
helloworld.go
helloworld.out
if.go
import1.go
import2.go
import4.go
import5.go
import.go
index0.go
index1.go
index2.go
index.go
indirect1.go
indirect.go
init1.go
init.go
initcomma.go
initialize.go
initializerr.go
initloop.go
inline.go cmd/compile: allow inlining of functions with switch statements 2016-03-21 23:05:10 +00:00
int_lit.go
intcvt.go
intrinsic.go cmd/compile: added some intrinsics to SSA back end 2016-03-28 16:29:59 +00:00
iota.go
label1.go
label.go
linkmain_run.go test: fix linkmain test 2015-12-17 23:36:13 +00:00
linkmain.go cmd/link: reject non-package main toplevel.a file, remove dead code 2015-12-17 20:59:51 +00:00
linkx_run.go cmd/link: remove alternate -X flag spelling 2016-02-19 01:35:25 +00:00
linkx.go
literal.go
live1.go
live2.go
live_ssa.go cmd/compile: better job of naming compound types 2016-03-31 22:18:26 +00:00
live_syscall.go cmd/compile: recognize Syscall-like functions for liveness analysis 2016-01-14 01:16:45 +00:00
live.go
loopbce.go cmd/compile/internal/ssa: BCE for induction variables 2016-04-01 09:37:58 +00:00
mallocfin.go
map1.go
map.go
maplinear.go
method1.go cmd/compile: ignore receiver parameters in Eqtype 2016-03-17 00:38:15 +00:00
method2.go
method3.go
method4.go
method5.go
method.go
named1.go
named.go
nil.go
nilcheck.go [dev.ssa] cmd/compile: make cse faster 2016-01-28 20:59:20 +00:00
nilptr2.go
nilptr3_ssa.go [dev.ssa] cmd/compile: get rid of nil checks before float loads/stores 2016-02-26 04:33:46 +00:00
nilptr3.go [dev.ssa] test: remove extra tests from non-SSA builds 2016-02-26 19:07:16 +00:00
nilptr4.go
nilptr.go
nosplit.go test: add s390x case to nosplit test 2016-03-21 08:14:51 +00:00
nul1.go
opt_branchlikely.go [dev.ssa] cmd/compile: adjust branch likeliness for calls/loops 2016-03-01 20:09:41 +00:00
parentype.go
peano.go
phiopt.go [dev.ssa] cmd/compile/internal/ssa: simplify boolean phis 2016-03-01 17:56:13 +00:00
print.go
print.out
printbig.go
printbig.out
prove.go cmd/compile/internal/ssa: BCE for induction variables 2016-04-01 09:37:58 +00:00
range.go
recover1.go
recover2.go
recover3.go
recover4.go
recover.go
reflectmethod1.go cmd/compile: track reflect.Type.Method in deadcode 2016-03-11 21:19:20 +00:00
reflectmethod2.go cmd/compile: track reflect.Type.Method in deadcode 2016-03-11 21:19:20 +00:00
reflectmethod3.go cmd/compile: track reflect.Type.Method in deadcode 2016-03-11 21:19:20 +00:00
reflectmethod4.go cmd/link: treat reflect.Value.Method like Call 2016-03-11 22:07:02 +00:00
rename1.go
rename.go
reorder2.go
reorder.go
return.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
rotate.go
run.go cmd/compile: fix build 2016-03-31 18:00:36 +00:00
rune.go
runtime.go
shift1.go
shift2.go
sieve.go
sigchld.go
sigchld.out
simassign.go
sinit_run.go
sinit.go
sizeof.go
slice3.go
slice3err.go
slicecap.go
sliceopt.go
solitaire.go
stack.go
strength.go cmd/compile: generalize strength reduction of mulq 2016-03-30 22:27:13 +00:00
string_lit.go
stringrange.go
struct0.go
switch2.go
switch3.go
switch4.go
switch.go
tinyfin.go
torture.go
turing.go
typecheck.go
typecheckloop.go
typeswitch1.go
typeswitch2.go
typeswitch3.go
typeswitch.go
undef.go
utf.go
varerr.go
varinit.go
writebarrier.go cmd/compile: don't write back unchanged slice results 2016-03-21 23:40:18 +00:00
zerodivide.go