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

    <tr>
        <th>Summary</th>
        <td>
            with clang 13, optimization of undefined behavior incorrectly eliminates conditional earlier in the function
        </td>
    </tr>

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

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

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

<pre>
    Beginning with clang 13.0.0, the following behavior is observed beginning at `-O1`:

```c
extern int foo;
void bar(void);
int foo;
void comparison_eliminated() {
    // clang 13+ eliminates this conditional at O1+
    if ( foo ) {
        bar();
    }
    // ...but only in the presence of undefined behavior.
    // Comment out these two lines and the conditional returns.
    char* a = 0;
    *a = '\0';
}
```

[Godbolt](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:2,endLineNumber:13,positionColumn:2,positionLineNumber:13,selectionStartColumn:2,selectionStartLineNumber:13,startColumn:2,startLineNumber:13),source:'extern+int+foo%3B%0Avoid+bar(void)%3B%0Aint+foo%3B%0Avoid+comparison_eliminated()+%7B%0A++++//+clang+13%2B+eliminates+this+conditional+at+O1%2B%0A++++if+(+foo+)+%7B%0A++++++++bar()%3B%0A++++%7D%0A++++//+...but+only+in+the+presence+of+undefined+behavior.%0A++++//+Comment+out+these+two+lines+and+the+conditional+returns.%0A++++char*+a+%3D+0%3B%0A++++*a+%3D+!'%5C0!'%3B%0A%7D'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang1300,filters:(b:'0',binary:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-O1',selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1,tree:'1'),l:'5',n:'0',o:'x86-64+clang+13.0.0+(C%2B%2B,+Editor+%231,+Compiler+%231)',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)

With clang 12, this behavior does not happen.

I realize with the undefined behavior in place all bets are off to a some degree. But is it expected that eliminating the null dereference here would _also_ result in `bar` being called unconditionally? Or is there a bug within the UB optimization?

Thanks!
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9Vk1v4zYQ_TXyhYghUVZsH3yInKYoUDQFttseA0oa2dylSYOk7GR_fWdIW5FiO-2haKBI5pDzqXmjV5nmbVXCRmot9YYdpd-yWgn8meXTdJomfM38FlhrlDJHOlLBVhyksUw6ZioH9gANCs8WhGfJfXr3nOE9yR-S9DFJz3eUhKuOa3j1YDWT2qN5k-RlFB-MRIPCJnxBPxO-7LeuHq3Nbi-sdEa_gJI7qYUH1FqgIkvmp5MM_xL-hFefXsJL1is4zBITqo1upJdGC0WZYBZ8YEC2aGNBEbAL4_QXgx4GHNzOHy9imE6nVeeZ0eoN8w8V3ltwoGtgpmWdbqCVOhQ2Vnt6YWJtdjvAehi0g_oOmD8aplDLMaGbYHOYjgXfWe0GhuotxfvABEvyR5aOg-YPUZzweVKsU3qc9_uE-hc6estF-bNpKqN8UjxiObbe7x11Qgh7E7emxm6CIN-ErSzUbXF7scVFbRr4CfMxGPVaht1FKxVosYOwmmcUJl-3RvsvtVAkzWYnwVcHv7_GY2k89o228Un9QOYTXuDbjre1AwU1lS76Ad2sjep2tOS4jetfsdS_dbsKLNnBdlrvjQvVHp08Cy-P9y6-eGH9SGm8dUX1UuPqwSXtmM7WpwJFyGFTI5LwTljiRU5JRzChbIy8fve2wif4S0I95_F4WPTXU7jKAEZ8UrCh8OU7JHFBoAwu-j7GlaBICJrxdY0tyzY8F-dgy8_DeL_ewdsnOD5RYNvfzCMCGn8QpEN9Q_SA9zOwaZOC68FNTnt437R8wjlpBwcB6_Q8UnYB71QT3fQOx9Xqcf_Rwwn-pBzzyzG_Mr2V_sPwVMAlYqgIo-H0u1cLlZrH7lOx8YoIOT0CoImr9RB45aldoyA_IdoP9ZbR8neUFem7i9knLuKCxlB6xdr6-rTZ7XG4DGZNL8FNatssT8kajiAEVRxxi2rkvcJGtm-j2VTH1_lMbTI82sAOTSoYC6WlMXAANxLDK9SdH888xCeo0SklK4ve1zg1R3Jv5W6oSgVoldi4PyUcn_eg__NZipG4QXnJodlTg57SIrYQX9DtoZtdG7rXZu5QeHH6xsi93LrUvFS4dm40cLNQbYCP1f4XmHhd3N_dz0YDMtIxmm0jwOCiPH8Ve8ys4-A4NXAvXv4faBpkyP_RyDXlA6Ip9sCMBANu8deAnvJITZG09Yy0Mch9tPFsK_bYx9Oh6i9IgISSPyByXGJHlyyLuNheCSRhQimUeqRSlhhZy7xBnuTMDlgDG3ynU1Yi8ULv0jN43WPrAHEuJI3nDxixYXKjO7TVgIUW_4ngbfHJjqZTDXsRypkXDM11ypN3JFP0IbpP0TsZQOQpNNzpwVCnyfHEngMD98GYYFUXyfuJTH4tGSFsJ3-ICKenYS3-2Ar9Hb8a2aRZ5c0yX4qJl17BakT_qb5DI9eJKQZdG0tjCqnsgE4PqScIqyTYM9NtMRvamXRWrT7QQwygq6Y4JHGh1OH8uNtb8w194FI619En76koFimfbFfzJeTZsuV1W8_bHGb1vJ5ViyyF7H5W88VyokQFyq2QmCacaziyYAJ_I0GdyBVPOU-LPMuW-Yxn02IBs3ldzQs-403bVsksxdEs1ZTiIN46sasQEpbc4aaSzrv3TeGc3GiA4A7ti85vjV196xw2RC2at0nwvgrR_w3_6-Hc">