1. 04 Apr, 2017 2 commits
    • Martin Möhrmann's avatar
      strings: speed up Fields · bebfd4ba
      Martin Möhrmann authored
      - use a string lookup to detect if a single byte is a space character
      - determine the exact number of fields for ASCII and
        a possibly underestimated number of fields for non ASCII strings
        by doing a separate byte for byte scan of the input string
        before collecting the fields in an extra pass
      - provide a fast path for ASCII only strings when collecting the fields
      - avoid utf8.DecodeRuneInString and unicode.IsSpace for ASCII characters
      
      Used golang.org/cl/33108 from Joe Tsai as starting point.
      
      name                      old time/op    new time/op     delta
      Fields/ASCII/16              284ns ± 1%      116ns ± 2%   -59.30%  (p=0.000 n=9+10)
      Fields/ASCII/256            3.81µs ± 1%     0.80µs ± 1%   -79.10%  (p=0.000 n=10+10)
      Fields/ASCII/4096           61.4µs ± 1%     12.3µs ± 1%   -79.96%  (p=0.000 n=10+9)
      Fields/ASCII/65536           982µs ± 1%      235µs ± 0%   -76.04%  (p=0.000 n=10+9)
      Fields/ASCII/1048576        16.7ms ± 2%      5.4ms ± 1%   -67.52%  (p=0.000 n=10+10)
      Fields/Mixed/16              314ns ± 1%      168ns ± 1%   -46.33%  (p=0.000 n=9+10)
      Fields/Mixed/256            3.92µs ± 1%     1.17µs ± 1%   -70.19%  (p=0.000 n=10+10)
      Fields/Mixed/4096           69.1µs ± 1%     19.0µs ± 1%   -72.53%  (p=0.000 n=10+10)
      Fields/Mixed/65536          1.12ms ± 1%     0.39ms ± 0%   -65.37%  (p=0.000 n=10+9)
      Fields/Mixed/1048576        19.0ms ± 2%      7.3ms ± 4%   -61.75%  (p=0.000 n=10+9)
      
      name                      old speed      new speed       delta
      Fields/ASCII/16           56.3MB/s ± 1%  138.1MB/s ± 2%  +145.31%  (p=0.000 n=9+10)
      Fields/ASCII/256          67.1MB/s ± 1%  321.0MB/s ± 1%  +378.26%  (p=0.000 n=10+10)
      Fields/ASCII/4096         66.7MB/s ± 1%  333.0MB/s ± 1%  +398.97%  (p=0.000 n=10+9)
      Fields/ASCII/65536        66.7MB/s ± 1%  278.4MB/s ± 0%  +317.39%  (p=0.000 n=10+9)
      Fields/ASCII/1048576      62.7MB/s ± 2%  192.9MB/s ± 1%  +207.82%  (p=0.000 n=10+10)
      Fields/Mixed/16           51.0MB/s ± 2%   94.9MB/s ± 1%   +85.87%  (p=0.000 n=10+10)
      Fields/Mixed/256          65.4MB/s ± 1%  219.2MB/s ± 1%  +235.33%  (p=0.000 n=10+10)
      Fields/Mixed/4096         59.3MB/s ± 1%  215.7MB/s ± 1%  +263.98%  (p=0.000 n=10+10)
      Fields/Mixed/65536        58.6MB/s ± 1%  169.1MB/s ± 0%  +188.73%  (p=0.000 n=10+9)
      Fields/Mixed/1048576      55.1MB/s ± 2%  144.0MB/s ± 4%  +161.44%  (p=0.000 n=10+9)
      
      Updates #19789
      Updates #17856
      
      Change-Id: If2ce1479542702e9cd65a82a462ba55ac8eb3876
      Reviewed-on: https://go-review.googlesource.com/37959
      Run-TryBot: Martin Möhrmann <moehrmann@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarJoe Tsai <thebrokentoaster@gmail.com>
      bebfd4ba
    • Keith Randall's avatar
      cmd/compile: intrinsics for math/bits.OnesCount · 5cadc91b
      Keith Randall authored
      Popcount instructions on amd64 are not guaranteed to be
      present, so we must guard their call.  Rewrite rules can't
      generate control flow at the moment, so the intrinsifier
      needs to generate that code.
      
      name           old time/op  new time/op  delta
      OnesCount-8    2.47ns ± 5%  1.04ns ± 2%  -57.70%  (p=0.000 n=10+10)
      OnesCount16-8  1.05ns ± 1%  0.78ns ± 0%  -25.56%    (p=0.000 n=9+8)
      OnesCount32-8  1.63ns ± 5%  1.04ns ± 2%  -35.96%  (p=0.000 n=10+10)
      OnesCount64-8  2.45ns ± 0%  1.04ns ± 1%  -57.55%   (p=0.000 n=6+10)
      
      Update #18616
      
      Change-Id: I4aff2cc9aa93787898d7b22055fe272a7cf95673
      Reviewed-on: https://go-review.googlesource.com/38320
      Run-TryBot: Keith Randall <khr@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      5cadc91b
  2. 03 Apr, 2017 19 commits
    • Eric Lagergren's avatar
      bytes, strings: declare variables inside loop they're used in · 59f6549d
      Eric Lagergren authored
      The recently updated Count functions declare variables before
      special-cased returns.
      
      Change-Id: I8f726118336b7b0ff72117d12adc48b6e37e60ea
      Reviewed-on: https://go-review.googlesource.com/39357Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      59f6549d
    • Josh Bleecher Snyder's avatar
      cmd/compile: Fatal instead of panic in large bvbulkalloc · 42426ed4
      Josh Bleecher Snyder authored
      This provides better diagnostics when it occurs.
      
      Updates #19751
      
      Change-Id: I87db54c22e1345891b418c1741dc76ac5fb8ed00
      Reviewed-on: https://go-review.googlesource.com/39358
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      42426ed4
    • Eric Lagergren's avatar
      all: fix minor misspellings · 094498c9
      Eric Lagergren authored
      Change-Id: I1f1cfb161640eb8756fb1a283892d06b30b7a8fa
      Reviewed-on: https://go-review.googlesource.com/39356Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      094498c9
    • Josh Bleecher Snyder's avatar
      cmd/compile: unroll small static maps · 50688fcb
      Josh Bleecher Snyder authored
      When a map is small, it's not worth putting
      the contents in an array and then looping over the array.
      Just generate code instead.
      
      This makes smaller binaries.
      It might also be better for cache lines.
      
      It also can avoids adding control flow in the middle
      of the init function, which can be very large.
      Eliminating this source of extra blocks
      makes phi insertion easier for temp-heavy init functions.
      This reduces the time required for compiler to
      panic while compiling the code in #19751
      from 15 minutes to 45 seconds.
      
      The cutoff of 25 was chosen fairly unscientifically
      by looking at the size of cmd/go.
      
      Cutoff of   0: 10689604
      Cutoff of   5: 10683572
      Cutoff of  15: 10682324
      Cutoff of  25: 10681700
      Cutoff of  50: 10685476
      Cutoff of 100: 10689412
      
      There are probably more sophisticated mechanisms available.
      For example, the smaller the key/value sizes, the better
      generated code will be vs a table.
      Nevertheless this is simple and seems like a good start.
      
      Updates #19751
      
      name       old time/op     new time/op     delta
      Template       204ms ± 6%      202ms ± 5%  -0.78%  (p=0.027 n=47+45)
      Unicode       84.8ms ± 6%     85.2ms ± 7%    ~     (p=0.146 n=46+45)
      GoTypes        551ms ± 2%      556ms ± 3%  +0.76%  (p=0.004 n=43+45)
      SSA            3.93s ± 3%      3.95s ± 4%    ~     (p=0.179 n=50+49)
      Flate          123ms ± 4%      123ms ± 5%    ~     (p=0.201 n=47+49)
      GoParser       145ms ± 3%      145ms ± 4%    ~     (p=0.937 n=50+50)
      Reflect        356ms ± 3%      354ms ± 5%  -0.44%  (p=0.048 n=46+50)
      Tar            107ms ± 6%      106ms ± 6%    ~     (p=0.188 n=50+49)
      XML            201ms ± 4%      200ms ± 4%    ~     (p=0.085 n=50+49)
      
      name       old user-ns/op  new user-ns/op  delta
      Template        252M ± 9%       250M ± 7%    ~     (p=0.206 n=49+47)
      Unicode         106M ± 7%       106M ± 9%    ~     (p=0.331 n=47+46)
      GoTypes         724M ± 5%       729M ± 5%    ~     (p=0.160 n=47+49)
      SSA            5.64G ± 2%      5.62G ± 4%    ~     (p=0.148 n=47+50)
      Flate           147M ± 6%       147M ± 5%    ~     (p=0.466 n=50+49)
      GoParser        179M ± 5%       179M ± 6%    ~     (p=0.584 n=50+49)
      Reflect         448M ± 6%       441M ± 8%  -1.39%  (p=0.027 n=50+49)
      Tar             124M ± 6%       123M ± 5%    ~     (p=0.221 n=50+47)
      XML             244M ± 5%       243M ± 4%    ~     (p=0.275 n=49+49)
      
      name       old alloc/op    new alloc/op    delta
      Template      39.9MB ± 0%     39.4MB ± 0%  -1.28%  (p=0.008 n=5+5)
      Unicode       29.8MB ± 0%     29.8MB ± 0%    ~     (p=0.310 n=5+5)
      GoTypes        113MB ± 0%      113MB ± 0%    ~     (p=0.421 n=5+5)
      SSA            854MB ± 0%      854MB ± 0%    ~     (p=0.151 n=5+5)
      Flate         25.3MB ± 0%     25.3MB ± 0%    ~     (p=1.000 n=5+5)
      GoParser      31.8MB ± 0%     31.8MB ± 0%    ~     (p=0.222 n=5+5)
      Reflect       78.2MB ± 0%     78.2MB ± 0%    ~     (p=1.000 n=5+5)
      Tar           26.7MB ± 0%     26.7MB ± 0%    ~     (p=0.841 n=5+5)
      XML           42.3MB ± 0%     42.3MB ± 0%  -0.15%  (p=0.008 n=5+5)
      
      name       old allocs/op   new allocs/op   delta
      Template        390k ± 1%       386k ± 1%  -1.05%  (p=0.016 n=5+5)
      Unicode         319k ± 0%       320k ± 0%    ~     (p=0.310 n=5+5)
      GoTypes        1.14M ± 0%      1.14M ± 0%    ~     (p=0.421 n=5+5)
      SSA            7.60M ± 0%      7.59M ± 0%    ~     (p=0.310 n=5+5)
      Flate           234k ± 0%       235k ± 1%    ~     (p=1.000 n=5+5)
      GoParser        315k ± 1%       317k ± 0%    ~     (p=0.151 n=5+5)
      Reflect         978k ± 0%       978k ± 0%    ~     (p=0.841 n=5+5)
      Tar             251k ± 1%       251k ± 1%    ~     (p=0.690 n=5+5)
      XML             394k ± 0%       392k ± 0%    ~     (p=0.056 n=5+5)
      
      
      Change-Id: Ic53a18627082abe075a1cbc33330ce015e50850a
      Reviewed-on: https://go-review.googlesource.com/39354
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      50688fcb
    • Keith Randall's avatar
      cmd/compile: automatically handle commuting ops in rewrite rules · 53f8a6ae
      Keith Randall authored
      Note that this is a redo of an undo of the original buggy CL 38666.
      
      We have lots of rewrite rules that vary only in the fact that
      we have 2 versions for the 2 different orderings of various
      commuting ops. For example:
      
      (ADDL x (MOVLconst [c])) -> (ADDLconst [c] x)
      (ADDL (MOVLconst [c]) x) -> (ADDLconst [c] x)
      
      It can get unwieldly quickly, especially when there is more than
      one commuting op in a rule.
      
      Our existing "fix" for this problem is to have rules that
      canonicalize the operations first. For example:
      
      (Eq64 x (Const64 <t> [c])) && x.Op != OpConst64 -> (Eq64 (Const64 <t> [c]) x)
      
      Subsequent rules can then assume if there is a constant arg to Eq64,
      it will be the first one. This fix kinda works, but it is fragile and
      only works when we remember to include the required extra rules.
      
      The fundamental problem is that the rule matcher doesn't
      know anything about commuting ops. This CL fixes that fact.
      
      We already have information about which ops commute. (The register
      allocator takes advantage of commutivity.)  The rule generator now
      automatically generates multiple rules for a single source rule when
      there are commutative ops in the rule. We can now drop all of our
      almost-duplicate source-level rules and the canonicalization rules.
      
      I have some CLs in progress that will be a lot less verbose when
      the rule generator handles commutivity for me.
      
      I had to reorganize the load-combining rules a bit. The 8-way OR rules
      generated 128 different reorderings, which was causing the generator
      to put too much code in the rewrite*.go files (the big ones were going
      from 25K lines to 132K lines). Instead I reorganized the rules to
      combine pairs of loads at a time. The generated rule files are now
      actually a bit (5%) smaller.
      
      Make.bash times are ~unchanged.
      
      Compiler benchmarks are not observably different. Probably because
      we don't spend much compiler time in rule matching anyway.
      
      I've also done a pass over all of our ops adding commutative markings
      for ops which hadn't had them previously.
      
      Fixes #18292
      
      Change-Id: Ic1c0e43fbf579539f459971625f69690c9ab8805
      Reviewed-on: https://go-review.googlesource.com/38801
      Run-TryBot: Keith Randall <khr@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarDavid Chase <drchase@google.com>
      53f8a6ae
    • Keith Randall's avatar
      cmd/compile: strength-reduce floating point · 63a72fd4
      Keith Randall authored
      x*2 -> x+x
      x/c, c power of 2 -> x*(1/c)
      
      Fixes #19827
      
      Change-Id: I74c9f0b5b49b2ed26c0990314c7d1d5f9631b6f1
      Reviewed-on: https://go-review.googlesource.com/39295
      Run-TryBot: Keith Randall <khr@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarDavid Chase <drchase@google.com>
      63a72fd4
    • Josh Bleecher Snyder's avatar
      cmd/compile: refactor maplit · 095a62c3
      Josh Bleecher Snyder authored
      Instead of walking the list of nodes twice,
      once to find static entries to add to an array
      and once to find dynamic entries to generate code for,
      do the split once up front, into two slices.
      Then process each slice individually.
      This makes the code easier to read
      and more importantly, easier to modify.
      
      While we're here, add a TODO to avoid
      using temporaries for mapassign_fast calls.
      It's not an important TODO;
      the generated code would be basically identical.
      It would just avoid a minor amount of
      pointless SSA optimization work.
      
      Passes toolstash-check.
      No measureable compiler performance impact.
      
      Updates #19751
      
      Change-Id: I84a8f2c22f9025c718ef34639059d7bd02a3c406
      Reviewed-on: https://go-review.googlesource.com/39351
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      095a62c3
    • Russ Cox's avatar
      encoding/pem: yet another fuzz fake failure · 1d6a499c
      Russ Cox authored
      Fixes #19829.
      
      Change-Id: I8500fd73c37b504d6ea25f5aff7017fbc0718570
      Reviewed-on: https://go-review.googlesource.com/39314
      Run-TryBot: Russ Cox <rsc@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      1d6a499c
    • Brad Fitzpatrick's avatar
      cmd/compile/internal/ssa: use recently agreed upon generated code header · 69fe9ea4
      Brad Fitzpatrick authored
      Updates #13560
      
      Change-Id: I9bc08ca5cf0627e653d55f748ebb83be8b69ea3b
      Reviewed-on: https://go-review.googlesource.com/39296
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      Reviewed-by: default avatarRob Pike <r@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      69fe9ea4
    • Josh Bleecher Snyder's avatar
      cmd/compile: respect Node.Bounded when inserting OpArraySelect · 7439ba32
      Josh Bleecher Snyder authored
      This triggers 119 times during make.bash.
      
      This CL reduces the time it takes for the
      compiler to panic while compiling the code in #19751 
      from 22 minutes to 15 minutes. Yay, I guess.
      
      Updates #19751 
      
      Change-Id: I8ca7f1ae75f89d1eb2a361d67b3055a975221734
      Reviewed-on: https://go-review.googlesource.com/39294
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      7439ba32
    • David Chase's avatar
      cmd/compile: rewrite upper-bit-clear idiom to use shift-rotate · 9d5987d7
      David Chase authored
      Old buggy hardware incorrectly executes the shift-left-K
      then shift-right-K idiom for clearing K leftmost bits.
      Use a right rotate instead of shift to avoid triggering the
      bug.
      
      Fixes #19809.
      
      Change-Id: I6dc646b183c29e9d01aef944729f34388dcc687d
      Reviewed-on: https://go-review.googlesource.com/39310
      Run-TryBot: David Chase <drchase@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRuss Cox <rsc@golang.org>
      9d5987d7
    • Daniel Martí's avatar
      go/parser: fix example to run on the playground · d6b99943
      Daniel Martí authored
      The example shouldn't rely on the existance of example_test.go. That
      breaks in the playground, which is what the "run" button in
      https://golang.org/pkg/go/parser/#example_ParseFile does.
      
      Make the example self-sufficient by using a small piece of source via a
      string literal instead.
      
      Fixes #19823.
      
      Change-Id: Ie8a3c6c5d00724e38ff727862b62e6a3621adc88
      Reviewed-on: https://go-review.googlesource.com/39236
      Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
      Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      d6b99943
    • Josh Bleecher Snyder's avatar
      cmd/internal/obj: use string instead of LSym in Pcln · 26308fb4
      Josh Bleecher Snyder authored
      In a concurrent backend, Ctxt.Lookup will need some
      form of concurrency protection, which will make it
      more expensive.
      
      This CL changes the pcln table builder to track
      filenames as strings rather than LSyms.
      Those strings are then converted into LSyms
      at the last moment, for writing the object file.
      
      This CL removes over 85% of the calls to Ctxt.Lookup
      in a run of make.bash.
      
      Passes toolstash-check.
      
      Updates #15756
      
      Change-Id: I3c53deff6f16f2643169f3bdfcc7aca2ca58b0a4
      Reviewed-on: https://go-review.googlesource.com/39291
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      26308fb4
    • Russ Cox's avatar
      testing/quick: generate all possible int64, uint64 values · 719c7b03
      Russ Cox authored
      When generating a random int8, uint8, int16, uint16, int32, uint32,
      quick.Value chooses among all possible values.
      
      But when generating a random int64 or uint64, it only chooses
      values in the range [-2⁶², 2⁶²) (even for uint64).
      It should, like for all the other integers, use the full range.
      
      If it had, this would have caught #19807 earlier.
      Instead it let us discover the presence of #19809.
      
      While we are here, also make the default source of
      randomness not completely deterministic.
      
      Fixes #19808.
      
      Change-Id: I070f852531c92b3670bd76523326c9132bfc9416
      Reviewed-on: https://go-review.googlesource.com/39152
      Run-TryBot: Russ Cox <rsc@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRob Pike <r@golang.org>
      719c7b03
    • Russ Cox's avatar
      encoding/pem: do not try to round trip value with leading/trailing space · 65c17a05
      Russ Cox authored
      The header is literally
      
      	Key: Value
      
      If the value or the key has leading or trailing spaces, those will
      be lost by the round trip.
      
      Found because testing/quick returns different values now.
      
      Change-Id: I0f574bdbb5990689509c24309854d8f814b5efa0
      Reviewed-on: https://go-review.googlesource.com/39211
      Run-TryBot: Russ Cox <rsc@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      65c17a05
    • Josh Bleecher Snyder's avatar
      cmd/compile: len(n.List.Slice()) -> n.List.Len() · 64f00fb1
      Josh Bleecher Snyder authored
      Minor cleanup.
      
      This is the only such instance in the compiler.
      
      Change-Id: I4e8ecde57d71867c7e1ac4d17e2154a91dd262b0
      Reviewed-on: https://go-review.googlesource.com/39209
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarDave Cheney <dave@cheney.net>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      64f00fb1
    • Josh Bleecher Snyder's avatar
      cmd/compile: add block profiling support · 96af8174
      Josh Bleecher Snyder authored
      Updates #15756
      
      Change-Id: Ic635812b324af926333122c02908cebfb24d7bce
      Reviewed-on: https://go-review.googlesource.com/39208
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      96af8174
    • Josh Bleecher Snyder's avatar
      cmd/compile: enforce that all nodes are used when generating DWARF · 87757472
      Josh Bleecher Snyder authored
      No particular need for this,
      but it's nice to enforce invariants
      when they are available.
      
      Change-Id: Ia6fa88dc4116f65dac2879509746e123e2c1862a
      Reviewed-on: https://go-review.googlesource.com/39201
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      87757472
    • Josh Bleecher Snyder's avatar
      cmd/compile: don't modify nodfp in AllocFrame · 37515135
      Josh Bleecher Snyder authored
      nodfp is a global, so modifying it is unsafe in a concurrent backend.
      It is also not necessary, since the Used marks
      are only relevant for nodes in fn.Dcl.
      For good measure, mark nodfp as always used.
      
      Passes toolstash-check.
      
      Updates #15756
      
      Change-Id: I5320459f5eced2898615a17b395a10c1064bcaf5
      Reviewed-on: https://go-review.googlesource.com/39200
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      37515135
  3. 02 Apr, 2017 1 commit
  4. 01 Apr, 2017 5 commits
  5. 31 Mar, 2017 13 commits