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

    <tr>
        <th>Summary</th>
        <td>
            Incorrect code generation because of Combine redundant instructions pass
        </td>
    </tr>

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

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

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

<pre>
    ```
$ clang --version
clang version 12.0.1 (Fedora 12.0.1-1.fc34)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```

```c++
#include <atomic>

void f(std::atomic_uint64_t* p) {
        p->fetch_add(0, std::memory_order_seq_cst);
}
```

```bash
$ clang -O1 -mllvm -opt-bisect-limit=40 -c -o 1.o 1.cc
BISECT: running pass (1) Simplify the CFG on function (_Z1fPSt6atomicImE)
BISECT: running pass (2) SROA on function (_Z1fPSt6atomicImE)
BISECT: running pass (3) Early CSE on function (_Z1fPSt6atomicImE)
BISECT: running pass (4) Simplify the CFG on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (5) SROA on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (6) Early CSE on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (7) Infer set function attributes on module (1.cc)
BISECT: running pass (8) Interprocedural Sparse Conditional Constant Propagation on module (1.cc)
BISECT: running pass (9) Called Value Propagation on module (1.cc)
BISECT: running pass (10) Global Variable Optimizer on module (1.cc)
BISECT: running pass (11) Promote Memory to Register on function (_Z1fPSt6atomicImE)
BISECT: running pass (12) Promote Memory to Register on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (13) Dead Argument Elimination on module (1.cc)
BISECT: running pass (14) Combine redundant instructions on function (_Z1fPSt6atomicImE)
BISECT: running pass (15) Simplify the CFG on function (_Z1fPSt6atomicImE)
BISECT: running pass (16) Combine redundant instructions on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (17) Simplify the CFG on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (18) Remove unused exception handling info on SCC (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (19) Deduce function attributes on SCC (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (20) SROA on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (21) Early CSE w/ MemorySSA on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (22) Simplify the CFG on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (23) Combine redundant instructions on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (24) Simplify the CFG on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (25) Reassociate expressions on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (26) Simplify the CFG on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (27) Combine redundant instructions on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (28) SROA on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (29) MemCpy Optimization on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (30) Sparse Conditional Constant Propagation on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (31) Bit-Tracking Dead Code Elimination on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (32) Combine redundant instructions on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (33) Aggressive Dead Code Elimination on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (34) Simplify the CFG on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (35) Combine redundant instructions on function (_ZNSt13__atomic_baseImE9fetch_addEmSt12memory_order)
BISECT: running pass (36) Remove unused exception handling info on SCC (_Z1fPSt6atomicImE)
BISECT: running pass (37) Deduce function attributes on SCC (_Z1fPSt6atomicImE)
BISECT: running pass (38) SROA on function (_Z1fPSt6atomicImE)
BISECT: running pass (39) Early CSE w/ MemorySSA on function (_Z1fPSt6atomicImE)
BISECT: running pass (40) Simplify the CFG on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (41) Combine redundant instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (42) Simplify the CFG on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (43) Reassociate expressions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (44) Simplify the CFG on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (45) Combine redundant instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (46) SROA on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (47) MemCpy Optimization on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (48) Sparse Conditional Constant Propagation on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (49) Bit-Tracking Dead Code Elimination on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (50) Combine redundant instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (51) Aggressive Dead Code Elimination on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (52) Simplify the CFG on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (53) Combine redundant instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (54) Remove unused exception handling info on SCC (<<null function>>)
BISECT: NOT running pass (55) Deduce function attributes on SCC (<<null function>>)
BISECT: NOT running pass (56) Deduce function attributes in RPO on module (1.cc)
BISECT: NOT running pass (57) Global Variable Optimizer on module (1.cc)
BISECT: NOT running pass (58) Dead Global Elimination on module (1.cc)
BISECT: NOT running pass (59) Float to int on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (60) Loop Distribution on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (61) Loop Vectorization on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (62) Loop Load Elimination on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (63) Combine redundant instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (64) Simplify the CFG on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (65) Optimize scalar/vector ops on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (66) Combine redundant instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (67) Warn about non-applied transformations on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (68) Alignment from assumptions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (69) Strip Unused Function Prototypes on module (1.cc)
BISECT: NOT running pass (70) Remove redundant instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (71) Hoist/decompose integer division and remainder on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (72) Simplify the CFG on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (73) Merge contiguous icmps into a memcmp on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (74) Expand memcmp() to load/stores on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (75) Constant Hoisting on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (76) Partially inline calls to library functions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (77) X86 Partial Reduction on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (78) CodeGen Prepare on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (79) X86 DAG->DAG Instruction Selection on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (80) Local Dynamic TLS Access Clean-up on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (81) X86 Domain Reassignment Pass on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (82) Early Tail Duplication on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (83) Optimize machine instruction PHIs on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (84) Remove dead machine instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (85) Early If-Conversion on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (86) X86 cmov Conversion on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (87) Early Machine Loop Invariant Code Motion on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (88) Machine Common Subexpression Elimination on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (89) Machine code sinking on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (90) Peephole Optimizations on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (91) Remove dead machine instructions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (92) Live Range Shrink on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (93) X86 LEA Optimize on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (94) X86 Optimize Call Frame on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (95) X86 Avoid Store Forwarding Blocks on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (96) Two-Address instruction pass on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (97) Machine Instruction Scheduler on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (98) Stack Slot Coloring on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (99) Machine Copy Propagation Pass on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (100) Machine Loop Invariant Code Motion on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (101) Fixup Statepoint Caller Saved on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (102) PostRA Machine Sink on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (103) Shrink Wrapping analysis on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (104) Control Flow Optimizer on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (105) Tail Duplication on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (106) Machine Copy Propagation Pass on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (107) Post RA top-down list latency scheduler on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (108) Branch Probability Basic Block Placement on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (109) X86 Execution Dependency Fix on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (110) BreakFalseDeps on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (111) X86 Byte/Word Instruction Fixup on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (112) X86 Atom pad short functions on function (_Z1fPSt6atomicImE)
BISECT: NOT running pass (113) X86 LEA Fixup on function (_Z1fPSt6atomicImE)
```

```
$ objdump -M intel -d 1.o

1.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <_Z1fPSt6atomicImE>:
   0:   0f ae f0                mfence
   3:   48 8b 07                mov    rax,QWORD PTR [rdi]
   6:   c3                      ret
```

Incorrect code generation:

```
$ clang -O1 -mllvm -opt-bisect-limit=41 -c -o 1.o 1.cc
$ objdump -M intel -d 1.o

1.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <_Z1fPSt6atomicImE>:
   0:   f0 83 4c 24 c0 00       lock or DWORD PTR [rsp-0x40],0x0   # incorrect code generation !!!
   6:   c3                      ret
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVW1tz4jgW_jXkReWUL2DwQx4IhJ5UdU-yIdu9NS8pWRagiSx5JTmB_fV7JHMJnXQ3cUTSQ5ELvpxP5_adI1nkslidddJw_Q7HnXDYibuIcCzmKAgeqNJMiuZEc3B9CEXxaXgaoU48mNBCKrw-EESnM5J0O3HW3HSL1ZyaTjJEy0F6l3aDWtwL-SgCzkS9DOaiXl-3UBQXqJQF5fbqSmq2bE5dCm0w57QYM2VPdeJJrRX8ztl6ZN9rsH-QdOJz-15rlzBBeF1Q1ElG2MiSkU5y8fTGB8kKNAPFtCkAD97NZXc1Eybt3plODOMDDVGnv5EaZlUAYmbUkMUdLgq4O-zEI7QVUdJSqtWdVAVVd5r-945oY42UbCT0x4fokmO9eOamqwgFJecPJQpkZYKcaUoMGLhkYPhxN0QBgTMoOrU_hDT3n19OL0a31p6qFoKBnAprbf0ZWdWmrKw4m62QWVA0mnxC4PJZLYixvoeL7v6KZtdTkzamuSwvth7_seDYCb65GvoQllhhF1jxFRpNL3xI7B6m959TEyV3d-uYAIdQEJ9tPX9Rwvn4qbsPgO792DLHgEt_YbtjYPYt5qWYUYU0NTtAbIxieW2otuOA_K85dVFoI_XXYgeNWENVpSShRa0wR9MKKw3uk6JgFgQOwf_AIsKgayUrPMcOuw1gZgFHjo_QV8xr-maJUWhFfuIyh3F-xYrhHO6_qgwk8P_AXK1kuiSGkZXSUPTFuQoZiW7onGnTCH1rvkTxazGOEVeRI4KxLR5DNa9LCj6-sNwn3uARRwUjWUKFoUhBVInCxg6DGFK1U0h7sWDvWFQbpW00OIp_-h9Hq5Fjhxu46YGiWtQacpYuCa0c7AKLgtvLmZhJO6DpaHTEsWRNnBY1oT9iv6MOIA7ft8jE0X6VeYSObc0S0-l7jSH-uOCLk98lBeMP7GziXpOC8FEShqFQ0GWlqNbvqH76ger3f5sgGLxz-ju-g3wfVatNM7OtyMeHTxq2O7wRfIchOUI8Zya4VZjc21OubRnBnPf7luUdRhP_LpGZOKIczueOFqBSf6RVPpAqk95v45G0Xd_UYhbff0VX1EL8T0ivhbTsdR1NiyWI0NeE4M-r2-fSo-NMa17EOrDzaik9eVVX0RLkQC5oKb1VtrfESt-SBi9K7B9c3VsCDN5Uv1uCZm0rdDu8Xvh-MdCL2lXZlmhHTf9eq6lVS6xum1rYSUbwFjXn20HYpwzJwai9g-vim6HSX0AxgW6urw5aSHtRfv_ty5svyh1sF_7Wwl-77PeiVEcBEy6xsWuZDKLKUyClLtk_S1mhMdONdT1mXBptxX-lxEjlmZDTeCv_swSbH4E00ndM6_SoxT116buJcaQJ5tg-sXxwnkGy8qdHq4Xellguk79hBfSQy9ogIUWAK7AgcKJRWOiZVCX2i-myfMjZXLil_ZmSJYJzdVn5xXF5P4W0rNC_G5afbMRCp2GkWVUHPqJ6SXw_fFJFjuulviOCPySzD5gnBSWyrCQ0UUBldA58W7AH5p7gQ-mCoZSYiaLdA6EX0Y9a-PtJ03aqOUVECsPmtayhQpGysnUKCBsjmOvCR2-IjiculpW1ViO60yylARhUiQJsrCGnqT__rScG6zbXOdKe9yXeEcY1VoZhDhNZJrhlDmAorp1OLFdYrbZY_vRy7PGfQboBh3Qomtj3BjFoTFfQT9SmLYXpA_UmPNuMfzz8ZDd7wB90uUtgNKWcelVnsO4YwDdovBIYbka3n6doSAj08GjEKRZB7S3Um40fTkFpWaGZX2-I99pe5Qsp3i2k3GIG2tVAF8RrM9FsENmW4BKThY3zJ4yLrv-49KfS02lC4bYyPUf0h9bbGfByFgBZbLZl-QJIN7FAQCN0BID-ToMva0u55vJSPNg5AkScm5t-kV6DwhHEBg-6ptLmbZ3vVo-O0dc2e0Y2qMSqpZm490jqmWOKa0qrhdxNrvx2Yln0nhGeNdMNu1BxgwWU--lCgc28iU828f35YrhjCV_SuxvpW8l2xxCaKFz6A-ltQJodi1PbhaCJVI9YFfbCcy7JvT-HOEa4fZTBsChssuxRaeWxOmT9p-myV2HJgtrm21u3mjWrjAaTezTl0nIOh5mzx8TM9gmnWu2tW_osqlEYPsU6PplGoWOECVtCDwI2NLSSdr3EbY5TaIofYBLlDavZbCa1uRludZx6ZIQodJSwpplvCua19jQWmK808-il9d4yYZTkdqHpcX8tzA-I44ZjtVZRmL5jVPc3jkfgeSOroJCPAqYpcIBDzAmyQto3L0ShI4ZzhQVZWN1ynDPOzAqdYw1duKNWdM0xoa459ga7nWNcLClp1gfHtKIwQ7d6Qqp5g2p2nZ4riu8nmGsKMP6cFm2nEucrQ2GK_E2qYo_KG9bwhhdvayHcCscLpBdS7bYZe1Rtr3N4pRo_39y_29gv87-LuqxQ8MUt23AUFHb7_tO77EcYo33NGPR8zdIbonyWdoPlIA3S7h6I-z1mGvSgZQ5dt5whvZ6vnhq6tN_ReHpp-N3Lfl3iuWL2QcP6BhhI6D5k4QxhGFCInr7geDmDKKbbq5Pm6u4ADXIU9p9dDfMOeCm87MSjf327uhmj69sb1OmdQ3vT6Y23ctJGDknQ8xccV9T8xPiXgkilwA5NXz6ngircPEMZ_sJJh337Inrx2xf_fCeDewcJ6hJkLRGiMFyb2zGjVGi85zFdBeGyG1q3xaNwaS_uxAno_QPrw9lo_X6jm0-Ks6TIkgyfGGY4Pfuhw1FOCa41tTb7xXq6JYOTWvGzhTGVtuOKJ_CeM7Oo81MiS_hgI2L9J6iU_BsQ4SPTuqYa_ul1oRM4WZxFeTfLcF6EeZF3u7TbmyWDQdTPehiHaS9OTzjOKddnYMROHAv6iJwI-B9secLO4jC2737UjeIkOk2jJAlJQrN-0k9mEG3d0K7w8lM7jlOp5ifqzA0pr-caTtoyqncnm_UeSh0cyMe1ARo9W7DiAZ844DM38P8DYBU3eA">