)]}'
{
  "commit": "94410c794e80a4dda1719299fe82dfc36c88ec56",
  "tree": "d0c3221ba7f9f4e2565de0170970db5604498d3f",
  "parents": [
    "297c1d297f4cee55a6aee5eb68583d0139aef076"
  ],
  "author": {
    "name": "Josh Bleecher Snyder",
    "email": "josharian@gmail.com",
    "time": "Thu Jan 08 15:30:02 2015 -0800"
  },
  "committer": {
    "name": "Josh Bleecher Snyder",
    "email": "josharian@gmail.com",
    "time": "Wed Apr 01 16:32:20 2015 +0000"
  },
  "message": "cmd/gc: teach componentgen about string constants\n\nThis makes it cheaper to copy string literals.\nThis happens just about anywhere that they are used.\n\nExample:\n\nfunc f() string {\n\treturn \"f\"\n}\n\nUsing 6g, compiler output before:\n\n\"\".f t\u003d1 size\u003d32 value\u003d0 args\u003d0x10 locals\u003d0x0\n\t0x0000 00000 (p.go:3)\tTEXT\t\"\".f+0(SB),4,$0-16\n\t0x0000 00000 (p.go:3)\tFUNCDATA\t$0,gclocals·d64e51a4c4bfeaa840e480961ec6b0b3+0(SB)\n\t0x0000 00000 (p.go:3)\tFUNCDATA\t$1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)\n\t0x0000 00000 (p.go:4)\tLEAQ\tgo.string.\"f\"+0(SB),BX\n\t0x0007 00007 (p.go:4)\tMOVQ\t(BX),BP\n\t0x000a 00010 (p.go:4)\tMOVQ\tBP,\"\".~r0+8(FP)\n\t0x000f 00015 (p.go:4)\tMOVQ\t8(BX),BP\n\t0x0013 00019 (p.go:4)\tMOVQ\tBP,\"\".~r0+16(FP)\n\t0x0018 00024 (p.go:4)\tRET\t,\n\nAfter:\n\n\"\".f t\u003d1 size\u003d32 value\u003d0 args\u003d0x10 locals\u003d0x0\n\t0x0000 00000 (p.go:3)\tTEXT\t\"\".f+0(SB),4,$0-16\n\t0x0000 00000 (p.go:3)\tFUNCDATA\t$0,gclocals·d64e51a4c4bfeaa840e480961ec6b0b3+0(SB)\n\t0x0000 00000 (p.go:3)\tFUNCDATA\t$1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)\n\t0x0000 00000 (p.go:4)\tMOVQ\t$go.string.\"f\"+16(SB),BX\n\t0x0007 00007 (p.go:4)\tMOVQ\tBX,\"\".~r0+8(FP)\n\t0x000c 00012 (p.go:4)\tMOVQ\t$1,\"\".~r0+16(FP)\n\t0x0015 00021 (p.go:4)\tRET\t,\n\nThe leading MOVQ here will be converted into a LEAQ by the linker,\nbut there is still a net reduction of two MOVQs.\n\nBefore:\n\nTEXT main.f(SB)\n        p.go:4  0x2000  488d1d49500500  LEAQ 0x55049(IP), BX\n        p.go:4  0x2007  488b2b          MOVQ 0(BX), BP\n        p.go:4  0x200a  48896c2408      MOVQ BP, 0x8(SP)\n        p.go:4  0x200f  488b6b08        MOVQ 0x8(BX), BP\n        p.go:4  0x2013  48896c2410      MOVQ BP, 0x10(SP)\n        p.go:4  0x2018  c3              RET\n\nAfter:\n\nTEXT main.f(SB)\n        p.go:4  0x2000  488d1dd94c0500          LEAQ 0x54cd9(IP), BX\n        p.go:4  0x2007  48895c2408              MOVQ BX, 0x8(SP)\n        p.go:4  0x200c  48c744241001000000      MOVQ $0x1, 0x10(SP)\n        p.go:4  0x2015  c3                      RET\n\nThe performance improvement is small but widespread.\n\nAs a nice small example, net/url\u0027s sole benchmark using 6g:\n\nbenchmark           old ns/op     new ns/op     delta\nBenchmarkString     16372         16118         -1.55%\n\nAnd with 8g:\n\nbenchmark           old ns/op     new ns/op     delta\nBenchmarkString     22034         21709         -1.47%\n\nChange-Id: I4ce202ee7dbd4057be869e2faaaa638c28a1fff0\nReviewed-on: https://go-review.googlesource.com/2587\nReviewed-by: Russ Cox \u003crsc@golang.org\u003e\nRun-TryBot: Josh Bleecher Snyder \u003cjosharian@gmail.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "445efc9ad0e116378bc8e6b6a8be2cf67e629474",
      "old_mode": 33188,
      "old_path": "src/cmd/internal/gc/gen.go",
      "new_id": "1a7f76fd0845928ddf9894ebbe82e0404851c7c8",
      "new_mode": 33188,
      "new_path": "src/cmd/internal/gc/gen.go"
    }
  ]
}
