)]}'
{
  "commit": "da6e915c73f231074dc88f8a952a8273da0ca06b",
  "tree": "e063197a23750cef7e4629d874f2edda43557216",
  "parents": [
    "76ba5dd1dbaa62b2da53422391f32544090c0ca5"
  ],
  "author": {
    "name": "Eric Fiselier",
    "email": "eric@efcs.ca",
    "time": "Wed Oct 09 03:07:02 2019 +0000"
  },
  "committer": {
    "name": "Eric Fiselier",
    "email": "eric@efcs.ca",
    "time": "Wed Oct 09 03:07:02 2019 +0000"
  },
  "message": "Optimize operator\u003d(const basic_string\u0026) for tail call.\n\nPatch by Martijn Vels (mvels@google.com)\nReviewed as https://reviews.llvm.org/D68276\n\nThis is a non trivial win for externally templated assignment operator.\n\nx86 without tail call (current libc++)\n\n0000000000000000 \u003cstd::string::operator\u003d(std::string const\u0026)\u003e:\n   0:   55                      push   %rbp\n   1:   48 89 e5                mov    %rsp,%rbp\n   4:   53                      push   %rbx\n   5:   50                      push   %rax\n   6:   48 89 fb                mov    %rdi,%rbx\n   9:   48 39 f7                cmp    %rsi,%rdi\n   c:   74 17                   je     25 \u003cstd::string::operator\u003d(std::string const\u0026)+0x25\u003e\n   e:   0f b6 56 17             movzbl 0x17(%rsi),%edx\n  12:   84 d2                   test   %dl,%dl\n  14:   79 07                   jns    1d \u003cstd::string::operator\u003d(std::string const\u0026)+0x1d\u003e\n  16:   48 8b 56 08             mov    0x8(%rsi),%rdx\n  1a:   48 8b 36                mov    (%rsi),%rsi\n  1d:   48 89 df                mov    %rbx,%rdi\n  20:   e8 00 00 00 00          callq  25 \u003cstd::string::operator\u003d(std::string const\u0026)+0x25\u003e\n  25:   48 89 d8                mov    %rbx,%rax\n  28:   48 83 c4 08             add    $0x8,%rsp\n  2c:   5b                      pop    %rbx\n  2d:   5d                      pop    %rbp\n  2e:   c3                      retq\n\nAfter:\n\n0000000000000000 \u003cstd::string::operator\u003d(std::string const\u0026)\u003e:\n   0:   48 39 f7                cmp    %rsi,%rdi\n   3:   74 14                   je     19 \u003cstd::string::operator\u003d(std::string const\u0026)+0x19\u003e\n   5:   0f b6 56 17             movzbl 0x17(%rsi),%edx\n   9:   84 d2                   test   %dl,%dl\n   b:   79 07                   jns    14 \u003cstd::string::operator\u003d(std::string const\u0026)+0x14\u003e\n   d:   48 8b 56 08             mov    0x8(%rsi),%rdx\n  11:   48 8b 36                mov    (%rsi),%rsi\n  14:   e9 00 00 00 00          jmpq   19 \u003cstd::string::operator\u003d(std::string const\u0026)+0x19\u003e\n  19:   48 89 f8                mov    %rdi,%rax\n  1c:   c3                      retq\n\nBenchmark (pending per https://reviews.llvm.org/D67667)\n\n```\nBM_StringAssignStr_Empty_Opaque                     6.23ns ± 0%             5.19ns ± 0%  -16.70%          (p\u003d0.016 n\u003d5+4)\nBM_StringAssignStr_Empty_Transparent                5.86ns ± 0%             5.14ns ± 0%  -12.24%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignStr_Small_Opaque                     8.79ns ± 1%             7.69ns ± 0%  -12.53%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignStr_Small_Transparent                9.44ns ± 0%             8.00ns ± 0%  -15.26%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignStr_Large_Opaque                     25.2ns ± 0%             24.3ns ± 0%   -3.50%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignStr_Large_Transparent                23.6ns ± 0%             22.5ns ± 0%   -4.76%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignStr_Huge_Opaque                       319ns ± 5%              317ns ± 5%     ~             (p\u003d0.690 n\u003d5+5)\nBM_StringAssignStr_Huge_Transparent                  319ns ± 5%              317ns ± 5%     ~             (p\u003d0.421 n\u003d5+5)\nBM_StringAssignAsciiz_Empty_Opaque                  7.41ns ± 0%             7.77ns ± 0%   +4.89%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignAsciiz_Empty_Transparent             7.54ns ± 3%             7.30ns ± 0%   -3.24%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignAsciiz_Small_Opaque                  9.87ns ± 0%            10.24ns ± 1%   +3.76%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignAsciiz_Small_Transparent             10.4ns ± 1%              9.8ns ± 2%   -5.78%          (p\u003d0.008 n\u003d5+5)\nBM_StringAssignAsciiz_Large_Opaque                  30.1ns ± 0%             30.1ns ± 0%     ~             (p\u003d0.167 n\u003d5+5)\nBM_StringAssignAsciiz_Large_Transparent             27.1ns ± 0%             27.4ns ± 0%   +0.92%          (p\u003d0.016 n\u003d4+5)\nBM_StringAssignAsciiz_Huge_Opaque                    383ns ± 4%              382ns ± 4%     ~             (p\u003d0.548 n\u003d5+5)\nBM_StringAssignAsciiz_Huge_Transparent               375ns ± 0%              380ns ± 0%   +1.37%          (p\u003d0.029 n\u003d4+4)\nBM_StringAssignAsciizMix_Opaque                     14.0ns ± 0%             14.0ns ± 0%     ~             (p\u003d0.881 n\u003d5+5)\nBM_StringAssignAsciizMix_Transparent                13.7ns ± 1%             13.8ns ± 0%     ~             (p\u003d0.056 n\u003d5+5)\n```\n\ngit-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@374137 91177308-0d34-0410-b5e6-96231b3b80d8\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8adf6d97c0030ff87f1d58ab8ae230b77607a7d5",
      "old_mode": 33188,
      "old_path": "include/string",
      "new_id": "3368fb8bfcd5ae60cc7007991819965c91e240a9",
      "new_mode": 33188,
      "new_path": "include/string"
    }
  ]
}
