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

    <tr>
        <th>Summary</th>
        <td>
            new+delete pair deleted by clang at -Oz without accounting for side-effects
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:codegen,
            invalid-code-generation
      </td>
    </tr>

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

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

<pre>
    
code:
```cpp
// Type your code here, or load an example.
//#include<iostream>
#include<cassert>
#include<cstdlib>

int volatile gv = 0;

void* operator new(long unsigned sz ) {
    ++gv;
    return malloc( sz );
}

void operator delete(void *p) noexcept {
    --gv;
    free(p);
}

class c {
    int l;
    public:
        c() : l(0) {}
        int get(){ return l; }
};

int caller( void ){
    c *f = new c();
    assert( f->get() == 0 );
    delete f;
    return gv;
}
```

$ clang -std=c++20 -Oz

```asm
operator new(unsigned long):                                  # @operator new(unsigned long)
        inc     dword ptr [rip + gv]
        jmp     malloc@PLT                      # TAILCALL
operator delete(void*):                                 # @operator delete(void*)
        dec     dword ptr [rip + gv]
        jmp     free@PLT                        # TAILCALL
caller():                             # @caller()
        mov     eax, dword ptr [rip + gv]
        ret
gv:
        .long   0                               # 0x0
```

However, at -Os the behavior is different

$ clang -std=c++20 -Os

```asm
operator new(unsigned long):                                  # @operator new(unsigned long)
        inc     dword ptr [rip + gv]
        jmp     malloc@PLT                      # TAILCALL
operator delete(void*):                                 # @operator delete(void*)
        dec     dword ptr [rip + gv]
        jmp     free@PLT                        # TAILCALL
caller():                             # @caller()
        inc     dword ptr [rip + gv]
        dec     dword ptr [rip + gv]
        mov     eax, dword ptr [rip + gv]
        ret
gv:
        .long   0                               # 0x0
```

https://godbolt.org/z/hschxza9s
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztVk2PozgQ_TXkUkpEm3yQA4d094xmpZZ2D_0HjF0kHjkY2Sad5Ndv2YEkoO6enj3tYRDBYLuqXr16RSiNPBVJ-pykG2EkJtnm8pAs08spmqabYd_phNdTg3AyrYWwH3ZoMWFPYCxowyXwGvDI943G2b1ZwjJVC92GCE_KOG-R75PsW7_nblVw59D6Dxadl1qVt8V4VbWHg9HcK42wPUCSPUOaZI_3ew5GyYRtwDRouSe4Nb4lLNem3kJbO7WtUYI7Q8LWkKw6U6AjYY90bg9Xf2HSom9tDXuutRHkprO8xVw9j4PfIkvU6Im1PE4TqCYErQ0eBTZ-GH06HUWuLAbT5pNoQhOFIIaOAkd64KlpS63EteLQHSGdSEK2IQOWpz0jfZB-Y_C4RX_ZTht6UkIUuEGim2Elgp0g4tAG4joO1gOwIrBSxTpSmXpIA_SdSshDNSU5XIEEo1h_GFtcaIfqvULekXxD3rfAPfiEzYH4JdFMSYoUSFz0wVKY_n0e7OzNudtfZkbSu6ouaDCCvVL78UHdAMk8_ZWrUaFEHOWbsRIabyFZPFrVBGmHzBejwv7cN3Hs1D1P_3l5_RjN6-avl6fNy8sox4HIqZpfTHCc33tuBmAl_rfkYh99ktp7yV1V-4VkukQGJgMge3OII_JjeIF-FT8J9jIRJDtq3Vl8mwFp_9ckp8f0E5n_MG94CLifgHtStgO_Qyhxxw-KqqIcSFVV9O6v_Ze7w_3pjj_dMUzk4-743ar8bqL_6-7bed-44D9-O22NLI32M2NJvN_P9Ns5sTue-dpNsHhYLrNVms8Xy4ksMrnO1nzilddYRPE_dv96DVe9XCSUp65LY2-f4U35nWk9cCFMW3tFKxWpyymJU6Q2F95NWquLES6yasuZMHt60PrQD9PGmp9kQ4_KuRYd3SxW-SKf7IpVtcwlQ8yzMmW4FNkiW6-W87KaZwsp58uJ5iVqV1AVEsai0yx-mG6xpolQKhpUfeBayWlYmNJK6AZl4obF80QVLGUsXdP14WH-sJwtWDnP8zRnIs0FipKEh3uu9Cz4D7RObBGBl-3W0aJWzrvbIn1phNcHRlDkn7fEli12ynKp_IlPYpZFTPFf_dn5_g">