<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/86327>86327</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang++: Optimization passes can strip away deadlock loops
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          rilysh
      </td>
    </tr>
</table>

<pre>
    Consider the following code
```cpp
#include <iostream>

int main()
{
  std::cout << "dead lock\n";
  for (;;) {}
}
```
Compiling the following example with LLVM's C++ front-end, with any optimization level (except `-O0`) will cause program to segfault. After looking at the assembly output, it seems like optimization passes has stripped away the loop. Compiling this same code with GCC, it correctly kept the loop in every possible optimization level.

This is the generated assembly code by Clang (truncated for brevity): 
```asm
main: # @main
        pushq   %rax
        movq    _ZSt4cout@GOTPCREL(%rip), %rdi
        leaq    .L.str(%rip), %rsi
        movl    $10, %edx
        callq   _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        pushq   %rbx
        leaq    _ZStL8__ioinit(%rip), %rbx
        movq    %rbx, %rdi
        callq   _ZNSt8ios_base4InitC1Ev@PLT
        movq    _ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %rdi
        leaq    __dso_handle(%rip), %rdx
        movq    %rbx, %rsi
        popq    %rbx
        jmp     __cxa_atexit@PLT                # TAILCALL
```

And this one by GCC (truncated for brevity):
```asm
main:
.LFB1782:
        subq    $8, %rsp
        movl    $10, %edx
        leaq    .LC0(%rip), %rsi
        leaq    _ZSt4cout(%rip), %rdi
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
.L2:
        jmp     .L2

_GLOBAL__sub_I_main:
.LFB2310:
        pushq   %rbx
        leaq    _ZStL8__ioinit(%rip), %rbx
        movq    %rbx, %rdi
        call    _ZNSt8ios_base4InitC1Ev@PLT
        movq    _ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %rdi
        movq    %rbx, %rsi
        popq    %rbx
        leaq    __dso_handle(%rip), %rdx
        jmp     __cxa_atexit@PLT
```
Notice that Clang optimized away the loop, which GCC (`jmp .L2`) kept it. This seems like a bug to me in the pattern matching. However, creating the same example in C, and compiling with LLVM's C front-end (clang), did worked out. It seems only the C++ one doing this stripping.

Godbolt: https://godbolt.org/z/csnjMjo7n
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Vk9v47gP_TTKhahhy86_Qw6J2_QX_DzTwbTYw14MWVZitbLklei2mU-_kO2kaZrd7iywMwgytUSTfORjHplzcqeFWJDxioyvR6zFytiFlWrvqlFhyv0iNdrJUljASsDWKGVepN4BN6Ug4TUJl2QS9h_eNMMJjaXmqi0FkDiVxqEVrCbxzXDdfUuNUDOpCZ0ROh9upqv-DwCHJYmXJF5y06J3Q-IUCKWlYCUow5_IONWEUhIfX9kaC95bvPIfOgfvbnp9cH19lm7_mJq6kcojeo9PvLK6UQJeJFaQZb99IXTqICV0RegKttZovBK6JDTtTZjeg2lQ1vIHQ2k0KPEslM9HvHLRIJBJeHXXxaVzeJFKAWetE9BYs7OsBjTgxG7LWoUBLLcoLChjnnwuDLvkmHOiLtQeTItNiz60RHBC1A6UfBLv4zfe3EHFHDi0smlECeyF7TtXypgmgFPs0oFjtej62iO6TdMhBDfWCo5qD08eycEBSA3iWdg9NMY5WShxoQLBac8ffBjpOg87oYVl6LM64OpiF3tIFdM7Xzq0readje9tYcWzxL1nS7yEs24yV_cnHaf8PY2BJGH3OKQwb1pX_UHCOaFjy16Px7V59qf57_eYeLqRJLy9e_iWfr_JOnaOrWx8VOoZOLalPL6pBPNvBlng0F6ydfI0iupiJ1E4XIvyLQnOlDpkEU3yfJiaXGonLG74PUYRr5jN0TKJbsNvbr7fYxQXzEl-sN485A9hfnM_yb_9_z7OFUnCb9nDRfzF6zkKHzmb5bk0Uku8hKb4ULPh9GNl3uB8vceZNC4vmBPJRktMo5vns8SOHfhgfN0b_1w_8rx0Jq-YLpW4-MYnOE661pjmQsUe66YLw19ZzlC8SuwBwdk_T8KH5SZLl1l28een_17qsh9Bo7sBuE3TT-j_Cfv7hyBbr6LpjL7Zh3PXFj2eZHZE2_xTjh7pnoafkP2EUv1I_X3fPFv-S-4H2bsi9O3zhydNyG-zu9Uyy3PXFvkm_1BJGkfhqZNfPEy_fJb-3WT8_AT-1SxdnJevBiUXgBXDQSYGyTlXt06YK8mrwzCRSfhYN-Cb3mtwp2USA-hU6URGGRTtzutxLbzEeY8NQxRWQ82QV1LvAvifefHa58NwKxgeNohORA_Lg9TQaSjTJfCj2J6tFG_LhE-Te1BDoUpZwouxT6L0kh_A5qD2Rqse6WEf8b8bpXlT8k7wfZ6nBL81ZWEUenGsEBvnyUzXhK53_UVg7I7Q9Q9C19zpxy-PZqpH5SIu5_GcjcQimkZRFMfzcTKqFjMm-JYnszKOxjM2S8opKyfhlLL5eJswHo7kgoY0CWNKo9l4HiUBH8c0oYxSShMaFpQkoaiZVIFSz7WPPZLOtWIxm8R0OlKsEMp1eymlQ1GoX1HtwttfFe3OkSRU0qF784ASlVgM5r4yHuzdhbWIM91XqWeN3yr9UtlRx41aqxZnJZJYtUXATU3o2ocb_rtqrHkUHAldd9k7QtcdgD8DAAD__xTIaIA">