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