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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization for ``std::atomic_thread_fence(std::memory_order_seq_cst)``
        </td>
    </tr>

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

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

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

<pre>
    While implementing a [lock-free-queue](https://github.com/ConorWilliams/libfork/blob/main/include/libfork/core/ext/deque.hpp) I noticed that the pop function was about twice as slow on clang vs gcc. After digging through the assembly [on compiler explorer](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYgATKVpMGoZAFI9AIQuXSS%2BsgJ4BlRugDCqWgFcWDfaRuADJ4DJgAcr4ARpjEIADMABykAA6oCoTODJ4%2BfgFpGU4CIWGRLDFxSXaYDkUMQgRMxAQ5vv4G9piOWQ1NBCUR0bEJyQqNza15HeP9oYPlw0kAlHao3sTI7BwW8aHIPlgA1Gbx7kxELHjm8dhmGgCCd/djxN6Oh1gsqMcA7NYPh0BhyY3iIhzSKUOECWv3%2B9yBCMOoQIhzQDDGhyiqAIF2O8QAIocWAB9LE41AsAB0tFQTHQEDG6BAIDYX2IAE9iSQsMRicQakxVJh0DCALSHLgnSyHAD0MqeiKBILBACoot4qHjCST1VRqbT6YzmaySJzubE%2BQKhSKpYq5QrFUTSdiLpSxiRMBAyRdSIcjSzMGyzcQeZajNalrbHdGY7KZYcGpgxLEFKjjIcGN8aSZYn6CEnaJSng7Ff7zhSrsSCAh%2BXTiVRGJsGQQmQGg1yQxalABHYnIMaR%2BJw6PIw5ESEnbVV1ApfV05utk0cjuh/nh4WDuElxF4TUQcd49yTzEuikwsx/bfRuWHcICUWBlIEdkfTDd7yYK%2BO3dQg%2BT4/emesJfna8YACoIJghxGBihCBqiay0OghzAJgKLuvQDC%2BlEL5MHmBa5tW5zQQawonuSLCYpg/D8ocazEIcADuxBwcCWIAG6YEWAKxkie5gGAJLjpSaAsCkTSYMSmCqMgCDGKhxIvAIwD7jOvp/lYEq%2Bv6S7BqGPZ9mM2ktsagamiuFproKG7npePG8UCN4AGJMHQZHEEwmzqQgeDUSh2JjpB0FMLB%2BZUiBMY6qeVLuvyXrRccmlcMZi5mcu5q8lZEZShF0b8gQ6wMIcGg5fZMYXviuVAlFFFukQcWAZRNhaXmqXthlYbWTaQ5VYCFW9XGhxnEVWBGC%2BNJ0oc3iCHQwJUPmDGee%2BeAsSYfo0iiIV0QwtAvtWeCptWtbIaIRUpN4CgINCpADTeEEHSRk0PZmKL8st/LIWCMTAhcVzAqmjFQRJgVQdJ%2BwXXgnFMSxC3cfCvH5YVmIamYACsliNWj%2BJzoaJltuZHVZRupXw4q/VlQiNWurFnqNYl0rJa1pntZ2mVWsTPUU0CiPEEVJWc6TvyVQ8Dplr91zuMiJzYE644k4CYsVhLUs3E6mMCwrePlpcEuKzrJyS4I0uHCqxs6ijAv9ZbDzKt8qEMMSIUsBAnyoBYABshyqJGdmC6olIQtCJMVRwKy0JwqO8P4HBaKQqCcEeVjNQo9GbIl8R6LwBCaKHKwANYJJIlLuz8iQAJzuxoeio3oGdcD8ZfSOHHCSLwLASBoGikNHsfxxwvAKCAXfZzHoekHAsBIKJKRuWQFAQNPs8gMACjMCkl3YnwdALYPXo56QUShE07KcDwB9HxyADyUTaF0I9n6JbCCJfO0n6PpBYOqwBnLQtCD9wvBPjyXEO/fA/JuicX/rHaSXRQRbDPsiGo%2B9aB4CiB5DkngsD7wICxduADSCcWIFiJQ%2BJAzANCKAUeKwqBGBXgANV8oxS%2BKRGCn14PwQQIhkwSGkBw%2BQSg1D710MlIwJgUA2BsIYVBg9IArBnHUf%2BopGSTnMEnKwegNCHFFJfKgIUUSinxOEfE2BLByAAOJaKoJmB8MlMBPiyAoXgqBCEsSwDI66nRuguAgG4SY/hkrBDmGUCoEhUjpEyAIPxoSCgRIYAMYJwxkqeLqL0CYXg2ihOST0GY8ShhxCSTMKJBS%2Bi5IWPklYKd1ibH0GHCOUd959y9okd2op3aSBQsgZAv5XgMDzjCCAuBCAkHTnoJYWcc5LBWJBOkwxroF3iBoSkGg2k/C4FwMuVcfiSA0KjERnBW7dwaZwAeQ9SAjy0CsCeiAUAUhnvQOelBF73JQKI4AVYel5y3rQHelAoj70PswDkbDz6AvZNfW%2BjhgWP0YAQF%2Bu196f28N/MQf9gVAJMCA2OYC76Q0wFA3gMDkBwOBYg5uscUFoOPpgrYsccF4DwWfQhxDMCkJYOQsRVC%2BC0IUAwzATCWHRzPnwrh4gpAyEEIoFQ6h366AMK88RajbAUvcXI%2BxAhFHKIJKo6w6jNHaPiFowxxjTEWNFFY1ANjNhqvRE4lxeA3HwAqTUHF3jfHpLyAEhg6BSkhOSjEuoRSwmFCyD6xJ1RajZL6IGrJAhUmzFKHkzJhT3X%2BLsDkoJiauAVNTuwUZhg6mHPfo01QzTWntP2PJbp00%2BlQkGfVEZYyzkTPzgkVGlJq7uwzqXSQkgy7xB%2BKs1G%2BaW71KLccuwpzzm52HZnQtvdx1TsmQQlMWQQCSCAA%3D%3D%3D) and then reducing to a [minimal example](https://godbolt.org/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAZgQDbYB2AhgLbYgDkAjF%2BTXRMiAZVQtGIHgBYBQogFUAztgAKAD24AGfgCsp5eiyahUAUgBMAIUtXyKxqiIEh1ZpgDC6egFc2TEABWADZydwAZAiZsADk/ACNsUhBZAAd0JWIXJi9ffxTydMznIUjouLZE5NkHbCdskSIWUiJcvwCQ%2B2xHEqZG5qIy2ISkgqUmlrb8monBqOHK0ekASnt0H1JUTi5LAGYo1F8cAGozXY8WEjYCc13cMy0AQQfHgDd0AkxjmmYtiGXTgB2GxPY5g8aYEAgS7oa6oAD6RCQpGwLEw8J%2BTD%2BEKhHDYZAAnvCyDhSPCVABHeGocbLM4g56AgAiL1ZTxeXFW9G4gX4AS4OnI6G4HlstmOSnWm2wpwsuz45CI2k5qwA1iBdgBOAB0gMCAA4eJrgvr9btAbtpJrNYZuNJ%2BGwglpyPzBcKuPwlCBnUqBZzyHBYCgMGxUgwkpRqCGw4xkq9UKlUvDXkb4UYiNhxvD1PrQnR6BnSF6IPFleR4lFmgTuAqK6xSASAPLxXR1X0KkMcYSNpj0at%2B8g4eI%2BYAXej0L28fg4NjGYCSAeEFH1V6ZsvYdR1HwZmv8KIZ7kD%2BgEeKkKteHBloikAiOqfkVekeIZbBM7CzkzHkzK1Y0IzAJQADUCGwAB3RtUmYXc5GEMQJE4GQYMUFQNDLfQLEMOc0DFaxDBPL1IFWdBUl6L0AHpG3UIVHxvHACP%2BLoemyNwmE8bx2iCDCInmCoqikXZCgyLIhCmDoMKKYSmCGXjRh4ATanqIR%2Bkmdj8htBTemUuZyhGZI5PsWZRJAdTZmk3T%2BNWSUNi2KQuR5Pky3dY4c2CY42CUeNjhTHV00zIhjggfBiDIWV5WWfhfR0ZZViQVFSWoOyuHtchHUCZ1XX4d1PW9RUfzVIJdm1YJpF2QJNTSwFpAsLRAWCQFbS4XYHIHLLcr9VZAwQeAIGDWEYwjKgIGjcNkkOOdEVIHwmFVAQGELYtSwHOsq2g5aG2bVsnGgztmCIHs%2BzLIcRzHCdoJnOcF0FJc2wIVdJ0FDctx3e9926Mtj1Pc8sG2QVr1vaDH2fFQ3w/ecolAdqBH/ICQPAyD%2BQVQRYPESREKR5C1E0Ad9B4TDv3MaxbDw%2BJ6KIkjsknY4AFpGya6iklotdCMYm7XAgdwjJ4QIwlYszFmScShN6TnuYk3o%2Bb4jCNIaQzVICerpaU0yePMqXZbyeWDIGCXRgsSypRsnhEt5F1HO4Zzcyp4rjjGkwAuvKbVQBQLCBIUhQqNiK8vIWK0VGBj1WkYJtVK4qtCtCxAkBTU5QEw9ktS9KzY9ewcsi/1Op6tA%2BpGyMhpz2MQGAGRcfzebqEWwU1v7WtK3Wls2222Euz23t%2Byu7Bh1HCRTvvc7Px%2B6cCGXZw7vXTdUG3bYFVew9BQ%2Bs8GwvQfFRvO8FUBl8QYu8GfyhlgAOAsCIKg%2B90bg1HZHR5RMbQjU8dMHC7A%2B0mhXJoRKZpun0Boz4mYYxWAR2asSMqVHmmAdYC0EsUbIRkbRi2yJAkAUtuisz6OrDiYDAFaSQWrAYcCtYtFwfrayCFjbNTdObFyVtpDHGAKgVAxwZDah4AFIKbsPbhTalFGKcV/aJQTk6U2LVuDZR9N7QOwdQ7SHDjHKOMddhx24HTDKQpRHcJVA1CwFDMrqPTtFB8SRMiuGkEAA%3D%3D%3D) it seems that this is happening:

| Source | GCC | Clang |
|--------|-----|----|
| ``std::atomic_thread_fence(std::memory_order_seq_cst) `` | `` lock or QWORD PTR [rsp], 0`` | `` mfence`` |  

The ``mfence`` instruction is much slower, MSVC also generates ``lock inc DWORD PTR __Guard$1[esp+4]`` instead of an ``mfence``. I raised this on the [r/cpp a while ago](https://www.reddit.com/r/cpp_questions/comments/16uer2g/how_do_i_stop_clang_generating_mfence/) and was referred to [this GCC patch](https://gcc.gnu.org/pipermail/gcc-patches/2020-July/550318.html) which introduced the optimisation. How can we go about getting something like this into llvm? I have been using boost atomic which seems to generate better assembly but, it would be really nice to drop the dependency.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyseEnTozqy9q9xbYhTARhje1ELIWaMbWbDpoJBFvOMGX79F7ar-3THd-Iubtx3YekVygllph6ecBgyXCP0a3fgdgf-RziNadP_gk3d9F5WlllYDT-iJll_eWlWIiKr2hJVqB6zGhMhsTtwZRMXfz17hP7qJjSh3YHf0ad0HNthtwc7WtzRIs7GdIp-xk21o8X_Ur2jxTKLnk1f7GgxKptoR4tVmNU7WszquJwS9F874qZ_L6Bl3NFigroJ_UzbdkefCYWomzGLUUKMaTgSY4qItmmJ51THY9bUxBwORBg100iMcxYjIhyIoWxmoqmJuAxrTLwGAsfxTwI8R9QTSYbxO8Ix7ZsJpx994TCgKirXd9BvsaZqsxL1BFrasulR_4-RN0nUlOPPpsefhf2224Obf8EpELkuORhwAf589zkdVpyZcBcgUgaMQXgXINC3mRt1cATGLI66wa3AxGdtNHwBrEMWkcYDwOXEcUBruNoGwAFyOwP9BUQfA1tzW11qAiAqZ6AY08OydvSB5gasMlxpTpiHnYfF2OOfoTkBXmV4FYO4Z4DZ5oICeB1wawEA28DGvvEq85F-YrGVHAYqnmReeHGxHqHPF45uYFNfgHF4vRjp3GY3z6CuHHRMMhLU1eiuW0gdZHQ_N_69nMkClHLY7AdbOXKzdwpl5V5iQEnRciwW4SLn1SlJKwlDmLzPOV-u7C2l8NDpMThe_XtKcunq7zMl3SzNuQnQe-0_7p1XDuq3xlDSzeB5KV2zDigifTsZQGliD3Dni8BQYAAcOYqGLRsCL7EcUHj_QStAOGeWMehmFhthsbhqSvIQXCz5gmtrlQFP6h3KNE65cAA2zch0cg4tm3LNLrJZf6vC1VK3KRI-rhhaammt3x2MXnRsK8kurbVkps6B1UwsJc6tTZfWLTZQEObXsOwjOZH8oxb4sdTi5SKIWp4rsXQ9hVbg1ywU6lC1anwUn8cttfrBgiD9WHrYmWtK6iAZRmVImFqNJSwBJ_u1oofmZ4s6s3dlPgiWUEeuS4H26ZKHaSzIOJ_SHS3WKePxk1AuImM7Rpww59XehCkr5mF5F-bTnDw5VqDjcaUiJMXT5pPj6msf5bd9YuDPzGbexVmhQX3W4ckHsFFUnC4Sl6WQ67JwJW843YCKtcv0Mnj4ESqFy0GXKy48jN5hM4xwburJukC_fZcMf2ricBOUGPDTws0x9BQgsb7gAW0pMnTAElAveWuFYICFbfm6VcFOx5CXtHRRXkCZ-WN-e7XvNuIL3cfii7WOXCfdg3Ol08U4hDisskls-0aTjnWL7tLJgVcGSKouG4EsCHO1dQZGvGOltJq3HCnqF-6jKnAyTvfZDrmX6bU-ejOOqzLWg-xQxdOhO5WBEFipSEYnbLCzrsQSPjwD3X-8sskFpSiKU2HEHgjMaxo-qu4xpqUfeXZoHFwfit75IaVLLbgeJ33f1lUlm3ifQdmYVede8RJCn3UEBst_NmSWKS5pzCN4jR6C7eiNkRIqptNeGYiVK2wBbyNBkC2zIO9BpV1Ow7uXXhQP6jZIY3cDXZWLhqli10jUj-758cC1qFsL3MdP-JIPvlspYeUDOJTZ1cu_KbY1oVqOUyC7gTm1j5npdrTolkZ29aZerLurX5K9GlJtPQZ05XqDfXccEmZ3QXBVL2bt1-oaJ74t-zO1TXqmbr7AMkzBQH9w04sz7AW20uHco3vZxsKkbb26WoxCTjLsloHNcvA6BxG_aeOpE3TdUpyBA_XacD7ghnTtVCmpINuUijFCVXfNWVtJde5upzsjc6FmdDAWkJtfjeYsRUp5MtnLzMFQk7UZXH1VVcrLtJ0yA6jbtDQoa_aNlMT8KXhaN1mG1mW-AItrpKy4ysNzWeYX0CB4PINNblAhg4FTNFUzJ88QgXG9DyesA5jrsCj3fj0n4OLfH82BNRwrFcijFvMzd5aXFfCrY4ciqZxrVo0gVJ83smbvLeffupmrL8YI-fP84u75-hBuO1p8vu8edcrix44Wezm0HqZhRvx9yKTm2yVDjoEZd-CLGg_8cVbgkkyAt2DsKWKmGt_zBBu4Qg04SJs7TuIeGFzdU7N8bxHNlGBNMffZMJS0mC2p4OZv27MwxR8pUi-VWcUOoLlB8V0OnxXQc7XsPD-7mlay7FoXam1G-AplUVSfGlYcx8rq5SY8BZq7cCsANzXUGrXiTnqpc_dsBc0DdxwUBmvmFZatzQlPAEuM5e9oMS16jq8kBzZC6uStsALlvjQWxKbiA91X56Xo0KW7kNB_YDpLb5ZNSv7JStMFWrauqdw3tuygePei9LWEyiKZlGR4c5Lz4byemyKhm3YfWpwx4AC8Dg-s81sOIZg4CArZrhvV9-L4cOE8lbsV89I34j7jGquQMP0GMJARZ31y42dmAVLLBbPmvGMyh8EMkHG2QL6ScIAoAw5w0vpl3FDJice9amgKA1wflYd13xsyKkGTH8n7MPNFxG8seAXXp_fxPk-xdyd9YIiffyfqzD7p03VHi7rxPGMXqDoE9M2HR9YgZxHssc4X3HzjfHyYhtgRm9u9xb0_xLHI8LP3NNKF12Gh-jdjMN1vF4Kk4oB5Azb0ZHO713OfMrgFqyAojWiw6Z5lga6dTmaYR8B5xQ_lI7aAVJQ1RdUadmbzqxzeM7GZlyW3Be8qij4Frvk17V6mwJQLAnt5Bp3tyOI-f8rtZQVCilnOKtKblQtTY1pzJcKVZxeVMsM8uLCK1KsgdapN1ORiU1N7__jYvQx80ahZOAH3ak-zE6SYreT7syEpY7O9erzTdzVqSfJ7IRmF9HSFwF-3wr5vuHClUu2O07x1D8so8Hpcvs1fGyjpMwm9I6Vd4nia222rDrQc1Mb4ShbKHirDKHXPMKAFAdjRhz3_nz9nIqzfiBXVRI-SKf5AzuaLq6uszqqwJNASvjH3_wZd2hq4CFwOzliYNV8UdeiBy4QFBpCcIoAAG3zkczRI8SXyMV-A_Js09sPUMxC4xigpMuZ8zmiw6IBtxEADPM0A6Ynh0B5QtoapAxzM6UBxxseqLV2mCCkVtJiHLMJiTNsC4DzAB2sygwBkwQD4dyEAeB2clAsASEjVUx5qdn4-F3tN9K1WnLyZLoFwuBZyBJOhsBTPydT4NcNvb6IXWegC6dApK61YBe6cquyjU9XUXHeTNRIVwKpHUqZUx84OFyD5DSWeYiA128M_eULuw5jax_pKAsN4yphPSFAseVX5YyY9bMzR0nL3D_gU-gLA1rEJ2QbwrAmNVpovwnz63os2_xkELZV5PwCgfsGVT607dAEnI6mJo4vO4AMLMMguVGAv6CF6Z4nBDwZYzK1WWImRy2GsblbtVfTczsO0MQeo0MWhmwGVcQnmboAjsQ4BYJDa41d_jkYQja3aX_1gun4dkWZctut942Jtus8l5Gqn44JtlTkfYl1aHDwXrdlBaWaWojs7Wum8-EcRMY6fXdPlxVP33qhNlqstkVXuYolMphQrbE-g09jFAha4X5aHST1IrdBj37q2ORmOH9snzKBvdfvggXLyQp-emLnmkg8tgARRplw2GF5-YlLyHFSvk6YEx-L75rCAtEIbkcyVTVaA7NY9CxcVSAkiTj_CrdjkYtMon1Q2oBqAd6A0A25vjk7lP-KDJOiGKjCS4euOaFz5y9O4CPotJnkxXHjufqEU0Us4p2QvJJBbae8orry8ZADv37bQoGq9zpVwihY6gzxU6go2XVY8AojXi5LCim90TfOtCkqP3EwZYId1p3wxdVEl-SkdORtVzhSsqRQoh_vgBaYKEjuoir39BWye5VwzWjMm83Av1n3iMzENfYaGDrrmqS27JLkpaY7xk8t4xXMPnvdMnyYZBG5muKLlNbd1ksc4lR0YUI8Hk1B372w6z81V1KSifLUVaUO92tYstmC4mMCDhhhZzMOXFflyifuzG4DZQECReE_w51zDipTH16K43RLBVeS5El1gSMLFH61Zvg0djQ-hREfuUEt4GyuoyMMnlu2ixOYmw6RR61sskqIa07PiJiop8vG47NH5TLP6mFP3-DRItOH21CvkZfopGvv5_WkQNyVIOk7e0aICjTtYv3lguIbp3wXLFDTzACmBBMmZY2z-tdfDJeK_yEJlNaXIh6L2GSC20hqyWVE2YwJ1vzo-AE7mXGUMZS79YRMrK7bSK2vXk1_sv6gnYnJ4VUJjcxWI-jZ0yBXd9e4RRCvyeEWCDxMP1tqaQ50K40Gk5BsTbPHaMn2eS8UMppcWuQZnXCCnOKnRXTPt9FI8jXQlLqe8wldHV2O6EY5wAQVnOwdDmM_FaJ21zT-jOR6yHS1St5YdwcejVlr1tN1o3ZCAZMbPDUWd4M0O9Tp6o7b3yoGmaVqYNnr_rbV1OnIpJUPTfr3i4335LLIxlB7BfHw97MSR9pEvumg-c99OOZyk-WU8RfN1O4kOV54MfzpJzzUtMbiBASra98vtTEaYkgPZPJh6ZOTOKdFlePy6SVbpQ21MLWinmuSajal8f_GASYeDpXeuXFUg8SEpDE6kmEVkZvSqggI445QNG3vr-czngRhahtcDP4ajP4rzsw9XKObR1U5ukbi6Y8vLEtCwC5Y54MOUAaKiRcM9Su2wFCUtdne0GKqGXbAOfXEnPjDP16NxmxPjaMl8Lms3PUnShWZkm9eM1pRj1QUUnEVe77u7PYrcyTL1bJIK4R_v4WwkBoSq4V_0UTYQ2UCkYduiOqvx-8ol-R35r98jJKxm6mNEvKcShJ8Rfpik3RH-e9dff_7-Nf0z_ucWYseSO5YcxuRtZA_Csamy-PeY9ihMfj9RHaMdffr34wpVTb_-bvoE9b8H1P2O3x9w5z9aiL8VEmUTF0TTE4Z3M3nibptvVNEP7QdJQIL8_yWqr7W_14n_DNpO0Z-N_7Uvq4exn74sWzYQ1RSnH2oN9W8ruuVCIiyHhsCoRn04ouGPko97WR0T_L_9-_1bmsI-2dEMtTtwaGh3NMe83f3bEgoTonkSYf0PrvwkFKIPs-FDAmYD0dQf3u4d9Y4W47YlQmL-sJghbv4JT83z_LNHSZKNf7jKP3K_uwkN7wCHDwdZVage31OKnVBPv7FX2sy_k-Z39nsYm_b3h1H8_SfgrMa__3j5NvKFfHM4ED16or5_O9u8ffy4_M6kNhzj9B_hXhz_xPX0B-61WYv6KszK75O_PmLo7RZN0uRf6lSuO1o8HMg9dfqZjlX5tj2nWZwSWT32TTJ92VJENO2YVdkQviP8ScjNTMRhTcyIwM0fzhSj8UP4Dk2FxvQ9K7MC_SmTemyIsnxVu71IKEQavhARIVQT0_DeGDXNMBLfpP5j_k-h_Z0SRITGEfV_M6zRNL6TJxuJuZnKhIgQ0aOwLFeizmL0Fk36pv04n6AW1Qmq4_XnN01_JL_2yXl_Dn-gX9SROuwZas8efqS_2OOT2ScxG55P5D45kSx1ip7U6YAihE7RPvyR_aJJmiEPFElRDM0cfrLUkY4j6rg_n_fnON7vGBK93_jPd7jvY_iRDcOEfp2p4576UYYRKocPkU7TNZqJz8MdTe8O_I_-11vmr2jCw44hy2wYh7-1jNlYol96NrxT93sa2-c0iGfT_9_0h6-SH1Nf_vofuPnPMX6Hv9q-yVE87mjxE8c7sT5x_r8AAAD__84T2AA">