<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/54528>54528</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang-12 strangely optimize a loop into recursive call to main function
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
wierton
</td>
</tr>
</table>
<pre>
the code:
```
int loop_1 = 100;
int loop_2 = 7;
int flag = 0;
int test(void) {
int i = 0;
int counter = 0;
while (counter < 1) { // note: replace counter < 1 by true won't trigger segfault
if (flag & 1) {
}
flag++;
}
return 1;
}
int main() {
if (test() != 1) abort();
return 0;
}
```
the above code has an infinite loop in function test, however when compile it with `clang-12 -O1`, the produced executable will immediately segfault.
I disassembled the a.out and find that:
```
0000000000401110 <main>:
401110: 50 push %rax
401111: e8 fa ff ff ff callq 401110 <main>
401116: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40111d: 00 00 00
```
clang-12 optimize the above code into a strange recursive call of main function and finally cause stack overflow.
I know that unterminated loop is undefined behavior, theoretically compiler can do anything, but such optimization is still counterintuitive.
Not only this, while the loop condition `counter < 1` is changed into `1`, this two versions should be identical, but clang-12 reasonably optimize it into infinite loop.
A much more strange case is that, when enable -O2 for clang-12, clang-12 will directly optimize out the whole main function, this cause gdb failed to break on main function:
```
$ clang-12 -O2 a.c -o a.out -ggdb3
$ objdump -d a.out | grep 'main>'
$ gdb -q ./a.out
$ gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) b main
Breakpoint 1 at 0x401110
(gdb) r
Starting program: /home/wierton/disk/wiz-c-workspace-11/a.out
Breakpoint 1, 0x0000000000401110 in __libc_csu_init ()
(gdb)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyFVduOozgQ_RryUkoEzv0hD33ZkfZlR9r9gJYBA54Gm7FN05mv32NDIGR7tC3UgbpfTlWlOr9eXCUo07mItk9R_BrFT9EhHp_wKZWjWuv2LaFo-0pJHEfb5wcWC6zjglHUvAzkWX5mOmFdxE4fWuYRO1N0HCWIPFc-6A3UTHfKCfOlTaK-krUg2JzFXigZjRMY3_CQ0s4nSka0Nc8ELYQpvZIznaBeq4gdEaWRZQmuFWXBu9rdfCGewrsaUmSHyc8sEB1f5w8vF7Fn_8wp3UkY4TqjYGVK6sabK9ZwiaBOj9UKcYzVDDyWhC75d55qM9Lv_I7O4i-cLRs__PfwgKGPASRUcUtcoR-FVNKJ0H58UdGpzEmtxs6-UKV78YHa9ZVQUG1a3x7pqJeuIvjIaq7KdcJo_T3xLqHiXbVG510mchKfIuscT6HVy7om2TQil9yJ-jr1Y3Mf6J-US8utFQ108mCMb3TnEG5OiNaTuPsdyuPpbxcnSRJ7RISSb_-YVIgGXiCc9zH99w_0trOVf2N7wz8XismgKE5UcCqK8ZkUM17XP28-7v3f2zgMNg4HYoLigpKCTjuKY_-ArnTbD84zC8n4Mw79D6Gwl-nFw2NhNh_MDnaCqS9qNLVMt0428pegB3AAp5o4WWcgKIC0rDNWei5SI10EEM9QGRsD3hUSnRXQ5Nk7wZ4pat0_tPdd6T70kMLMNtB0aPSAQAtiLmANlFRU_ENqM2JKA_EyG7wMODRwpyhHrOrqKqlKL5kCKrbLqlt2PMQIw9Z5_I2bAil20iGnRXB_aUdawQGsWW9s2Ea-PCG8TKtcBnse-YsFdYi9j6zyFcuHCoI2jwSYrteEkljoI5pKd7XPkWQuVEjsFv3UH1SeW60wPNe5V5i9YH0xuossnqjx-Tco2NTDjKMtPgY_OyExjLNQYS7X3xkV2kx-PX-KIQxtLoEBdx-FH0hflr7SsLDAw5TvgIUyTzEnMsyyphQpARnqQeU30xyxHd0tGIZNkNFajwthXcL2dpbU6Y-8a1pa56NAdHyhEicCc3S8DSE7zgo-tPVP2uCiBIX_4_wteA6Ukb02qa4tFUY3s8xmc-sCO0Hfb-50WPeB-uwzb7W_AQkB_PHnuIUedMxA-Mdx47wzbNLS8MZfO3iqdCPw00thnC_1NyzL90D4tc7WvTbvtsVBXGNJjWHRPTTug_B9wmJ5XJhoy9tbLdPsLbPdm4cYjbdnGehDw1b5ZZuft2e-ctLV4jK1bUTgPXj47dwAEA_LBZQFMladqS-Vc61fg8PxL3F5unSDHYCPuv64_axRqR-AKT6ltZ3AAH_b7_bstKouXIjDIU0Pgonj6ZDGbMfTc5pke8Y5K5J0VfNU1PYS7XHdmRI9BRN4j_avK3lhMWPxlu2SXXJm-02xE0eR7g8J40m8P56jXSwQdr3xcWy0KVfmEkJKu9KCWUvr7MzEdZOlEiK4g33euUqby9jUVXB9CaH_C8hU76k">