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

    <tr>
        <th>Summary</th>
        <td>
            Clang -O2 generates wrong asm instructions.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    ### Env
```
clang-19 --version
Ubuntu clang version 19.1.5 (++20241203083330+ab4b5a2db582-1~exp1~20241203083345.68)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-19/bin

lsb_release -a                                                                                                                                                   ILPO-PRD-UBN156 llvm_passes *​ via C v11.4.0-gcc 
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy

uname -a                                                                                                                                                         ILPO-PRD-UBN156 llvm_passes *​ via C v11.4.0-gcc 
Linux ILPO-PRD-UBN156 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov  6 17:42:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
```

### Details
O2 optimisations are yielding inccorect asm instructions.

Reporduction is simple, compile:
```bash
clang-19 -O2 -g -c -o buf.o buf.c
clang-19 -O2 -g -c -o main.o main.c
clang-19 -O2 -g -o main main.o buf.o
```

```c
// main.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "buf.h"

int 
handler(void)
{
        char *buf;
        int len=0;
        srand(time(NULL));
        if (rand() & 0x1) {
                build_buf (&buf, &len);
        }
        else {
                printf("...");
        }
        send_buf (buf, len);
        return 0; 
}

int main()
{
        (void) handler();
        return 0;
}
```
```c
// buf.c
#include "buf.h"
void send_buf (char* buf,int len) {}
void build_buf (char** buf, int* len) { }
```
```c
// buf.h
void send_buf (char*, int);
void build_buf (char** buf, int* len);
```

The generated handler() asm skips the call to send_buf, whenever the if condition evalutes to false (ie. printf("...") is called).

See gdb for the exact asm:
```gdb
gdb main                                                                                                                                                         ILPO-PRD-UBN156 llvm_passes *​ via C v11.4.0-gcc 
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.2) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...
(gdb) disassemble handler 
Dump of assembler code for function handler:
   0x0000000000001170 <+0>:     sub    $0x18,%rsp
   0x0000000000001174 <+4>:     movl   $0x0,0xc(%rsp)
   0x000000000000117c <+12>:    xor    %edi,%edi
   0x000000000000117e <+14>:    call   0x1050 <time@plt>
   0x0000000000001183 <+19>:    mov    %eax,%edi
   0x0000000000001185 <+21>:    call   0x1040 <srand@plt>
   0x000000000000118a <+26>:    call   0x1060 <rand@plt>
   0x000000000000118f <+31>:    test   $0x1,%al
   0x0000000000001191 <+33>:    je     0x11b7 <handler+71>
   0x0000000000001193 <+35>:    lea    0x10(%rsp),%rdi
   0x0000000000001198 <+40>:    lea    0xc(%rsp),%rsi
   0x000000000000119d <+45>:    call   0x11f0 <build_buf>
   0x00000000000011a2 <+50>:    mov    0x10(%rsp),%rdi
   0x00000000000011a7 <+55>:    mov    0xc(%rsp),%esi
   0x00000000000011ab <+59>:    call   0x11e0 <send_buf>
   0x00000000000011b0 <+64>:    xor    %eax,%eax
   0x00000000000011b2 <+66>:    add    $0x18,%rsp
   0x00000000000011b6 <+70>:    ret    
   0x00000000000011b7 <+71>:    lea    0xe46(%rip),%rdi        # 0x2004
   0x00000000000011be <+78>:    xor    %eax,%eax
   0x00000000000011c0 <+80>:    call   0x1030 <printf@plt>
End of assembler dump.
(gdb) 
```
Notice handler<+33> jumps to handler+<71>.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMWE9v27gT_TTMhbBAUbItH3yQ7bgokKZBmmCxp4KSxjb7o0SBpGzn0s_-w1CS_6Ry2929VDASS0M-Pr4ZzowlrJXbCmBOxgsyXt2Jxu20mStdgmV3mS7e5oRH7YfeV3vCUjJh3YeluRLVdhTO6Gi0B2OlrghLX7Omcg31Nto9puEsCIMxJTwhfEH4gjMeh5xFLImiiBG-EFmcjQUvsnHCR-F3ONbh98tB8TiYJITPCEtfhNmCI1FKj8nk6yQe1flIyao5jrZVg_adAVHQUhegcFStrTwSln6srBNKQbGSBp8Tvm6sIXytZIZ_1b4chTPC15nEfRCWKpt9NaBAWKAjQf-86-PD0-fR0_Nq9Lp4DMcTinv4WgtrwVLCU3LPScJIsqB7KeiS7sMwiAM22uY5JSx91PThywKFahRYKgxQsRdSiUxBQFi6ktYZmTVOG_pxhZK1vkUT2NzI2qHLoxSpdG7nPGBxENOHly-Epc-teN0QvLydsHSpC6hEeWH6JsryrdW9QcufqXh7_TfdHzBYf8CYBEnARvFstIUKjMwp4VE8-94KGo46fb98eqJPz_f3n55evq7-fkw_fVzSv6Cgj3pP6YSGUxKlMSdRGo7p68uS8u6QvPv34fGV8LUn8u5M4-d05FfghFSWsPQzp7p2spRWoNPbaHmToApZbams8lwbyB0VtqSyss40uR8XtJDPUGtTtM-otNTKslZA-JLmuqylwji4JJIJu7tKMJ85HW3pKKcjTbNmE7R_85tjSiGroPs3OKq19eM85IAS_W3uZVkTvj5DEh7JKldNAZRES-sKqYMdie6HTEpmwzYnSxiycI6UdoTzlomsHIbOTlSFAkN4steyaPMhmS4IOx2wfCcMxmDWbEh0aUAEBRWJVuzaYI2oCsITpEJ48vj68IDAfPZu_gbTdzeW8BklfELZMfRfryj0V9ZIVXzNmk2b9ydIiS9xHvJ4j0-mq4s7UBZuwNZGVm7jIXkQBCjRz7EsVCcaHYchAgZcYyqK6lAv6-osPTq93fYPgp99Qc_e-Rn4Gfsy2AYirY_wm3GB617tDp1PeErbXfYe7xzk1_RTrhzTzTlPw0jBu_NU-vt8dz-hdcLutPnHXDrxrs_oyw6oT5nCQXHtAp-N7P9kbanbAc2FUtTpEzXEP-yggj0YP0BuaK6rQvosBXuhGgcWZ2yED0eeSAiG4w-TWu67C8JnXdL7AkC3RUY3uoWHo2gz5Ltkty0ywlIc6VPSn3r9t6L34fHVi0F40pWykAfhiDX-JuzqnJcSDb5FqN-M3O4czlmigTPO6doA0C964w5Ygta6qQpfktCbH6s88AU2h8oC_fD0sI-w4YxSrHh4f-pII6oNVcKBwTS8c65Gr_hA3lZNoM3Wd4YeyOLDWgU7V6o2Vb_spEWXb5CM7cjgMm-68aXRG5zGdFxtgYqqoAaKvqECKl3Qxq4BxHn8TP9Kn5_Tx5e_cR9OdwHjoHK0BlNKh9GdvVElDn7mW-2zgd3pA811_SarLeHcL9Q_PghjROXe8DnGYNFW86Dn_2G1oAdhMeY3ctsYKKhAV_Kurz431ZwPrNlO6rRvV7h6eLneWhuaNVtqsA9wbctwbhJwy3XbZlvoW4HWKfbklcPhEJw9c9Kcr_H48HXWbNFNJLr368mq8BLiHktRNUJ5abTbgaGFzpsSKtfSNGB1Y3KwVFdKVkCFaylg0L-PjV-wuEI-0-kU2IGqvXs7Idv7K21FbXStLT1oU6CqPl0Jk-86fctSVIWlBpRPd07jpG4wJiNstYTvyexbmWmFIarLtmnxZsITT3VGC2nx8JaZgj5t4kFdNWVN9Yb2Nly1AL_8pqnaDq7Psr1M7MgurjCcMhSO8AXD49K1-LbJvKI8ZscwIXxJ-NjY-gZC3CHEFwil3qsegRG-ZMfcp2EP40vzEFLeIYX8DHXUpuUyhkK2VPDLMAD0ABdcfC3BsSEbs76RIzGrlWszxABQEvVAszNQiY17y0Qcf8EkGXcAPBxkEnsmbT_3CyqiR5oMIk080u8AbTqg6IKSA-tOnm73JNTw_FnYz4_O87-Bdzc7hmE29Uewr-qLaXiTyqyXNxqfoRSIDopdhUobfbeEniV99LEBqHwAyd5CKnqk8ZDQ4cYLfWqCbm5O8A5nzH6InX-4OTHtocYDUAObg1ubE1mPNBvcHLTx2Ldbt_aW9dliEg-e0NO5EMcbAL04k4toFkXx--kmm3QI0wt5DTiPMDyjV3EaDoQIxJNOR3nlkb6Xwh_X7MiZfxcyhN7nnGny7yTJe00TNnjAI2_vWtmLI36PRfIy-RdNWV_XjXct-KN2ModzSTgdZvqtKWvfPp-PL4mWXq_grphHxSyaiTuYh9MojhJMb3e7eSxikRRhOJtGBWNJOA1jNg0nPBZitpkyfifn7XvBcMJZFLFxMI0hiyabsYgywaeznMQMSiFVgA0qFuo7aW0D85CzMA7vlMhAWf_Gk3P_WgA7-PHqzsz9K0DfSMRMSevsGcJJp2C-9C81R5_56ReHpQejq-2P7z3uGqPm1x3MVrpdkwW5LrvXjf1bx9rob5A7wteeKfYxHdn9nP8_AAD__15GyUo">