1. 15 Feb, 2018 21 commits
  2. 14 Feb, 2018 19 commits
    • Robert Griesemer's avatar
      cmd/compile/internal/syntax: follow Go naming conventions for error methods · f04eebfd
      Robert Griesemer authored
      Also, remove parser.error method (in favor of parser.errorAt) as it's only
      used twice.
      
      This is a purely cosmetic change.
      
      Change-Id: Idb3b8b50f1c2e4d10de2ffb1c1184ceba8f7de8a
      Reviewed-on: https://go-review.googlesource.com/94030Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
      f04eebfd
    • Keith Randall's avatar
      cmd/compile: fix constant folding of right shifts on s390x · 1566bf90
      Keith Randall authored
      Repeat previous fix on amd64 for s390x.
      Sub-word right shifts should sign extend before shifting.
      
      Update #23812
      
      Change-Id: I2d770190c7d8a22310b0dbd9facb3fb05afa362a
      Reviewed-on: https://go-review.googlesource.com/94028
      Run-TryBot: Keith Randall <khr@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      1566bf90
    • Matthew Dempsky's avatar
      cmd/compile: fix printing of untyped types in -W output · c3e8da67
      Matthew Dempsky authored
      It's always useful to distinguish "bool" and "string" from "untyped
      bool" and "untyped string", so change typefmt to do this
      unconditionally.
      
      Also, while here, replace a bare 0 with its named constant FErr.
      
      Fixes #23833.
      
      Change-Id: I3fcb8d7204686937439caaaf8b3973fc236d0387
      Reviewed-on: https://go-review.googlesource.com/94021
      Run-TryBot: Matthew Dempsky <mdempsky@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      c3e8da67
    • Cherry Zhang's avatar
      cmd/compile: fix go:uintptrescapes tag for unnamed parameters · beeab6ac
      Cherry Zhang authored
      The tag was overwritten by the code for special handling unnamed
      parameters.
      
      Fixes #23045.
      
      Change-Id: Ie2e1db3e902a07a2bbbc2a3424cea300f0a42cc3
      Reviewed-on: https://go-review.googlesource.com/82775
      Run-TryBot: Cherry Zhang <cherryyz@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
      beeab6ac
    • Joe Tsai's avatar
      encoding/json: make error capture logic in recover more type safe · 91a6a2a3
      Joe Tsai authored
      Rather than only ignoring runtime.Error panics, which are a very
      narrow set of possible panic values, switch it such that the json
      package only captures panic values that have been properly wrapped
      in a jsonError struct. This ensures that only intentional panics
      originating from the json package are captured.
      
      Fixes #23012
      
      Change-Id: I5e85200259edd2abb1b0512ce6cc288849151a6d
      Reviewed-on: https://go-review.googlesource.com/94019
      Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      91a6a2a3
    • Robert Griesemer's avatar
      go/types: make gotype continue after syntax errors · 70a04f68
      Robert Griesemer authored
      This avoids odd behavior where sometimes a lot of useful
      errors are not reported simply because of a small syntax
      error.
      
      Tested manually with non-existing files. (We cannot easily
      add an automatic test because this is a stand-alone binary
      in this directory that must be built manually.)
      
      Fixes #23593.
      
      Change-Id: Iff90f95413bed7d1023fa0a5c9eb0414144428a9
      Reviewed-on: https://go-review.googlesource.com/93815Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
      70a04f68
    • Keith Randall's avatar
      cmd/compile: constant fold !true and !false · 8f9cf552
      Keith Randall authored
      Constant fold Not of boolean constants.
      
      Noticed while working on #23504.
      
      Change-Id: I965705154ee7348a1a159fad4e029b922d3171b3
      Reviewed-on: https://go-review.googlesource.com/88956
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarMartin Möhrmann <moehrmann@google.com>
      8f9cf552
    • Ian Lance Taylor's avatar
      test: add test case for incorrect gccgo compilation error · d1f679a6
      Ian Lance Taylor authored
      Updates #23489
      
      Change-Id: Ie846ccfe4c4d9295857f5da6863ac8f2ac0f2f6a
      Reviewed-on: https://go-review.googlesource.com/89935
      Run-TryBot: Ian Lance Taylor <iant@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      d1f679a6
    • Ian Lance Taylor's avatar
      test: add a test that gccgo miscompiled · 034aca1c
      Ian Lance Taylor authored
      Updates #20923
      
      Change-Id: Ia1210ea3dec39e5db2521aeafca24d6e731f0c93
      Reviewed-on: https://go-review.googlesource.com/91657
      Run-TryBot: Ian Lance Taylor <iant@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      034aca1c
    • Ian Lance Taylor's avatar
      test: add test for rounding to positive zero · d9fc1929
      Ian Lance Taylor authored
      Per the language spec clarification in https://golang.org/cl/14727.
      
      Updates #12576
      Updates #12621
      
      Change-Id: I1e459c3c11a571bd29582761faacaa9ca3178ba6
      Reviewed-on: https://go-review.googlesource.com/91895
      Run-TryBot: Ian Lance Taylor <iant@golang.org>
      Run-TryBot: Robert Griesemer <gri@golang.org>
      Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      d9fc1929
    • Ilya Tocar's avatar
      cmd/compile/internal/ssa: don't spill register offsets on amd64 · 9916feed
      Ilya Tocar authored
      Transform (ADDQconst SP) into (LEA SP), because lea is rematerializeable,
      so this avoids register spill. We can't mark ADDQconst as rematerializeable,
      because it clobbers flags. This makes go binary ~2kb smaller.
      
      For reference here is generated code for function from bug report.
      Before:
              CALL    "".g(SB)
              MOVBLZX (SP), AX
              LEAQ    8(SP), DI
              TESTB   AX, AX
              JEQ     15
              MOVQ    "".p(SP), SI
              DUFFCOPY        $196
              MOVQ    $0, (SP)
              PCDATA  $0, $1
              CALL    "".h(SB)
              RET
              MOVQ    DI, ""..autotmp_2-8(SP) // extra spill
              PCDATA  $0, $2
              CALL    "".g(SB)
              MOVQ    ""..autotmp_2-8(SP), DI // extra register fill
              MOVQ    "".p(SP), SI
              DUFFCOPY        $196
              MOVQ    $1, (SP)
              PCDATA  $0, $1
              CALL    "".h(SB)
              JMP     14
              END
      
      After:
              CALL    "".g(SB)
              MOVBLZX (SP), AX
              TESTB   AX, AX
              JEQ     15
              LEAQ    8(SP), DI
              MOVQ    "".p(SP), SI
              DUFFCOPY        $196
              MOVQ    $0, (SP)
              PCDATA  $0, $1
              CALL    "".h(SB)
              RET
              PCDATA  $0, $0  // no spill
              CALL    "".g(SB)
              LEAQ    8(SP), DI // rematerialized instead
              MOVQ    "".p(SP), SI
              DUFFCOPY        $196
              MOVQ    $1, (SP)
              PCDATA  $0, $1
              CALL    "".h(SB)
              JMP     14
              END
      
      Fixes #22947
      
      Change-Id: I8f33b860dc6c8828373477171b172ca2ce30074f
      Reviewed-on: https://go-review.googlesource.com/81815
      Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarKeith Randall <khr@golang.org>
      9916feed
    • Ilya Tocar's avatar
      cmd/compile/internal/amd64: update popcnt code generation · de4edf3d
      Ilya Tocar authored
      Popcnt has false dependency on output register and generates
      MOVQ $0, reg to break it. But recently we switched MOVQ $0, reg
      encoding from xor reg, reg  to actual mov $0, reg. This CL updates
      code generation for popcnt to use actual XOR.
      
      Change-Id: I4c1fc11e85758b53ba2679165fa55614ec54b27d
      Reviewed-on: https://go-review.googlesource.com/82516
      Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarKeith Randall <khr@golang.org>
      de4edf3d
    • Heschi Kreinick's avatar
      cmd/compile/internal: pass LocalSlot values, not pointers · 9c4fd462
      Heschi Kreinick authored
      Because getStackOffset is a function pointer, the compiler assumes that
      its arguments escape. Pass a value instead to avoid heap allocations.
      
      Change-Id: Ib94e5941847f134cd00e873040a4d7fcf15ced26
      Reviewed-on: https://go-review.googlesource.com/92397
      Run-TryBot: Heschi Kreinick <heschi@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarDavid Chase <drchase@google.com>
      9c4fd462
    • Heschi Kreinick's avatar
      cmd/compile/internal: reuse memory for valueToProgAfter · b8644e32
      Heschi Kreinick authored
      Not a big improvement, but does help edge cases like the SSA package.
      Change-Id: I40e531110b97efd5f45955be477fd0f4faa8d545
      Reviewed-on: https://go-review.googlesource.com/92396
      Run-TryBot: Heschi Kreinick <heschi@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarDavid Chase <drchase@google.com>
      b8644e32
    • Heschi Kreinick's avatar
      cmd/compile/internal/ssa: use math/bits for register sets · 7ac756f7
      Heschi Kreinick authored
      Using bits.TrailingZeroes instead of iterating over each bit is a small
      but easy win for the common case of only one or two registers being set.
      
      I copied in the implementation for use with pre-1.9 bootstraps.
      
      Change-Id: Ieaa768554d7d5239a5617fbf34f1ee0b32ce1de5
      Reviewed-on: https://go-review.googlesource.com/92395
      Run-TryBot: Heschi Kreinick <heschi@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarDavid Chase <drchase@google.com>
      7ac756f7
    • Heschi Kreinick's avatar
      cmd/compile/internal/ssa: reduce location list memory use · 39eea623
      Heschi Kreinick authored
      Put everything that showed up in the allocation profile into the cache,
      and reuse it across functions.
      
      After this CL, the overhead of enabling location lists is getting
      pretty close to the desired 5%:
      
      compilecmp -all -beforeflags -dwarflocationlists=0 -afterflags -dwarflocationlists=1 -n 30 4ebad42292b6a4090faf37753dd768d2965e38c4 4ebad42292b6a4090faf37753dd768d2965e38c4
      compilecmp  -dwarflocationlists=0 4ebad42292b6a4090faf37753dd768d2965e38c4  -dwarflocationlists=1 4ebad42292b6a4090faf37753dd768d2965e38c4
      benchstat -geomean  /tmp/869550129 /tmp/143495132
      completed   30 of   30, estimated time remaining 0s (eta 3:24PM)
      name        old time/op       new time/op       delta
      Template          199ms ± 4%        209ms ± 6%   +5.17%  (p=0.000 n=29+30)
      Unicode          99.2ms ± 8%      100.5ms ± 6%     ~     (p=0.112 n=30+30)
      GoTypes           642ms ± 3%        684ms ± 3%   +6.54%  (p=0.000 n=29+30)
      SSA               8.00s ± 1%        8.71s ± 1%   +8.78%  (p=0.000 n=29+29)
      Flate             129ms ± 7%        134ms ± 5%   +3.77%  (p=0.000 n=30+30)
      GoParser          157ms ± 4%        164ms ± 5%   +4.35%  (p=0.000 n=29+30)
      Reflect           428ms ± 3%        450ms ± 4%   +5.09%  (p=0.000 n=30+30)
      Tar               195ms ± 5%        204ms ± 8%   +4.78%  (p=0.000 n=30+30)
      XML               228ms ± 4%        241ms ± 4%   +5.62%  (p=0.000 n=30+29)
      StdCmd            15.4s ± 1%        16.7s ± 1%   +8.29%  (p=0.000 n=29+29)
      [Geo mean]        476ms             502ms        +5.35%
      
      name        old user-time/op  new user-time/op  delta
      Template          294ms ±18%        304ms ±15%     ~     (p=0.242 n=29+29)
      Unicode           182ms ±27%        172ms ±28%     ~     (p=0.104 n=30+30)
      GoTypes           957ms ±15%       1016ms ±12%   +6.16%  (p=0.000 n=30+30)
      SSA               13.3s ± 5%        14.3s ± 3%   +7.32%  (p=0.000 n=30+28)
      Flate             188ms ±17%        193ms ±17%     ~     (p=0.288 n=28+29)
      GoParser          232ms ±16%        238ms ±13%     ~     (p=0.065 n=30+29)
      Reflect           585ms ±13%        620ms ±10%   +5.88%  (p=0.000 n=30+30)
      Tar               298ms ±21%        332ms ±23%  +11.32%  (p=0.000 n=30+30)
      XML               329ms ±17%        343ms ±12%   +4.18%  (p=0.032 n=30+30)
      [Geo mean]        492ms             513ms        +4.13%
      
      name        old alloc/op      new alloc/op      delta
      Template         38.3MB ± 0%       40.3MB ± 0%   +5.29%  (p=0.000 n=30+30)
      Unicode          29.3MB ± 0%       29.6MB ± 0%   +1.28%  (p=0.000 n=30+29)
      GoTypes           110MB ± 0%        118MB ± 0%   +6.97%  (p=0.000 n=29+30)
      SSA              1.48GB ± 0%       1.61GB ± 0%   +9.06%  (p=0.000 n=30+30)
      Flate            24.8MB ± 0%       26.0MB ± 0%   +4.99%  (p=0.000 n=29+30)
      GoParser         30.9MB ± 0%       32.2MB ± 0%   +4.20%  (p=0.000 n=30+30)
      Reflect          76.8MB ± 0%       80.6MB ± 0%   +4.97%  (p=0.000 n=30+30)
      Tar              39.6MB ± 0%       41.7MB ± 0%   +5.22%  (p=0.000 n=29+30)
      XML              42.0MB ± 0%       45.4MB ± 0%   +8.22%  (p=0.000 n=29+30)
      [Geo mean]       63.9MB            67.5MB        +5.56%
      
      name        old allocs/op     new allocs/op     delta
      Template           383k ± 0%         405k ± 0%   +5.69%  (p=0.000 n=30+30)
      Unicode            343k ± 0%         346k ± 0%   +0.98%  (p=0.000 n=30+27)
      GoTypes           1.15M ± 0%        1.22M ± 0%   +6.17%  (p=0.000 n=29+29)
      SSA               12.2M ± 0%        13.2M ± 0%   +8.15%  (p=0.000 n=30+30)
      Flate              234k ± 0%         249k ± 0%   +6.44%  (p=0.000 n=30+30)
      GoParser           315k ± 0%         332k ± 0%   +5.31%  (p=0.000 n=30+28)
      Reflect            972k ± 0%        1010k ± 0%   +3.89%  (p=0.000 n=30+30)
      Tar                394k ± 0%         415k ± 0%   +5.35%  (p=0.000 n=28+30)
      XML                404k ± 0%         429k ± 0%   +6.31%  (p=0.000 n=29+29)
      [Geo mean]         651k              686k        +5.35%
      
      Change-Id: Ia005a8d6b33ce9f8091322f004376a3d6e5c1a94
      Reviewed-on: https://go-review.googlesource.com/89357
      Run-TryBot: Heschi Kreinick <heschi@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarDavid Chase <drchase@google.com>
      39eea623
    • Heschi Kreinick's avatar
      cmd/compile: reimplement location list generation · 2075a932
      Heschi Kreinick authored
      Completely redesign and reimplement location list generation to be more
      efficient, and hopefully not too hard to understand.
      
      RegKills are gone. Instead of using the regalloc's liveness
      calculations, redo them using the Ops' clobber information. Besides
      saving a lot of Values, this avoids adding RegKills to blocks that would
      be empty otherwise, which was messing up optimizations. This does mean
      that it's much harder to tell whether the generation process is buggy
      (there's nothing to cross-check it with), and there may be disagreements
      with GC liveness. But the performance gain is significant, and it's nice
      not to be messing with earlier compiler phases.
      
      The intermediate representations are gone. Instead of producing
      ssa.BlockDebugs, then dwarf.LocationLists, and then finally real
      location lists, go directly from the SSA to a (mostly) real location
      list. Because the SSA analysis happens before assembly, it stores
      encoded block/value IDs where PCs would normally go. It would be easier
      to do the SSA analysis after assembly, but I didn't want to retain the
      SSA just for that.
      
      Generation proceeds in two phases: first, it traverses the function in
      CFG order, storing the state of the block at the beginning and end. End
      states are used to produce the start states of the successor blocks. In
      the second phase, it traverses in program text order and produces the
      location lists. The processing in the second phase is redundant, but
      much cheaper than storing the intermediate representation. It might be
      possible to combine the two phases somewhat to take advantage of cases
      where the CFG matches the block layout, but I haven't tried.
      
      Location lists are finalized by adding a base address selection entry,
      translating each encoded block/value ID to a real PC, and adding the
      terminating zero entry. This probably won't work on OSX, where dsymutil
      will choke on the base address selection. I tried emitting CU-relative
      relocations for each address, and it was *very* bad for performance --
      it uses more memory storing all the relocations than it does for the
      actual location list bytes. I think I'm going to end up synthesizing the
      relocations in the linker only on OSX, but TBD.
      
      TestNexting needs updating: with more optimizations working, the
      debugger doesn't stop on the continue (line 88) any more, and the test's
      duplicate suppression kicks in. Also, dx and dy live a little longer
      now, but they have the correct values.
      
      Change-Id: Ie772dfe23a4e389ca573624fac4d05401ae32307
      Reviewed-on: https://go-review.googlesource.com/89356
      Run-TryBot: Heschi Kreinick <heschi@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarDavid Chase <drchase@google.com>
      2075a932
    • Heschi Kreinick's avatar
      cmd/compile/internal: decouple scope tracking from location lists · 7d7af610
      Heschi Kreinick authored
      We're trying to enable location lists by default, and it's easier to do
      that if we don't have to worry about scope tracking at the same time.
      We can evaluate their performance impact separately.
      
      However, that does mean that "err" is ambiguous in the test case, so
      rename it to err2 for now.
      
      Change-Id: I24f119016185c52b7d9affc74207f6a5b450fb6f
      Reviewed-on: https://go-review.googlesource.com/89355
      Run-TryBot: Heschi Kreinick <heschi@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarDavid Chase <drchase@google.com>
      7d7af610
    • Ian Lance Taylor's avatar
      runtime: use private futexes on Linux · 07751f4b
      Ian Lance Taylor authored
      By default futexes are permitted in shared memory regions, which
      requires the kernel to translate the memory address. Since our futexes
      are never in shared memory, set FUTEX_PRIVATE_FLAG, which makes futex
      operations slightly more efficient.
      
      Change-Id: I2a82365ed27d5cd8d53c5382ebaca1a720a80952
      Reviewed-on: https://go-review.googlesource.com/80144Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      Reviewed-by: 's avatarDavid Crawshaw <crawshaw@golang.org>
      07751f4b