summaryrefslogtreecommitdiff
path: root/test
Commit message (Collapse)AuthorAgeFilesLines
* cmd/compile: consider exported flag in namedataIan Lance Taylor2017-07-244-0/+78
| | | | | | | | | | | | | | | It is possible to have an unexported name with a nil package, for an embedded field whose type is a pointer to an unexported type. We must encode that fact in the type..namedata symbol name, to avoid incorrectly merging an unexported name with an exported name. Fixes #21120 Change-Id: I2e3879d77fa15c05ad92e0bf8e55f74082db5111 Reviewed-on: https://go-review.googlesource.com/50710 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Crawshaw <crawshaw@golang.org>
* cmd/compile: fix unaligned loads/stores to global variables on s390xMichael Munday2017-07-191-0/+72
| | | | | | | | | | | | | | | | Load/store-merging and move optimizations can result in unaligned memory accesses. This is fine so long as the load/store instruction used does not take a relative offset. In the SSA rules this means we must not merge (MOVDaddr (SB)) ops into loads/stores unless we can guarantee the alignment of the target. Fixes #21048. Change-Id: I70f13a62a148d5f0a56e704e8f76e36b4a4226d9 Reviewed-on: https://go-review.googlesource.com/49250 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
* cmd/compile: omit X:framepointer in compile versionRuss Cox2017-07-171-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Framepointer is the default now. Only print an X: list if the settings are _not_ the default. Before: $ go tool compile -V compile version devel +a5f30d9508 Sun Jul 16 14:43:48 2017 -0400 X:framepointer $ go1.8 tool compile -V compile version go1.8 X:framepointer $ After: $ go tool compile -V compile version devel +a5f30d9508 Sun Jul 16 14:43:48 2017 -0400 $ go1.9 tool compile -V # imagined compile version go1.9 $ Perpetuates #18317. Change-Id: I981ba5c62be32e650a166fc9740703122595639b Reviewed-on: https://go-review.googlesource.com/49252 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
* test: deflake chan/select3.goJosh Bleecher Snyder2017-07-081-2/+9
| | | | | | | | | | | | | | | | | | | | | | | | On a slow or distracted machine, 0.1s is sometimes not long enough for a non-blocking function call to complete. This causes rare test flakes. They can be easily reproduced by reducing the wait time to (say) 100ns. For non-blocking functions, increase the window from 100ms to 10s. Using different windows for block and non-blocking functions, allows us to reduce the time for blocking functions. The risk here is false negatives, but that risk is low; this test is run repeatedly on many fast machines, for which 10ms is ample time. This reduces the time required to run the test by a factor of 10, from ~1s to ~100ms. Fixes #20299 Change-Id: Ice9a641a66c6c101d738a2ebe1bcb144ae3c9916 Reviewed-on: https://go-review.googlesource.com/47812 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
* cmd/compile: fix slice-in-bound check on amd64p32Cherry Zhang2017-06-281-0/+23
| | | | | | | | | | | | Should use CMPL instead of CMPQ. Fixes #20811. Change-Id: I610d487949c2c8a08b3743656149069d931a51bb Reviewed-on: https://go-review.googlesource.com/46870 Reviewed-by: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
* cmd/compile: suppress errors after "cannot assign to X"Matthew Dempsky2017-06-271-0/+11
| | | | | | | | | | | | | | | | | If the LHS is unassignable, there's no point in trying to make sure the RHS can be assigned to it or making sure they're realizable types. This is consistent with go/types. In particular, this prevents "1 = 2" from causing a panic when "1" still ends up with the type "untyped int", which is not realizable. Fixes #20813. Change-Id: I4710bdaac2e375ef12ec29b888b8ac84fb640e56 Reviewed-on: https://go-review.googlesource.com/46835 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
* test/fixedbugs: Close opening parenthesis in comment in issue20789.goGabríel Arthúr Pétursson2017-06-271-1/+1
| | | | | | | | Updates #20789 Change-Id: Ic7a94394e283bc1b667cdad999ceee9513f35e37 Reviewed-on: https://go-review.googlesource.com/46770 Reviewed-by: Robert Griesemer <gri@golang.org>
* cmd/compile: use correct variable when setting up dummy CallStmt in errorRobert Griesemer2017-06-261-0/+13
| | | | | | | | | | | | | Fixes crash when printing a related error message later on. Fixes #20789. Change-Id: I6d2c35aafcaeda26a211fc6c8b7dfe4a095a3efe Reviewed-on: https://go-review.googlesource.com/46713 Run-TryBot: Robert Griesemer <gri@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
* cmd/compile: fix array slice expression bounds checkRobert Griesemer2017-06-221-0/+15
| | | | | | | | | | Fixes #20749. Change-Id: Ic6a7edc858575c4cb8b2e2ca97ee0c4b69f22c27 Reviewed-on: https://go-review.googlesource.com/46466 Run-TryBot: Robert Griesemer <gri@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
* cmd/compile: make loop guard+rotate conditional on GOEXPERIMENTDavid Chase2017-06-211-1/+1
| | | | | | | | | | | | | | | | | Loops of the form "for i,e := range" needed to have their condition rotated to the "bottom" for the preemptible loops GOEXPERIMENT, but this caused a performance regression because it degraded bounds check removal. For now, make the loop rotation/guarding conditional on the experiment. Fixes #20711. Updates #10958. Change-Id: Icfba14cb3b13a910c349df8f84838cf4d9d20cf6 Reviewed-on: https://go-review.googlesource.com/46410 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
* cmd/compile: add regress test for #20682Matthew Dempsky2017-06-154-0/+44
| | | | | | | | | | | Minimal reconstruction of reported failure case. Manually verified that test fails with CL 45911 reverted. Change-Id: Ia5d11500d91b46ba1eb5d841db3987edb9136c39 Reviewed-on: https://go-review.googlesource.com/45970 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Robert Griesemer <gri@golang.org>
* cmd/compile: fix exporting of function bodiesMatthew Dempsky2017-06-153-0/+32
| | | | | | | | | | | | | | | | | Before CL 36170, we identified all function bodies that needed to be exported before writing any export data. With CL 36170, we started identifying additional functions while exporting function bodies. As a consequence, we cannot use a range-based for loop for iterating over function bodies anymore. Fixes #18895. Change-Id: I9cbefa8d311ca8c9898c8272b2ac365976b02396 Reviewed-on: https://go-review.googlesource.com/45817 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
* runtime: restore arm assembly stubs for div/modKeith Randall2017-06-154-1/+94
| | | | | | | | | | | | These are used by DIV[U] and MOD[U] assembly instructions. Add a test in the stdlib so we actually exercise linking to these routines. Update #19507 Change-Id: I0d8e19a53e3744abc0c661ea95486f94ec67585e Reviewed-on: https://go-review.googlesource.com/45703 Reviewed-by: Cherry Zhang <cherryyz@google.com>
* cmd/compile: fix detection of calls to reflect.MethodRobert Griesemer2017-06-143-0/+48
| | | | | | | | | | | | | | | | | | | | | The existing code used Type.String() to obtain the name of a type; specifically type reflect.Method in this case. However, Type.String() formatting is intended for error messages and uses the format pkgpath.name instead of pkgname.name if a package (in this case package reflect) is imported multiple times. As a result, the reflect.Method type detection failed under peculiar circumstances (see the included test case). Thanks to https://github.com/ericlagergren for tracking down an easy way to make the bug disappear (which in turn directly led to the underlying cause). Fixes #19028. Change-Id: I1b9c5dfd183260a9be74969fe916a94146fc36da Reviewed-on: https://go-review.googlesource.com/45777 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* cmd/compile: don't use ."" as a pkg prefixDaniel Martí2017-06-093-0/+33
| | | | | | | | | | | | | This results in names to unexported fields like net.(*Dialer)."".deadline instead of net.(*Dialer).deadline. Fixes #18419. Change-Id: I0415c68b77cc16125c2401320f56308060ac3f25 Reviewed-on: https://go-review.googlesource.com/44070 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* cmd/compile: fix real/imag for untyped constant argumentsRobert Griesemer2017-06-081-0/+71
| | | | | | | | | | | Fixes #11945. Fixes #17446. Change-Id: Ic674f6ebc0533ab0f97c650689125994941b72e1 Reviewed-on: https://go-review.googlesource.com/45081 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* test: add test that caused gccgo undefined symbol errorIan Lance Taylor2017-06-081-0/+28
| | | | | | | | Change-Id: I94aa87fe951701413b479c05b0bc8810255eb01c Reviewed-on: https://go-review.googlesource.com/45085 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
* cmd/compile: don't implicitly dereference pointer to arrays for real/imagRobert Griesemer2017-06-071-0/+14
| | | | | | | | Fixes #20602. Change-Id: Iac1589484dec626c018314e0cea7efce091fd87d Reviewed-on: https://go-review.googlesource.com/45075 Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* cmd/compile: reject unknown //go: comments in std libraryKeith Randall2017-06-061-0/+20
| | | | | | | | | | | Fixes #18331 Change-Id: Ie5c6685be3002533b84604ff1f13f2f0850f29e2 Reviewed-on: https://go-review.googlesource.com/45010 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
* cmd/compile: retain source positions of arguments to inlined callsDavid Lazar2017-06-021-0/+71
| | | | | | | | | | | | | | | | | | | | | Arguments to inlined calls are hidden from setPos as follows: args := as.Rlist as.Rlist.Set(nil) // setPos... as.Rlist.Set(args.Slice()) Previously, this code had no effect since the value of as was overwritten by the assignment in the retvars loop. Fixes #19799. Change-Id: Iaf97259f82fdba8b236136337cc42b2774c7fef5 Reviewed-on: https://go-review.googlesource.com/44351 Run-TryBot: David Lazar <lazard@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
* cmd/compile: fix subword store/load elision for MIPSCherry Zhang2017-05-311-1/+17
| | | | | | | | | | | | | | | | | | Apply the fix in CL 44355 to MIPS. ARM64 has these rules but commented out for performance reason. Fix the commented rules, in case they are enabled in the future. Enhance the test so it triggers the failure on ARM and MIPS without the fix. Updates #20530. Change-Id: I82d77448e3939a545fe519d0a29a164f8fa5417c Reviewed-on: https://go-review.googlesource.com/44430 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
* cmd/compile: don't generate liveness maps when the stack is too largeJosh Bleecher Snyder2017-05-301-0/+18
| | | | | | | | | | Fixes #20529 Change-Id: I3cb0c037b1737fbc3fa3b1b61ed8a42cfaf8e10d Reviewed-on: https://go-review.googlesource.com/44344 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
* cmd/compile: fix subword store/load elision for amd64, x86, armDavid Chase2017-05-301-0/+18
| | | | | | | | | | | | | | | | | | | | | | | Replacing byteload-of-bytestore-of-x with x is incorrect when x contains a larger-than-byte value (and so on for 16 and 32-bit load/store pairs). Replace "x" with the appropriate zero/sign extension of x, which if unnecessary will be repaired by other rules. Made logic for arm match x86 and amd64; yields minor extra optimization, plus I am (much) more confident it's correct, despite inability to reproduce bug on arm. Ppc64 lacks this optimization, hence lacks this problem. See related https://golang.org/cl/37154/ Fixes #20530. Change-Id: I6af9cac2ad43bee99cafdcb04725ce7e55a43323 Reviewed-on: https://go-review.googlesource.com/44355 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
* cmd/compile: report correct position in redeclaration errorsRobert Griesemer2017-05-221-0/+33
| | | | | | | | | | | When restoring syms, we must also restore the original Lastlineno. Bug introduced with https://golang.org/cl/41390/. Fixes #20415. Change-Id: Ie81d36279d717e330951b52f42dcee4b0025b9f0 Reviewed-on: https://go-review.googlesource.com/43811 Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* cmd/compile: make duplicate expr cases readableDaniel Martí2017-05-192-26/+54
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of just printing the value, print the original node to make the error more human-friendly. Also print the value if its string form is different than the original node, to make sure it's obvious what value was duplicated. This means that "case '@', '@':", which used to print: duplicate case 64 in switch Will now print: duplicate case '@' (value 64) in switch Factor this logic out into its own function to reuse it in range cases and any other place where we might want to print a node and its value in the future. Also needed to split the errorcheck files because expression switch case duplicates are now detected earlier, so they stop the compiler before it gets to generating the AST and detecting the type switch case duplicates. Fixes #20112. Change-Id: I9009b50dec0d0e705e5de9c9ccb08f1dce8a5a99 Reviewed-on: https://go-review.googlesource.com/41852 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* test: gofmt chan/*.goJosh Bleecher Snyder2017-05-186-356/+410
| | | | | | | | These are functional tests, so it is safe to gofmt them. Change-Id: I3067279c1d49809ac6a62054448ab8a6c3de9bda Reviewed-on: https://go-review.googlesource.com/43623 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
* test: restore fixedbugs/bug398.go to original versiongriesemer2017-05-181-4/+21
| | | | | | | | | | | | | | | | Cannot reproduce original problem. Compiler internals have changed enough such that this appears to work now. Restore original test (exported interfaces), but also keep version of the test using non-exported interfaces. Fixes #15596. Change-Id: Idb32da80239963242bd5d1609343c80f19773b0c Reviewed-on: https://go-review.googlesource.com/43622 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
* test: add test for issue 18636Josh Bleecher Snyder2017-05-181-0/+27
| | | | | | | | Updates #18636 Change-Id: I143c670c3940231e29f1814e0a03165682f53243 Reviewed-on: https://go-review.googlesource.com/43621 Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
* cmd/compile: don't panic in complex divisionAlberto Donizetti2017-05-181-0/+16
| | | | | | | | | | Updates #20227 Change-Id: Idadc3137490181a5d380367660cee21e8313cf3b Reviewed-on: https://go-review.googlesource.com/42650 Run-TryBot: Alberto Donizetti <alb.donizetti@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
* test: add missing copyright header to checkbce.goIan Lance Taylor2017-05-181-0/+7
| | | | | | | | Change-Id: Iafeb8e033c876f482caa17cca414fe13b0fadb12 Reviewed-on: https://go-review.googlesource.com/43613 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Dave Cheney <dave@cheney.net>
* test: add test of deferred deleteJosh Bleecher Snyder2017-05-151-0/+25
| | | | | | | | | Updates #19710 Change-Id: I37d19a4a02b9010cb5f9062b3d141d5d65e12e01 Reviewed-on: https://go-review.googlesource.com/43497 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
* cmd/compile: don't update outer variables after capturevars is completeJosh Bleecher Snyder2017-05-141-0/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When compiling concurrently, we walk all functions before compiling any of them. Walking functions can cause variables to switch from being non-addrtaken to addrtaken, e.g. to prepare for a runtime call. Typechecking propagates addrtaken-ness of closure variables to their outer variables, so that capturevars can decide whether to pass the variable's value or a pointer to it. When all functions are compiled immediately, as long as the containing function is compiled prior to the closure, this propagation has no effect. When compilation is deferred, though, in rare cases, this results in a change in the addrtaken-ness of a variable in the outer function, which in turn changes the compiler's output. (This is rare because in a great many cases, a temporary has been introduced, insulating the outer variable from modification.) But concurrent compilation must generate identical results. To fix this, track whether capturevars has run. If it has, there is no need to update outer variables when closure variables change. Capturevars always runs before any functions are walked or compiled. The remainder of the changes in this CL are to support the test. In particular, -d=compilelater forces the compiler to walk all functions before compiling any of them, despite being non-concurrent. This is useful because -live is fundamentally incompatible with concurrent compilation, but we want -c=1 to have no behavior changes. Fixes #20250 Change-Id: I89bcb54268a41e8588af1ac8cc37fbef856a90c2 Reviewed-on: https://go-review.googlesource.com/42853 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
* cmd/compile: fix store chain in schedule passKeith Randall2017-05-111-0/+19
| | | | | | | | | | | | | | | | | | | | | | Tuple ops are weird. They are essentially a pair of ops, one which consumes a mem and one which generates a mem (the Select1). The schedule pass didn't handle these quite right. Fix the scheduler to include both parts of the paired op in the store chain. That makes sure that loads are correctly ordered with respect to the first of the pair. Add a check for the ssacheck builder, that there is only one live store at a time. I thought we already had such a check, but apparently not... Fixes #20335 Change-Id: I59eb3446a329100af38d22820b1ca2190ca46a78 Reviewed-on: https://go-review.googlesource.com/43294 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
* cmd/compile: don't use statictmps for SSA-able composite literalsJosh Bleecher Snyder2017-05-111-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The writebarrier test has to change. Now that T23 composite literals are passed to the backend, they get SSA'd, so writes to their fields are treated separately, so the relevant part of the first write to t23 is now a dead store. Preserve the intent of the test by splitting it up into two functions. Reduces code size a bit: name old object-bytes new object-bytes delta Template 386k ± 0% 386k ± 0% ~ (all equal) Unicode 202k ± 0% 202k ± 0% ~ (all equal) GoTypes 1.16M ± 0% 1.16M ± 0% ~ (all equal) Compiler 3.92M ± 0% 3.91M ± 0% -0.19% (p=0.008 n=5+5) SSA 7.91M ± 0% 7.91M ± 0% ~ (all equal) Flate 228k ± 0% 228k ± 0% -0.05% (p=0.008 n=5+5) GoParser 283k ± 0% 283k ± 0% ~ (all equal) Reflect 952k ± 0% 952k ± 0% -0.06% (p=0.008 n=5+5) Tar 188k ± 0% 188k ± 0% -0.09% (p=0.008 n=5+5) XML 406k ± 0% 406k ± 0% -0.02% (p=0.008 n=5+5) [Geo mean] 649k 648k -0.04% Fixes #18872 Change-Id: Ifeed0f71f13849732999aa731cc2bf40c0f0e32a Reviewed-on: https://go-review.googlesource.com/43154 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
* cmd/compile: avoid checkwidth of [...] arraysJosh Bleecher Snyder2017-05-111-0/+15
| | | | | | | | | | Fixes #20333 Change-Id: I0653cc859076f146d8ea8f5bd55cb22b0b8d987f Reviewed-on: https://go-review.googlesource.com/43290 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
* cmd/internal/obj: continue to optimize ARM's constant poolBen Shi2017-05-111-34/+100
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Both Keith's https://go-review.googlesource.com/c/41612/ and and Ben's https://go-review.googlesource.com/c/41679/ optimized ARM's constant pool. But neither was complete. First, BIC was forgotten. 1. "BIC $0xff00ff00, Reg" can be optimized to "BIC $0xff000000, Reg BIC $0x0000ff00, Reg" 2. "BIC $0xffff00ff, Reg" can be optimized to "AND $0x0000ff00, Reg" 3. "AND $0xffff00ff, Reg" can be optimized to "BIC $0x0000ff00, Reg" Second, break a non-ARMImmRot to the subtraction of two ARMImmRots was left as TODO. 1. "ADD $0x00fffff0, Reg" can be optimized to "ADD $0x01000000, Reg SUB $0x00000010, Reg" 2. "SUB $0x00fffff0, Reg" can be optimized to "SUB $0x01000000, Reg ADD $0x00000010, Reg" This patch fixes them and issue #19844. The go1 benchmark shows improvements. name old time/op new time/op delta BinaryTree17-4 41.4s ± 1% 41.7s ± 1% +0.54% (p=0.000 n=50+49) Fannkuch11-4 24.7s ± 1% 25.1s ± 0% +1.70% (p=0.000 n=50+49) FmtFprintfEmpty-4 853ns ± 1% 852ns ± 1% ~ (p=0.833 n=50+50) FmtFprintfString-4 1.33µs ± 1% 1.33µs ± 1% ~ (p=0.163 n=50+50) FmtFprintfInt-4 1.40µs ± 1% 1.40µs ± 0% ~ (p=0.293 n=50+35) FmtFprintfIntInt-4 2.09µs ± 1% 2.08µs ± 1% -0.39% (p=0.000 n=50+49) FmtFprintfPrefixedInt-4 2.43µs ± 1% 2.43µs ± 1% ~ (p=0.552 n=50+50) FmtFprintfFloat-4 4.57µs ± 1% 4.42µs ± 1% -3.18% (p=0.000 n=50+50) FmtManyArgs-4 8.62µs ± 1% 8.52µs ± 0% -1.08% (p=0.000 n=50+50) GobDecode-4 101ms ± 1% 101ms ± 2% +0.45% (p=0.001 n=49+49) GobEncode-4 90.7ms ± 1% 91.1ms ± 2% +0.51% (p=0.001 n=50+50) Gzip-4 4.23s ± 1% 4.21s ± 1% -0.62% (p=0.000 n=50+50) Gunzip-4 623ms ± 1% 619ms ± 0% -0.63% (p=0.000 n=50+42) HTTPClientServer-4 721µs ± 5% 683µs ± 3% -5.25% (p=0.000 n=50+47) JSONEncode-4 251ms ± 1% 253ms ± 1% +0.54% (p=0.000 n=49+50) JSONDecode-4 941ms ± 1% 944ms ± 1% +0.30% (p=0.001 n=49+50) Mandelbrot200-4 49.3ms ± 1% 49.3ms ± 0% ~ (p=0.918 n=50+48) GoParse-4 47.1ms ± 1% 47.2ms ± 1% +0.18% (p=0.025 n=50+50) RegexpMatchEasy0_32-4 1.23µs ± 1% 1.24µs ± 1% +0.30% (p=0.000 n=49+50) RegexpMatchEasy0_1K-4 7.74µs ± 7% 7.76µs ± 5% ~ (p=0.888 n=50+50) RegexpMatchEasy1_32-4 1.32µs ± 1% 1.32µs ± 1% +0.23% (p=0.003 n=50+50) RegexpMatchEasy1_1K-4 10.6µs ± 2% 10.5µs ± 3% -1.29% (p=0.000 n=49+50) RegexpMatchMedium_32-4 2.19µs ± 1% 2.10µs ± 1% -3.79% (p=0.000 n=49+49) RegexpMatchMedium_1K-4 544µs ± 0% 545µs ± 0% ~ (p=0.123 n=41+50) RegexpMatchHard_32-4 28.8µs ± 0% 28.8µs ± 1% ~ (p=0.580 n=46+50) RegexpMatchHard_1K-4 863µs ± 1% 865µs ± 1% +0.31% (p=0.027 n=47+50) Revcomp-4 82.2ms ± 2% 82.3ms ± 2% ~ (p=0.894 n=48+49) Template-4 1.06s ± 1% 1.04s ± 1% -1.18% (p=0.000 n=50+49) TimeParse-4 7.25µs ± 1% 7.35µs ± 0% +1.48% (p=0.000 n=50+50) TimeFormat-4 13.3µs ± 1% 13.2µs ± 1% -0.13% (p=0.007 n=50+50) [Geo mean] 736µs 733µs -0.37% name old speed new speed delta GobDecode-4 7.60MB/s ± 1% 7.56MB/s ± 2% -0.46% (p=0.001 n=49+49) GobEncode-4 8.47MB/s ± 1% 8.42MB/s ± 2% -0.50% (p=0.001 n=50+50) Gzip-4 4.58MB/s ± 1% 4.61MB/s ± 1% +0.59% (p=0.000 n=50+50) Gunzip-4 31.2MB/s ± 1% 31.4MB/s ± 0% +0.63% (p=0.000 n=50+42) JSONEncode-4 7.73MB/s ± 1% 7.69MB/s ± 1% -0.53% (p=0.000 n=49+50) JSONDecode-4 2.06MB/s ± 1% 2.06MB/s ± 1% ~ (p=0.052 n=44+50) GoParse-4 1.23MB/s ± 0% 1.23MB/s ± 2% ~ (p=0.526 n=26+50) RegexpMatchEasy0_32-4 25.9MB/s ± 1% 25.9MB/s ± 1% -0.30% (p=0.000 n=49+50) RegexpMatchEasy0_1K-4 132MB/s ± 7% 132MB/s ± 6% ~ (p=0.885 n=50+50) RegexpMatchEasy1_32-4 24.2MB/s ± 1% 24.1MB/s ± 1% -0.22% (p=0.003 n=50+50) RegexpMatchEasy1_1K-4 96.4MB/s ± 2% 97.8MB/s ± 3% +1.36% (p=0.000 n=50+50) RegexpMatchMedium_32-4 460kB/s ± 0% 476kB/s ± 1% +3.43% (p=0.000 n=49+50) RegexpMatchMedium_1K-4 1.88MB/s ± 0% 1.88MB/s ± 0% ~ (all equal) RegexpMatchHard_32-4 1.11MB/s ± 0% 1.11MB/s ± 1% +0.34% (p=0.000 n=45+50) RegexpMatchHard_1K-4 1.19MB/s ± 1% 1.18MB/s ± 1% -0.34% (p=0.033 n=50+50) Revcomp-4 30.9MB/s ± 2% 30.9MB/s ± 2% ~ (p=0.894 n=48+49) Template-4 1.84MB/s ± 1% 1.86MB/s ± 2% +1.19% (p=0.000 n=48+50) [Geo mean] 6.63MB/s 6.65MB/s +0.26% Fixes #19844. Change-Id: I5ad16cc0b29267bb4579aca3dcc10a0b8ade1aa4 Reviewed-on: https://go-review.googlesource.com/42430 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
* cmd/compile: reduce debugger-worsening line number churnDavid Chase2017-05-102-0/+298
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Reuse block head or preceding instruction's line number for register allocator's spill, fill, copy, rematerialization instructionsl; and also for phi, and for no-src-pos instructions. Assembler creates same line number tables for copy-predecessor-line and for no-src-pos, but copy-predecessor produces better-looking assembly language output with -S and with GOSSAFUNC, and does not require changes to tests of existing assembly language. Split "copyInto" into two cases, one for register allocation, one for otherwise. This caused the test score line change count to increase by one, which may reflect legitimately useful information preserved. Without any special treatment for copyInto, the change count increases by 21 more, from 51 to 72 (i.e., quite a lot). There is a test; using two naive "scores" for line number churn, the old numbering is 2x or 4x worse. Fixes #18902. Change-Id: I0a0a69659d30ee4e5d10116a0dd2b8c5df8457b1 Reviewed-on: https://go-review.googlesource.com/36207 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
* cmd/compile: ignore types when considering tuple select for CSETodd Neal2017-05-091-0/+18
| | | | | | | | | | Fixes #20097 Change-Id: I3c9626ccc8cd0c46a7081ea8650b2ff07a5d4fcd Reviewed-on: https://go-review.googlesource.com/41505 Run-TryBot: Todd Neal <todd@tneal.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
* cmd/compile: make "imported and not used" errors deterministicJosh Bleecher Snyder2017-05-091-0/+32
| | | | | | | | | | | | | | | | If there were more unused imports than the maximum default number of errors to report, the set of reported imports was non-deterministic. Fix by accumulating and sorting them prior to output. Fixes #20298 Change-Id: Ib3d5a15fd7dc40009523fcdc1b93ddc62a1b05f2 Reviewed-on: https://go-review.googlesource.com/42954 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
* cmd/compile: better errors for float constants with large exponentsRobert Griesemer2017-05-081-0/+11
| | | | | | | | | | | | Also: Removed misleading comment. Fixes #20232. Change-Id: I0b141b1360ac53267b7ebfcec7a2e2a238f3f46c Reviewed-on: https://go-review.googlesource.com/42930 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* cmd/compile: suppress duplicate type errorsJosh Bleecher Snyder2017-05-043-2/+13
| | | | | | | | | | | | | | If we've already complained about a type T, don't complain again about further expressions involving it. Fixes #20245 and hopefully all of its ilk. Change-Id: Ic0abe8235d52e8a7ac40e3615aea8f3a54fd7cec Reviewed-on: https://go-review.googlesource.com/42690 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
* cmd/compile: prevent panic while formatting func(...T) with unknown TJosh Bleecher Snyder2017-05-041-0/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Compile: package p var f = func(...A) Before this CL: x.go:3:13: type %!v(PANIC=runtime error: invalid memory address or nil pointer dereference) is not an expression x.go:3:17: undefined: A After this CL: x.go:3:13: type func(...<T>) is not an expression x.go:3:17: undefined: A Found with go-fuzz. Fixes #20233 Change-Id: Ibb232b3954c4091071440eba48b44c4022a8083f Reviewed-on: https://go-review.googlesource.com/42610 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* runtime: don't panic for bad size hint in hashmapFilip Gruszczynski2017-05-021-11/+0
| | | | | | | | | | | | | | | | Because the hint parameter is supposed to be treated purely as a hint, if it doesn't meet the requirements we disregard it and continue as if there was no hint at all. Fixes #19926 Change-Id: I86e7f99472fad6b99ba4e2fd33e4a9e55d55115e Reviewed-on: https://go-review.googlesource.com/40854 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
* cmd/compile: fix error when typeswitching on untypedTodd Neal2017-04-302-0/+41
| | | | | | | | | | | Fixes #20185 Fixes #19977 Change-Id: I8434713d20616ff0c0bc8f33f017e2548a5cccfa Reviewed-on: https://go-review.googlesource.com/42210 Run-TryBot: Todd Neal <todd@tneal.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
* cmd/compile: checkwidth T when constructing *TJosh Bleecher Snyder2017-04-301-0/+18
| | | | | | | | | | | | | Without this, T can sneak through to the backend with its width unknown. Fixes #20174 Change-Id: I9b21e0e2641f75e360cc5e45dcb4eefe8255b675 Reviewed-on: https://go-review.googlesource.com/42175 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
* cmd/compile: add test for blank field in composite literalEmmanuel Odeke2017-04-291-0/+19
| | | | | | | | | | | | | Updates #18089. Test for that issue; it was inadvertently fixed by CL 34988. Ensure that we don't regress on the fix. Change-Id: Icb85fc20dbb0a47f028f088281319b552b16759d Reviewed-on: https://go-review.googlesource.com/42173 Reviewed-by: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
* cmd/compile: move writebarrier pass after dseJosh Bleecher Snyder2017-04-291-14/+25
| | | | | | | | | | | This avoids generating writeBarrier.enabled blocks for dead stores. Change-Id: Ib11d8e2ba952f3f1f01d16776e40a7200a7683cf Reviewed-on: https://go-review.googlesource.com/42012 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
* cmd/compile: check width of embedded interfaces in expandifaceJosh Bleecher Snyder2017-04-282-2/+19
| | | | | | | | | | | | | | | | | | | | | The code in #20162 contains an embedded interface. It didn't get dowidth'd by the frontend, and during DWARF generation, ngotype asked for a string description of it, which triggered a request for the number of fields in the interface, which triggered a dowidth, which is disallowed in the backend. The other changes in this CL are to support the test. Fixes #20162 Change-Id: I4d0be5bd949c361d4cdc89a8ed28b10977e40cf9 Reviewed-on: https://go-review.googlesource.com/42131 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
* cmd/compile: dowidth more in the front endJosh Bleecher Snyder2017-04-271-0/+14
| | | | | | | | | | | | | | | | | | | dowidth is fundamentally unsafe to call from the back end; it will cause data races. Replace all calls to dowidth in the backend with assertions that the width has been calculated. Then fix all the cases in which that was not so, including the cases from #20145. Fixes #20145. Change-Id: Idba3d19d75638851a30ec2ebcdb703c19da3e92b Reviewed-on: https://go-review.googlesource.com/41970 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
* cmd/internal/obj: ARM, use immediates instead of constant pool entriesKeith Randall2017-04-271-0/+113
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When a constant doesn't fit in a single instruction, use two paired instructions instead of the constant pool. For example ADD $0xaa00bb, R0, R1 Used to rewrite to: MOV ?(IP), R11 ADD R11, R0, R1 Instead, do: ADD $0xaa0000, R0, R1 ADD $0xbb, R1, R1 Same number of instructions. Good: 4 less bytes (no constant pool entry) One less load. Bad: Critical path is one instruction longer. It's probably worth it to avoid the loads, they are expensive. Dave Cheney got us some performance numbers: https://perf.golang.org/search?q=upload:20170426.1 TL;DR mean 1.37% improvement. Change-Id: Ib206836161fdc94a3962db6f9caa635c87d57cf1 Reviewed-on: https://go-review.googlesource.com/41612 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>