tvl-depot/absl
Abseil Team 8fe7214fe2 Export of internal Abseil changes
--
406622c43f296eeedf00e0e9246acfb4ea6ecd5e by Abseil Team <absl-team@google.com>:

Avoid the compiler reloading __is_long() on string_view(const string&)

The underlying cause is that the compiler assume a scenario where string_view is created with placement new into memory occupied by the input, so the store to 'ptr' can affect the value / result of size(); i.e., __is_long() reloads the __size value).

Example code: string_view1 demonstrates the problem, string_view2 DTRT.

=== string_view1
struct string_view1 {
    string_view1(const char* ptr, size_t n) : ptr(ptr), n(n) {}
    string_view1(const std::string& s) : ptr(s.data()), n(s.length()) {}
    const char* ptr;
    size_t n;
};

struct S1 {
    S1(const std::string& s);
    string_view1 sv;
};
S1::S1(const std::string& s) : sv(s) {}

S1::S1
        test    byte ptr [rsi], 1
        je      .LBB0_1
        mov     rax, qword ptr [rsi + 16]
        mov     qword ptr [rdi], rax
        movzx   eax, byte ptr [rsi]
        test    al, 1
        jne     .LBB0_5
.LBB0_4:
        shr     rax
        mov     qword ptr [rdi + 8], rax
        ret
.LBB0_1:
        lea     rax, [rsi + 1]
        mov     qword ptr [rdi], rax
        movzx   eax, byte ptr [rsi]
        test    al, 1
        je      .LBB0_4
.LBB0_5:
        mov     rax, qword ptr [rsi + 8]
        mov     qword ptr [rdi + 8], rax
        ret

=== string_view2
struct string_view2 {
    string_view2(const char* ptr, size_t n) : ptr(ptr), n(n) {}
    string_view2(const std::string& s) : string_view2(s.data(), s.size()) {}
    const char* ptr;
    size_t n;
};

struct S2 {
    S2(const std::string& s);
    string_view2 sv;
};
S2::S2(const std::string& s) : sv(s) {}

S2::S2
        movzx   eax, byte ptr [rsi]
        test    al, 1
        je      .LBB1_1
        mov     rax, qword ptr [rsi + 8]
        mov     rsi, qword ptr [rsi + 16]
        mov     qword ptr [rdi], rsi
        mov     qword ptr [rdi + 8], rax
        ret
.LBB1_1:
        add     rsi, 1
        shr     rax
        mov     qword ptr [rdi], rsi
        mov     qword ptr [rdi + 8], rax
        ret
PiperOrigin-RevId: 272096771
GitOrigin-RevId: 406622c43f296eeedf00e0e9246acfb4ea6ecd5e
Change-Id: I70173a2db68cd9b597fff1c09e00198c632cfe95
2019-10-01 13:58:29 -04:00
..
algorithm [bazel] Add fixes for --incompatible_load_cc_rules_from_bzl (#351) 2019-08-16 10:38:13 -04:00
base Fix spelling errors (#384) 2019-09-30 14:24:41 -04:00
container Export of internal Abseil changes 2019-09-25 15:12:18 -04:00
copts Export of internal Abseil changes 2019-08-30 15:38:01 -04:00
debugging Export of internal Abseil changes 2019-09-25 15:12:18 -04:00
flags Export of internal Abseil changes 2019-09-19 17:08:45 -04:00
hash Export of internal Abseil changes 2019-08-30 15:38:01 -04:00
memory Export of internal Abseil changes 2019-08-30 15:38:01 -04:00
meta Fix spelling errors (#384) 2019-09-30 14:24:41 -04:00
numeric [bazel] Add fixes for --incompatible_load_cc_rules_from_bzl (#351) 2019-08-16 10:38:13 -04:00
random Fix spelling errors (#384) 2019-09-30 14:24:41 -04:00
strings Export of internal Abseil changes 2019-10-01 13:58:29 -04:00
synchronization Fix spelling errors (#384) 2019-09-30 14:24:41 -04:00
time Export of internal Abseil changes 2019-09-30 16:25:43 -04:00
types Fix spelling errors (#384) 2019-09-30 14:24:41 -04:00
utility Export of internal Abseil changes 2019-08-30 15:38:01 -04:00
BUILD.bazel Export of internal Abseil changes. 2019-04-23 15:57:17 -04:00
CMakeLists.txt Export of internal Abseil changes 2019-08-05 15:42:34 -04:00
compiler_config_setting.bzl Export of internal Abseil changes. 2019-03-19 14:19:10 -04:00