mirror of https://github.com/golang/go.git
This CL incorporates code from CL 201206 by Josh Bleecher Snyder (thanks Josh). This CL restores the integer-in-range optimizations in the SSA backend. The fuse pass is enhanced to detect inequalities that could be merged and fuse their associated blocks while the generic rules optimize them into a single unsigned comparison. For example, the inequality `x >= 0 && x < 10` will now be optimized to `unsigned(x) < 10`. Overall has a fairly positive impact on binary sizes. name old time/op new time/op delta Template 192ms ± 1% 192ms ± 1% ~ (p=0.757 n=17+18) Unicode 76.6ms ± 2% 76.5ms ± 2% ~ (p=0.603 n=19+19) GoTypes 694ms ± 1% 693ms ± 1% ~ (p=0.569 n=19+20) Compiler 3.26s ± 0% 3.27s ± 0% +0.25% (p=0.000 n=20+20) SSA 7.41s ± 0% 7.49s ± 0% +1.10% (p=0.000 n=17+19) Flate 120ms ± 1% 120ms ± 1% +0.38% (p=0.003 n=19+19) GoParser 152ms ± 1% 152ms ± 1% ~ (p=0.061 n=17+19) Reflect 422ms ± 1% 425ms ± 2% +0.76% (p=0.001 n=18+20) Tar 167ms ± 1% 167ms ± 0% ~ (p=0.730 n=18+19) XML 233ms ± 4% 231ms ± 1% ~ (p=0.752 n=20+17) LinkCompiler 927ms ± 8% 928ms ± 8% ~ (p=0.857 n=19+20) ExternalLinkCompiler 1.81s ± 2% 1.81s ± 2% ~ (p=0.513 n=19+20) LinkWithoutDebugCompiler 556ms ±10% 583ms ±13% +4.95% (p=0.007 n=20+20) [Geo mean] 478ms 481ms +0.52% name old user-time/op new user-time/op delta Template 270ms ± 5% 269ms ± 7% ~ (p=0.925 n=20+20) Unicode 134ms ± 7% 131ms ±14% ~ (p=0.593 n=18+20) GoTypes 981ms ± 3% 987ms ± 2% +0.63% (p=0.049 n=19+18) Compiler 4.50s ± 2% 4.50s ± 1% ~ (p=0.588 n=19+20) SSA 10.6s ± 2% 10.6s ± 1% ~ (p=0.141 n=20+19) Flate 164ms ± 8% 165ms ±10% ~ (p=0.738 n=20+20) GoParser 202ms ± 5% 203ms ± 6% ~ (p=0.820 n=20+20) Reflect 587ms ± 6% 597ms ± 3% ~ (p=0.087 n=20+18) Tar 230ms ± 6% 228ms ± 8% ~ (p=0.569 n=19+20) XML 311ms ± 6% 314ms ± 5% ~ (p=0.369 n=20+20) LinkCompiler 878ms ± 8% 887ms ± 7% ~ (p=0.289 n=20+20) ExternalLinkCompiler 1.60s ± 7% 1.60s ± 7% ~ (p=0.820 n=20+20) LinkWithoutDebugCompiler 498ms ±12% 489ms ±11% ~ (p=0.398 n=20+20) [Geo mean] 611ms 611ms +0.05% name old alloc/op new alloc/op delta Template 36.1MB ± 0% 36.0MB ± 0% -0.32% (p=0.000 n=20+20) Unicode 28.3MB ± 0% 28.3MB ± 0% -0.03% (p=0.000 n=19+20) GoTypes 121MB ± 0% 121MB ± 0% ~ (p=0.226 n=16+20) Compiler 563MB ± 0% 563MB ± 0% ~ (p=0.166 n=20+19) SSA 1.32GB ± 0% 1.33GB ± 0% +0.88% (p=0.000 n=20+19) Flate 22.7MB ± 0% 22.7MB ± 0% -0.02% (p=0.033 n=19+20) GoParser 27.9MB ± 0% 27.9MB ± 0% -0.02% (p=0.001 n=20+20) Reflect 78.3MB ± 0% 78.2MB ± 0% -0.01% (p=0.019 n=20+20) Tar 34.0MB ± 0% 34.0MB ± 0% -0.04% (p=0.000 n=20+20) XML 43.9MB ± 0% 43.9MB ± 0% -0.07% (p=0.000 n=20+19) LinkCompiler 205MB ± 0% 205MB ± 0% +0.44% (p=0.000 n=20+18) ExternalLinkCompiler 223MB ± 0% 223MB ± 0% +0.03% (p=0.000 n=20+20) LinkWithoutDebugCompiler 139MB ± 0% 142MB ± 0% +1.75% (p=0.000 n=20+20) [Geo mean] 93.7MB 93.9MB +0.20% name old allocs/op new allocs/op delta Template 363k ± 0% 361k ± 0% -0.58% (p=0.000 n=20+19) Unicode 329k ± 0% 329k ± 0% -0.06% (p=0.000 n=19+20) GoTypes 1.28M ± 0% 1.28M ± 0% -0.01% (p=0.000 n=20+20) Compiler 5.40M ± 0% 5.40M ± 0% -0.01% (p=0.000 n=20+20) SSA 12.7M ± 0% 12.8M ± 0% +0.80% (p=0.000 n=20+20) Flate 228k ± 0% 228k ± 0% ~ (p=0.194 n=20+20) GoParser 295k ± 0% 295k ± 0% -0.04% (p=0.000 n=20+20) Reflect 949k ± 0% 949k ± 0% -0.01% (p=0.000 n=20+20) Tar 337k ± 0% 337k ± 0% -0.06% (p=0.000 n=20+20) XML 418k ± 0% 417k ± 0% -0.17% (p=0.000 n=20+20) LinkCompiler 553k ± 0% 554k ± 0% +0.22% (p=0.000 n=20+19) ExternalLinkCompiler 1.52M ± 0% 1.52M ± 0% +0.27% (p=0.000 n=20+20) LinkWithoutDebugCompiler 186k ± 0% 186k ± 0% +0.06% (p=0.000 n=20+20) [Geo mean] 723k 723k +0.03% name old text-bytes new text-bytes delta HelloSize 828kB ± 0% 828kB ± 0% -0.01% (p=0.000 n=20+20) name old data-bytes new data-bytes delta HelloSize 13.4kB ± 0% 13.4kB ± 0% ~ (all equal) name old bss-bytes new bss-bytes delta HelloSize 180kB ± 0% 180kB ± 0% ~ (all equal) name old exe-bytes new exe-bytes delta HelloSize 1.23MB ± 0% 1.23MB ± 0% -0.33% (p=0.000 n=20+20) file before after Δ % addr2line 4320075 4311883 -8192 -0.190% asm 5191932 5187836 -4096 -0.079% buildid 2835338 2831242 -4096 -0.144% compile 20531717 20569099 +37382 +0.182% cover 5322511 5318415 -4096 -0.077% dist 3723749 3719653 -4096 -0.110% doc 4743515 4739419 -4096 -0.086% fix 3413960 3409864 -4096 -0.120% link 6690119 6686023 -4096 -0.061% nm 4269616 4265520 -4096 -0.096% pprof 14942189 14929901 -12288 -0.082% trace 11807164 11790780 -16384 -0.139% vet 8384104 8388200 +4096 +0.049% go 15339076 15334980 -4096 -0.027% total 132258257 132226007 -32250 -0.024% Fixes #30645. Change-Id: If551ac5996097f3685870d083151b5843170aab0 Reviewed-on: https://go-review.googlesource.com/c/go/+/165998 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> |
||
|---|---|---|
| .. | ||
| alias3.dir | ||
| bench | ||
| chan | ||
| closure3.dir | ||
| codegen | ||
| ddd2.dir | ||
| dwarf | ||
| fixedbugs | ||
| import2.dir | ||
| import4.dir | ||
| interface | ||
| intrinsic.dir | ||
| ken | ||
| linkname.dir | ||
| method4.dir | ||
| oldescape_linkname.dir | ||
| retjmp.dir | ||
| runtime | ||
| stress | ||
| syntax | ||
| uintptrescapes.dir | ||
| 64bit.go | ||
| 235.go | ||
| README.md | ||
| alg.go | ||
| alias.go | ||
| alias1.go | ||
| alias2.go | ||
| alias3.go | ||
| align.go | ||
| append.go | ||
| append1.go | ||
| args.go | ||
| armimm.go | ||
| assign.go | ||
| assign1.go | ||
| atomicload.go | ||
| bigalg.go | ||
| bigmap.go | ||
| blank.go | ||
| blank1.go | ||
| bom.go | ||
| bombad.go | ||
| bounds.go | ||
| chancap.go | ||
| chanlinear.go | ||
| char_lit.go | ||
| char_lit1.go | ||
| checkbce.go | ||
| clearfat.go | ||
| closedchan.go | ||
| closure.go | ||
| closure1.go | ||
| closure2.go | ||
| closure3.go | ||
| closure4.go | ||
| cmp.go | ||
| cmp6.go | ||
| cmplx.go | ||
| cmplxdivide.c | ||
| cmplxdivide.go | ||
| cmplxdivide1.go | ||
| complit.go | ||
| complit1.go | ||
| compos.go | ||
| const.go | ||
| const1.go | ||
| const2.go | ||
| const3.go | ||
| const4.go | ||
| const5.go | ||
| const6.go | ||
| convT2X.go | ||
| convert.go | ||
| convert1.go | ||
| convert2.go | ||
| convert3.go | ||
| convlit.go | ||
| convlit1.go | ||
| copy.go | ||
| copy1.go | ||
| crlf.go | ||
| ddd.go | ||
| ddd1.go | ||
| ddd2.go | ||
| decl.go | ||
| declbad.go | ||
| defer.go | ||
| defererrcheck.go | ||
| deferfin.go | ||
| defernil.go | ||
| deferprint.go | ||
| deferprint.out | ||
| devirt.go | ||
| divide.go | ||
| divmod.go | ||
| empty.go | ||
| env.go | ||
| eof.go | ||
| eof1.go | ||
| escape.go | ||
| escape2.go | ||
| escape2n.go | ||
| escape3.go | ||
| escape4.go | ||
| escape5.go | ||
| escape_array.go | ||
| escape_calls.go | ||
| escape_closure.go | ||
| escape_field.go | ||
| escape_goto.go | ||
| escape_hash_maphash.go | ||
| escape_iface.go | ||
| escape_indir.go | ||
| escape_level.go | ||
| escape_map.go | ||
| escape_param.go | ||
| escape_runtime_atomic.go | ||
| escape_selfassign.go | ||
| escape_slice.go | ||
| escape_struct_param1.go | ||
| escape_struct_param2.go | ||
| escape_struct_return.go | ||
| escape_sync_atomic.go | ||
| escape_unsafe.go | ||
| fibo.go | ||
| finprofiled.go | ||
| float_lit.go | ||
| float_lit2.go | ||
| float_lit3.go | ||
| floatcmp.go | ||
| for.go | ||
| func.go | ||
| func1.go | ||
| func2.go | ||
| func3.go | ||
| func4.go | ||
| func5.go | ||
| func6.go | ||
| func7.go | ||
| func8.go | ||
| funcdup.go | ||
| funcdup2.go | ||
| gc.go | ||
| gc1.go | ||
| gc2.go | ||
| gcgort.go | ||
| gcstring.go | ||
| goprint.go | ||
| goprint.out | ||
| goto.go | ||
| heapsampling.go | ||
| helloworld.go | ||
| helloworld.out | ||
| if.go | ||
| import.go | ||
| import1.go | ||
| import2.go | ||
| import4.go | ||
| import5.go | ||
| import6.go | ||
| index.go | ||
| index0.go | ||
| index1.go | ||
| index2.go | ||
| indirect.go | ||
| indirect1.go | ||
| init.go | ||
| init1.go | ||
| initcomma.go | ||
| initempty.go | ||
| initialize.go | ||
| initializerr.go | ||
| initloop.go | ||
| inline.go | ||
| inline_big.go | ||
| inline_caller.go | ||
| inline_callers.go | ||
| inline_literal.go | ||
| inline_math_bits_rotate.go | ||
| inline_sync.go | ||
| inline_variadic.go | ||
| int_lit.go | ||
| intcvt.go | ||
| intrinsic.go | ||
| intrinsic_atomic.go | ||
| iota.go | ||
| label.go | ||
| label1.go | ||
| linkmain.go | ||
| linkmain_run.go | ||
| linkname.go | ||
| linkobj.go | ||
| linkx.go | ||
| linkx_run.go | ||
| literal.go | ||
| literal2.go | ||
| live.go | ||
| live1.go | ||
| live2.go | ||
| live_syscall.go | ||
| locklinear.go | ||
| loopbce.go | ||
| makechan.go | ||
| makemap.go | ||
| makenew.go | ||
| mallocfin.go | ||
| map.go | ||
| map1.go | ||
| mapclear.go | ||
| maplinear.go | ||
| mergemul.go | ||
| method.go | ||
| method1.go | ||
| method2.go | ||
| method3.go | ||
| method4.go | ||
| method5.go | ||
| method6.go | ||
| method7.go | ||
| named.go | ||
| named1.go | ||
| nil.go | ||
| nilcheck.go | ||
| nilptr.go | ||
| nilptr2.go | ||
| nilptr3.go | ||
| nilptr4.go | ||
| nilptr5.go | ||
| nilptr5_aix.go | ||
| nilptr5_wasm.go | ||
| nilptr_aix.go | ||
| nosplit.go | ||
| notinheap.go | ||
| notinheap2.go | ||
| notinheap3.go | ||
| nowritebarrier.go | ||
| nul1.go | ||
| opt_branchlikely.go | ||
| parentype.go | ||
| peano.go | ||
| phiopt.go | ||
| print.go | ||
| print.out | ||
| printbig.go | ||
| printbig.out | ||
| prove.go | ||
| range.go | ||
| recover.go | ||
| recover1.go | ||
| recover2.go | ||
| recover3.go | ||
| recover4.go | ||
| recover5.go | ||
| reflectmethod1.go | ||
| reflectmethod2.go | ||
| reflectmethod3.go | ||
| reflectmethod4.go | ||
| rename.go | ||
| rename1.go | ||
| reorder.go | ||
| reorder2.go | ||
| retjmp.go | ||
| return.go | ||
| rotate.go | ||
| rotate0.go | ||
| rotate1.go | ||
| rotate2.go | ||
| rotate3.go | ||
| run.go | ||
| rune.go | ||
| runtime.go | ||
| shift1.go | ||
| shift2.go | ||
| sieve.go | ||
| sigchld.go | ||
| sigchld.out | ||
| simassign.go | ||
| sinit.go | ||
| sinit_run.go | ||
| sizeof.go | ||
| slice3.go | ||
| slice3err.go | ||
| slicecap.go | ||
| sliceopt.go | ||
| solitaire.go | ||
| stack.go | ||
| stackobj.go | ||
| stackobj2.go | ||
| stackobj3.go | ||
| strcopy.go | ||
| strength.go | ||
| string_lit.go | ||
| stringrange.go | ||
| struct0.go | ||
| switch.go | ||
| switch2.go | ||
| switch3.go | ||
| switch4.go | ||
| switch5.go | ||
| switch6.go | ||
| switch7.go | ||
| tinyfin.go | ||
| torture.go | ||
| turing.go | ||
| typecheck.go | ||
| typecheckloop.go | ||
| typeswitch.go | ||
| typeswitch1.go | ||
| typeswitch2.go | ||
| typeswitch2b.go | ||
| typeswitch3.go | ||
| uintptrescapes.go | ||
| uintptrescapes2.go | ||
| uintptrescapes3.go | ||
| undef.go | ||
| utf.go | ||
| varerr.go | ||
| varinit.go | ||
| writebarrier.go | ||
| zerodivide.go | ||
README.md
The test directory contains tests of the Go tool chain and runtime. It includes black box tests, regression tests, and error output tests. They are run as part of all.bash.
To run just these tests, execute:
../bin/go run run.go
Standard library tests should be written as regular Go tests in the appropriate package.
The tool chain and runtime also have regular Go tests in their packages. The main reasons to add a new test to this directory are:
- it is most naturally expressed using the test runner; or
- it is also applicable to
gccgoand other Go tool chains.