<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">