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

    <tr>
        <th>Summary</th>
        <td>
            Failed loop simplification by -O3 (trunk v.s. 11.0.1)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          shao-hua-li
      </td>
    </tr>
</table>

<pre>
    For the following code, clang trunk -O3 failed to optimize the loop and generated a lot of redundant instructions. You can see that clang-11.0.1 generated a much simpler assembly code.

```c
int a=0;
volatile int b[1] = {1};
int main() {
  for (; a >= 0; a--)
    b[0];
  return 0;
}
```
```shell
$ clang-trunk -O3 a.c -S -o a-trunk.s
$ clang-11 -O3 a.c -S -o a-11.s
$ wc a-trunk.s a-11.s
  73  187 1508 a-trunk.s
  48  117 1047 a-11.s
 121  304 2555 total
```

#### a-11.s
```asm
main: 
        movl    a(%rip), %eax
        testl   %eax, %eax
        js      .LBB0_4
        addl    $1, %eax
.LBB0_2:
        movl    b(%rip), %ecx
        addl    $-1, %eax
        testl   %eax, %eax
        jg      .LBB0_2
        movl    $-1, a(%rip)
.LBB0_4:
        xorl    %eax, %eax
        retq
```
#### a-trunk.s
```asm
main: 
        movl    a(%rip), %eax
        testl   %eax, %eax
        js      .LBB0_9
        leal    1(%rax), %edx
        movl    %eax, %ecx
        andl    $7, %edx
        je      .LBB0_5
        xorl    %esi, %esi
.LBB0_3: 
        movl    b(%rip), %ecx
        incl    %esi
        cmpl    %esi, %edx
        jne     .LBB0_3
        movl    %eax, %ecx
        subl    %esi, %ecx
.LBB0_5:
        cmpl    $7, %eax
        jb      .LBB0_8
        incl    %ecx
.LBB0_7:
        movl    b(%rip), %eax
        movl    b(%rip), %eax
        movl    b(%rip), %eax
        movl    b(%rip), %eax
        movl    b(%rip), %eax
        movl    b(%rip), %eax
        movl    b(%rip), %eax
        movl    b(%rip), %eax
        addl    $-8, %ecx
        jne     .LBB0_7
.LBB0_8:
        movl    $-1, a(%rip)
.LBB0_9:
        xorl    %eax, %eax
        retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztVjuTmzAQ_jW42YFBEhy4oDjHuSozKVKlygghG11k5CDhu8uvzyJ8Ntgmj5sUKeJhrMeu9vv2gdjSVC_Fg2nB1RI2RmvzpJotCFPJgL4DoTmuXNs1XyH8yGDDlZYVOANm79ROfZf-oDZmD7ypYCsb2XKHKhw3HZgNtLLqmoo3DlRj0ZJwyjQ2gs-mA8EbsLK3wd2AFRISxRGZGNp1ogardnstW-DWyl2pXzzFKIjXQXx__L-Lh0cMa4WQPGDrOGCrYedgNHfoAPSiMkhXJEjXgCoQZDjP1ifNXmHHVRPQPKDLXjzsA8aohX6XrZBZwN73p2O_CkNUfVUDbz9G-yebgKFwXdvAmVAPOeV-sbS11Pq4R5NjiM7p4JGA8BOEBtH9bmQvlQm50sQQj9SexPnwRAiQMQCSZ0DSOL9EAEhylBKUxkk2PUgoAWBxAjRNUywWx_VtN48k2OmZsnvV5nY37PiUsHs4R7n_7cxB9yP32Upbte8TgdWLC8mfp8pOWtdrH2UzWo92GKMPq1X8JZkKeVV5PIweuTQwHKBI8jbH8hZH8TwLEF4h_KEj27Ej9DapE840giOHkiuHnk17PPszeKz4b7dTP036tHj_lbwvp0ItuccjR7zezAmvep6L7RjvKtPNKdPZnKVHOeaUzqfBqlcTOBslj82H7rfKUTVijDGRCbyVr_GvXGjkyAX2lkjZrrwBJCavXXpVpWd65_he5bwcxzef930Klv3ZO36J-l_5zcrj6zGfq5dpyWXjzOWzmfv1Rbj8exfhoipYtWRLvnDKaVk8DL2V76V8t6M2SvC-W4LyxX_EkdTw7T9E2EANnRLyW3StLmrn9rYnRx_w2SpXd2UkzA4XWh9eh3DfmkcpHC6VtZ20OMFvNE0WdUGThPEsXwqREp7QjFYlqzLKMkKWm7uKLDQvpbYF9jUBpY18Am8C59jlLFRBY0rjlGRxznKSRcmdyGWS5wnPM5Zs8iCJJd7jOup5RKbdLtrCUyq7rUWhVtbZsxD7PLVtpPRwaJ93rjZtYWtuwrrjoVYLD194-j8AZD256A">