1. 30 May, 2014 2 commits
    • Russ Cox's avatar
      cmd/6g: treat vardef-initialized fat variables as live at calls · 1afbceb5
      Russ Cox authored
      This CL forces the optimizer to preserve some memory stores
      that would be redundant except that a stack scan due to garbage
      collection or stack copying might look at them during a function call.
      As such, it forces additional memory writes and therefore slows
      down the execution of some programs, especially garbage-heavy
      programs that are already limited by memory bandwidth.
      
      The slowdown can be as much as 7% for end-to-end benchmarks.
      
      These numbers are from running go1.test -test.benchtime=5s three times,
      taking the best (lowest) ns/op for each benchmark. I am excluding
      benchmarks with time/op < 10us to focus on macro effects.
      All benchmarks are on amd64.
      
      Comparing tip (a27f34c771cb) against this CL on an Intel Core i5 MacBook Pro:
      
      benchmark                          old ns/op      new ns/op      delta
      BenchmarkBinaryTree17              3876500413     3856337341     -0.52%
      BenchmarkFannkuch11                2965104777     2991182127     +0.88%
      BenchmarkGobDecode                 8563026        8788340        +2.63%
      BenchmarkGobEncode                 5050608        5267394        +4.29%
      BenchmarkGzip                      431191816      434168065      +0.69%
      BenchmarkGunzip                    107873523      110563792      +2.49%
      BenchmarkHTTPClientServer          85036          86131          +1.29%
      BenchmarkJSONEncode                22143764       22501647       +1.62%
      BenchmarkJSONDecode                79646916       85658808       +7.55%
      BenchmarkMandelbrot200             4720421        4700108        -0.43%
      BenchmarkGoParse                   4651575        4712247        +1.30%
      BenchmarkRegexpMatchMedium_1K      71986          73490          +2.09%
      BenchmarkRegexpMatchHard_1K        111018         117495         +5.83%
      BenchmarkRevcomp                   648798723      659352759      +1.63%
      BenchmarkTemplate                  112673009      112819078      +0.13%
      
      Comparing tip (a27f34c771cb) against this CL on an Intel Xeon E5520:
      
      BenchmarkBinaryTree17              5461110720     5393104469     -1.25%
      BenchmarkFannkuch11                4314677151     4327177615     +0.29%
      BenchmarkGobDecode                 11065853       11235272       +1.53%
      BenchmarkGobEncode                 65000655        6959837        +7.07%
      BenchmarkGzip                      647478596      671769097      +3.75%
      BenchmarkGunzip                    139348579      141096376      +1.25%
      BenchmarkHTTPClientServer          69376          73610          +6.10%
      BenchmarkJSONEncode                30172320       31796106       +5.38%
      BenchmarkJSONDecode                113704905      114239137      +0.47%
      BenchmarkMandelbrot200             6032730        6003077        -0.49%
      BenchmarkGoParse                   6775251        6405995        -5.45%
      BenchmarkRegexpMatchMedium_1K      111832         113895         +1.84%
      BenchmarkRegexpMatchHard_1K        161112         168420         +4.54%
      BenchmarkRevcomp                   876363406      892319935      +1.82%
      BenchmarkTemplate                  146273096      148998339      +1.86%
      
      Just to get a sense of where we are compared to the previous release,
      here are the same benchmarks comparing Go 1.2 to this CL.
      
      Comparing Go 1.2 against this CL on an Intel Core i5 MacBook Pro:
      
      BenchmarkBinaryTree17              4370077662     3856337341     -11.76%
      BenchmarkFannkuch11                3347052657     2991182127     -10.63%
      BenchmarkGobDecode                 8791384        8788340        -0.03%
      BenchmarkGobEncode                 4968759        5267394        +6.01%
      BenchmarkGzip                      437815669      434168065      -0.83%
      BenchmarkGunzip                    94604099       110563792      +16.87%
      BenchmarkHTTPClientServer          87798          86131          -1.90%
      BenchmarkJSONEncode                22818243       22501647       -1.39%
      BenchmarkJSONDecode                97182444       85658808       -11.86%
      BenchmarkMandelbrot200             4733516        4700108        -0.71%
      BenchmarkGoParse                   5054384        4712247        -6.77%
      BenchmarkRegexpMatchMedium_1K      67612          73490          +8.69%
      BenchmarkRegexpMatchHard_1K        107321         117495         +9.48%
      BenchmarkRevcomp                   733270055      659352759      -10.08%
      BenchmarkTemplate                  109304977      112819078      +3.21%
      
      Comparing Go 1.2 against this CL on an Intel Xeon E5520:
      
      BenchmarkBinaryTree17              5986953594     5393104469     -9.92%
      BenchmarkFannkuch11                4861139174     4327177615     -10.98%
      BenchmarkGobDecode                 11830997       11235272       -5.04%
      BenchmarkGobEncode                 6608722        6959837        +5.31%
      BenchmarkGzip                      661875826      671769097      +1.49%
      BenchmarkGunzip                    138630019      141096376      +1.78%
      BenchmarkHTTPClientServer          71534          73610          +2.90%
      BenchmarkJSONEncode                30393609       31796106       +4.61%
      BenchmarkJSONDecode                139645860      114239137      -18.19%
      BenchmarkMandelbrot200             5988660        6003077        +0.24%
      BenchmarkGoParse                   6974092        6405995        -8.15%
      BenchmarkRegexpMatchMedium_1K      111331         113895         +2.30%
      BenchmarkRegexpMatchHard_1K        165961         168420         +1.48%
      BenchmarkRevcomp                   995049292      892319935      -10.32%
      BenchmarkTemplate                  145623363      148998339      +2.32%
      
      Fixes #8036.
      
      LGTM=khr
      R=golang-codereviews, josharian, khr
      CC=golang-codereviews, iant, r
      https://golang.org/cl/99660044
      1afbceb5
    • Ian Lance Taylor's avatar
      runtime: add zero field to rtype · aad4609c
      Ian Lance Taylor authored
      The rtype struct is meant to be a copy of reflect.rtype.  The
      zero field was added to reflect.rtype in 18495:6e50725ac753.
      
      LGTM=rsc
      R=khr, rsc
      CC=golang-codereviews
      https://golang.org/cl/93660045
      aad4609c
  2. 29 May, 2014 2 commits
    • Russ Cox's avatar
      cmd/gc: fix x=x crash · 89d46fed
      Russ Cox authored
      [Same as CL 102820043 except applied changes to 6g/gsubr.c
      also to 5g/gsubr.c and 8g/gsubr.c. The problem I had last night
      trying to do that was that 8g's copy of nodarg has different
      (but equivalent) control flow and I was pasting the new code
      into the wrong place.]
      
      Description from CL 102820043:
      
      The 'nodarg' function is used to obtain a Node*
      representing a function argument or result.
      It returned a brand new Node*, but that violates
      the guarantee in most places in the compiler that
      two Node*s refer to the same variable if and only if
      they are the same Node* pointer. Reestablish that
      invariant by making nodarg return a preexisting
      named variable if present.
      
      Having fixed that, avoid any copy during x=x in
      componentgen, because the VARDEF we emit
      before the copy marks the lhs x as dead incorrectly.
      
      The change in walk.c avoids modifying the result
      of nodarg. This was the only place in the compiler
      that did so.
      
      Fixes #8097.
      
      LGTM=khr
      R=golang-codereviews, khr
      CC=golang-codereviews, iant, khr, r
      https://golang.org/cl/103750043
      89d46fed
    • Russ Cox's avatar
      undo CL 102820043 / b0ce6dbafc18 · 9dd062b8
      Russ Cox authored
      Breaks 386 and arm builds.
      The obvious reason is that this CL only edited 6g/gsubr.c
      and failed to edit 5g/gsubr.c and 8g/gsubr.c.
      However, the obvious CL applying the same edit to those
      files (CL 101900043) causes mysterious build failures
      in various of the standard package tests, usually involving
      reflect. Something deep and subtle is broken but only on
      the 32-bit systems.
      
      Undo this CL for now.
      
      ««« original CL description
      cmd/gc: fix x=x crash
      
      The 'nodarg' function is used to obtain a Node*
      representing a function argument or result.
      It returned a brand new Node*, but that violates
      the guarantee in most places in the compiler that
      two Node*s refer to the same variable if and only if
      they are the same Node* pointer. Reestablish that
      invariant by making nodarg return a preexisting
      named variable if present.
      
      Having fixed that, avoid any copy during x=x in
      componentgen, because the VARDEF we emit
      before the copy marks the lhs x as dead incorrectly.
      
      The change in walk.c avoids modifying the result
      of nodarg. This was the only place in the compiler
      that did so.
      
      Fixes #8097.
      
      LGTM=r, khr
      R=golang-codereviews, r, khr
      CC=golang-codereviews, iant
      https://golang.org/cl/102820043
      »»»
      
      TBR=r
      CC=golang-codereviews, khr
      https://golang.org/cl/95660043
      9dd062b8
  3. 28 May, 2014 17 commits
  4. 27 May, 2014 3 commits
  5. 26 May, 2014 1 commit
  6. 24 May, 2014 2 commits
  7. 23 May, 2014 1 commit
  8. 22 May, 2014 2 commits
    • Robert Griesemer's avatar
      spec: explicitly disallow blank methods in interface types · 2c83f1ea
      Robert Griesemer authored
      The spec was unclear about whether blank methods should be
      permitted in interface types. gccgo permits at most one, gc
      crashes if there are more than one, go/types permits at most
      one.
      
      Discussion:
      
      Since method sets of non-interface types never contain methods
      with blank names (blank methods are never declared), it is impossible
      to satisfy an interface with a blank method.
      
      It is possible to declare variables of assignable interface types
      (but not necessarily identical types) containing blank methods, and
      assign those variables to each other, but the values of those
      variables can only be nil.
      
      There appear to be two "reasonable" alternatives:
      
      1) Permit at most one blank method (since method names must be unique),
      and consider it part of the interface. This is what appears to happen
      now, with corner-case bugs. Such interfaces can never be implemented.
      
      2) Permit arbitrary many blank methods but ignore them. This appears
      to be closer to the handling of blank identifiers in declarations.
      However, an interface type literal is not a declaration (it's a type
      literal). Also, for struct types, blank identifiers are not ignored;
      so the analogy with declarations is flawed.
      
      Both these alternatives don't seem to add any benefit and are likely
      (if only slightly) more complicated to explain and implement than
      disallowing blank methods in interfaces altogether.
      
      Fixes #6604.
      
      LGTM=r, rsc, iant
      R=r, rsc, ken, iant
      CC=golang-codereviews
      https://golang.org/cl/99410046
      2c83f1ea
    • Russ Cox's avatar
      doc/go1.3.html: change uintptr to integer in unsafe.Pointer section · 8d8dab34
      Russ Cox authored
      The key property here is what the bit pattern represents,
      not what its type is. Storing 5 into a pointer is the problem.
      Storing a uintptr that holds pointer bits back into a pointer
      is not as much of a problem, and not what we are claiming
      the runtime will detect.
      
      Longer discussion at
      https://groups.google.com/d/msg/golang-nuts/dIGISmr9hw0/0jO4ce85Eh0J
      
      LGTM=r
      R=r
      CC=golang-codereviews
      https://golang.org/cl/98370045
      8d8dab34
  9. 21 May, 2014 10 commits