<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/140639>140639</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`a & ~(a - b)` optimizes to `a & (~a + b)` even though most targets have an `ANDN` instruction
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Validark
</td>
</tr>
</table>
<pre>
[Godbolt link](https://godbolt.org/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAZgQDbYB2AhgLbYgDkAjF%2BTXRMiAZVQtGIHgBYBQogFUAztgAKAD24AGfgCsp5eiyah69AG5tyKxqiIEh1ZpgDC6egFc2TA84AyBEzYAHJeAEbYpCAAHOQADuhKxA5Mbp7eBglJ9kIBQaFsEVGxNth2KSJELKREaV4%2BPNbYtjlMldVEeSHhkTHWVTV1GY1KA52B3YW90QCU1ugepKicXDh0QQDUmEroAPr06OL0GwQAbNIbAAKC6BBnFwCkAEwArFrkJ%2Bcbzy88MxsHI67DxMVgcTC7FiYTCkb4AdgAQg8tABBXDCUgATxAyJRG2%2Brye3wAzAARDbqMifR6vd4bAC0PFx%2BJ%2BxJJ5KhmGpBJeTw%2BPyZqJZr0eZI2xi59x5xP5tOZG1I2CI3J%2B0lxDzhpNxXDm9G4L34Pi4OnI6G4fj8ADUALIbACSACUNjtFssCcS%2BOQiNodXMANYgX4AOmkT2kAE4eOG4dEtE84eGXi9DNxpPw2CBieGg9FiXn8wX8%2BQjSazVx%2BEoQO9vcadeQ4LAUBgcPhiGRKNQ6IwwStPYJhGIJJwZHJhMo1Jpa%2BR9HyjCYQLtF6gmi0Uk4mK53PVfBuugUiiBTvFEskhEMGsfsik9z0okfSuUhO1Blvhiuyq1n%2BN8rfD/0OueBijB0N5THecwuksKzPMSgSoJ4OAki4oyEMIQZIA8xK4OqqIeIERDnLsyo3BAeHCIRyosB8ZEEdIREbGE/wakiQr4gqSqLEw4oEqcGwAH4QCwDIMTMmEsSiGpaqidZ6lwBrFj6prcC4zoLFB7pPPwNY6DMcxINgUK9BAuqpumh5aEGPCnNZNm2dZcIKVOZYVlWXo%2Brp5ABsGoYRlGMZxgmSYplwxKGopzlubWcwNgg8AQE26BsHEDCRB2EAYElKVRAQSxzsARCkCCfoCAwRCRJWEBhIpYSBNU2K8PwNWsFiADyYS6B%2B3CehlHDCC1TD0PVJo4GEHjAC4Ej0JWDXkDgbDGMAkhToQirlOY2DTSa2DqGUHhlV1/D4c0in0AQYSkHVbg4IpBUEBmM3raQYSJNgpLYPNJinfOUUCEYwBKJaBDYAA7i1cTMAdo6iEcw6yP2igqBoin6I0eUgGYliGGdlaQHM6BxK0030i1oWmo9pAEDgOPGe%2Bj4%2BBAziATwfL%2BBM%2B69A5WSnqkr4NHyXOtKBB4OQ%2Bn5jEzfKixUYxCxz/4vukfPy9%2BkzCxBanLFIJlyWFTncBs8ELRsEAFUV/wQK2JCwjBfxae5/ogNI0RBi8cJvLGTx%2BU8WjSEeslpuQGa%2B0Ghah0WJb8BFlbVu59aIPFaCJcljAUFQ6VJ1laCGyYRGFUwxVdmVpAVVVU5NXVkPl617WdTNPXMEQ/WDYpI1jRNZjTZ6c0LUtw05R%2BBDrZt/Dbbt%2B0zUdskmqd52XVgKwmrd92eo9z0qG9H2LYEoA/TQf0A0DoPg0afbyIOkgjvD45I1O%2Bgymji67MuM/U3jBMpETJMMvNSwYWSABeTBHryXQOTSmG14AQWaAPRwDMNxM3IKzH8YFMgnlaAggW142a/hGNAumX4EFSyfDLbBKCRji15kBEhyCDx/HmK6TgTxtbyQjkpLgFJoinHpF8bOwBjam3zubS2VIYJMLtlFPSBkcBRBpv7MyLxiRBjssomyshWFR1ctpX0nlHbO1du7OMXsfZ%2B24KTdR3BxE6W1ppRypYLGRSseQR6SRHDSCAA%3D)
```c
#include <stdint.h>
uint64_t foo(uint64_t a, uint64_t b) {
return a & ~(a - b);
}
```
Optimized LLVM IR:
```llvm
define dso_local i64 @foo(i64 %0, i64 %1) local_unnamed_addr {
Entry:
%2 = xor i64 %0, -1
%3 = add i64 %2, %1
%4 = and i64 %3, %0
ret i64 %4
}
```
Should be: [(llc godbolt)](https://godbolt.org/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAZgQDbYB2AhgLbYgDkAjF%2BTXRMiAZVQtGIHgBYBQogFUAztgAKAD24AGfgCsQAJnL0WTUPXoA3NuRWNURAkOrNMAYXT0ArmyaHyrgAyBEzYAHI%2BAEbYpCAA7OQADuhKxE5MHt6%2B/smpjkLBoRFs0bEJdtgO6SJELKREmT5%2BRhVVQjV1RIXhUTHxtrX1jdktg10hPSV9cQCUtuhepKicXDh0oQDUmEroAPr06OL0GwQAbNIbAAKC6BBnFwCkBgCsWuQn5xtPzzwzGwdHXZeJisDiYXYsTCYUhfOIAIQeWgAgrhhKQAJ4gRFIjZfF4GL4AZgAIht1GQPo8Xm8NgBaHjY3HfQlE0mQzCUvHPIxchnIpkvR4kjamDn3LmE97fLSMjakbBETnfaTYh5xYlcOb0bjPfh%2BLg6cjobiBQIANQAshsAJIAJQ2O0WyzxhIM/CI2k1cyQ2EhfQgWu40n4bBAr3I%2BsNxq4/CUIDeHoNmvIcFgKAwOHwxDIlGodEYoJWfDkwjEEk4MhLihUGk95H0PGMpnMVhsrXyfggrmGzQCTEw3WKpX6uTSQh7ORSY6Yg96ZVs2HsHY6Q08TSkC6X1TGs6msUbSjGE4PO4mQ76v3mTpWawmWx2%2B0OEk513Qt3F0veH5ev3%2BT/oQIguw2DguyMJqgiyKokQGJYvyXIEg8wpKF4kRKtSUo/rKzKsmSFLfty7z0thgq4aK6HPJKXIyvB8qKgRKrImqGqBlwuoRnW0ampaNr2o6SzYC6xaJjoMxzAA1mGWgAHQAJzSLJ8mnNyWg8AAHKchIJNqXDBuQobhpG/DRrG8bkCJXrkJJrxyQpSkqepmnadwhJ6px3Dup6cypgg8AQOm6BsIkDAxLmEAYEFIWxBYDikMC4kCAwRAxHGECRHWkQhHUmK8PwmWsBiADykS6JUibFhFHDCIVTD0Dlho4JEXjAG4Ej0HGuXkDgbDNpISZdQQ8pVJY2AdYa2DqJUXjJdwxYhMlOmGvQBCRKQ2UeDgdYwQQoadSNpCRCk2DEtgPVmMtZheQIJjAEoZoENgADuhWJMws38IIpZHBWsifdWaiaP1%2BhGCYl0WNYxgrXGkBzOgiQdh1tKFSytK0mw22JIwSHEiwdSoEg5y0hdXjqMZ%2B2kAQODQwGm5lekLj9sefYDmec4bqOHZMxz6S7sOB6LnT7RHmu2T81uQudLzF4DJ0TOHpLrN7lIcz8cshisexRlGtw/z0KgGwQDB8V/BAWYkOBBiujMnlJmJ5A%2Bn6sQ0zpekGW8WsmbYZkWd5iD%2BWggXBYwFBUOFgdRSAMVG0wCX5slpCpel/X5dl73kCnRUlWVaeVcwRA1XVdaNc1rUWB1xbdb1KwNYNdMjWN/ATVNM2dfNi51stq3rVg1fuhTu3Fvth0qCdZ3ABdoC29dLC3fdT0vW9nV/WWkiVn9ygA3WDZNmDraQ5E1Ow/D6SI8jdJoxjWMkrjSwE9IRMhCTZMxBTVPwCrAttJ23Yi34jZBIrPmSQpyc1/uzEBPNAHS3bNuWWYCxaCyYCucYRQ2YnjgVkP%2BMt6hS33CrBYAllbGB1G5fq0Zdb60NnFGOJszYUieISX4NtRISRAApaSWhXicMJNIOIsk1I8EJOcYhukQxSQ4mQjyXsExeVYewzhWhuG8P4YI4ROlXISKjFIn2rE3SaOMto2R5B9qpGcNIIAA)
```llvm
define dso_local i64 @foo(i64 %0, i64 %1) local_unnamed_addr {
Entry:
%2 = sub i64 %0, %1
%3 = xor i64 %2, -1
%4 = and i64 %3, %0
ret i64 %4
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMmFnPq7iWhn8N-yaqEnOSi31hM0OAMENuSkwxM4QhQC7Ob28l2VVd5-i01FJLrSMhgb_3tb3WwsbPl3iaStTl-U-MgRjD_4iXuejHn37clFk81j-SPtvfmtRnSd_Mh6bsaozhMfJUzPMwYRTASBEjRfTVf-9H9PkD9cIoYEYXVAARPjLG1cBFgBU4I2HVIlHUuQBcFiTQAIeKAG7I4pMIkqBAlyRCfA0qESMZErqhrZfg5luzpMgIRtDqkeiB14yABniSBtIdcdPA5OUeF-wZSMy8a9ujVISCuA2I59gciSnpghMNdii8IiCrORCSaOAAkE0L8EuhbYDRk-GYQ9So51qBVixOgi9txlyQmqMKF80WYp_-BHQ1kmiuGr3JfCF35KJ25cB3fUKKCA0wJKSi4IxbnEcsKB-0Mg35Arcs3muFsQfXEWfNCy6tFkgMJQFA41gIO3HlaiCsYBTHWv3Mkiav_XTSt0lW2CO_6T5KXe4olpHL1QkNMgQsdJoBhCHPeQi4G9hVWyI_fcc9p1bwAsDmk4de3m32mdEJ4PCruH0M3yk2VWW0opUGqObu-s1tvz3U24jnN4XcSua8MduVmc2bRCgkp1Dffniz8a9iMLaQb88SfaHoa0mbncJK9L06Ad4DFyUBnAM4z6hmcZq41Pl0NK3S6LNQB0aEQhqYbe2SNRDo3JToTJiFE51LYXnmjW24riQHy1xCZ7EMu9Manj4jWJUTv_xvEkJvmednGme5RV-AB1F6LUrJ1gyLVdbVma-RWkiKqq43WS30nlCH-NPPPst7xUXWZRZZ1Ja4V9OtxlBX_w6XBXllCd2nKEx1IejSdJ_K-vzC-_ruLF5hErB5FuWyP4juM5ZxGu88Roq4ueSwrCBuMK6cp-tST9rrqjvI6VXaBHVJ97ugK9ZNAadNo83HQ8kVwea7y7T3FAS5zCn23k_wdBOETLGFRBIwUlzjurRGGj2cx0VY6V54pNIKZNriVl7RXb0VJqeUhvhRZje2WeEoVuwwphz96i8iPA7X62pELK-nm2IgTztDsDyGpS2YWJCuXGfcjJbMbqmi-eYt8psg7L_rZ2AAnKQ-shtJv22odaKhWTdN6odXsyRBuhoInYAlkCycZIHnbEgKIBIazbeB5WyvCdhczXH3ngOrzdlqIMBCGSIHGh6pna6rEUxiCfg9clj4mZHi8qKReY4jXB6_-mpPS4JcAY4WKlwN-LDmUcJLOqgLt7fKsTEjknedmOQfkicXjU9gpMjTKV52OLAip5b9BNHKAD0Btjo1xlbkqAYaLtHVUMvubnoeJ0Qr1NQY8hEAx5JIXR1kPVsK6cruV7JED9iXHavguYekqCklKWtiS9ZZuGk4TuEl0Qdtfx6AwCPzKuWfNKrvFwKCVwnc9X75tvTPjT0DJnC6Rz3ShryH5qxBSJvWR-uYSnjdtXLzoo3bXhgp0s-lvl_380euX9wG4-4iKmqzB6LbpXA6CRd7EoDo-e91Ymmkyq0VvG9xzmCk2CNDwW1YnlL1eZHc74bxTkHlCPnUDIslffcCLhVxgQdqcoJik_gLc46VqxhzatpUwBMt1leJJuakPbIl0Vs3P2v9Afi-7zFG6NfXhiWOQeYa11AXLIwUAz4aFKKyjVvl3tgUv3jzijP2tw78eJvf7ylJ5u_kLy-b6vaRMWToI21tx-xM5v35hT-ks0xeIqF_ny2udccBzvdXhMf3ZFfMGlVPnmYUwvwMg_a2KtmjvugYKXpUBfVBcFVdfxrOGgUOgLkL5XEPLdN1WomggRXE4GqvvG5sOqVoL_kUiTrqmhggFBA0GWOkWEgGWNqQFkRnv_OXBGqcXZUEU0Oh2Dl-w0hRbjXWRe42J7tV1cMFiWpfdvIgnhJzhVXcUq8lcUhfiVT9Mjfi1YF1Cm04PI_6ftlKG1bT1Lf7VASiTaTzEOJdIycmkS1HUw-n--2THklrbmZTcBPYgBgGex-ii2Q7U27ZrGPLvMMBgJEMxWPkGcPBr4vFv1f6bpBU2aXNkuUHjOKmOSu7-fcCo4Svdym7maX_mA_3vsfI01_NGCO5w1-tBCPPB-wIMRwcDofDmM_L2B3iA0ayh39g5Ck-_PbxYNTbgh35v0fxncgc5rItX3l2uFx8_aDYGAUOf7c1zbPFcJDl97LLD9nU_9H0adwcSpY-YDT-je_TIBn8Hd2vZ-Id28f6x9J1cZtnf8RZNv4KV-jmcX9jyjvyd0kPGMUftn48_H2o34g_deqjx1n2p06-9c80vxz019H95aB-OfCPY8znPwX6f6qFU_RLkx2S_FMDBmLkqWnSwy-IetfxPw6xLKB2FzxwvWvYA8pY7MDwbFCbo6GDKHRxMLZ7LO8j-hOzlM_gf6LW8U_UEhhdntmPhpHi1A5VfYG9LU54IqjZjEz2F3C1LvM9sAvftyqfsJWw8Fx5m8eQqLJ6RgReXB3_nFqcNy_FX7DV_y9gCyJuCharY7b5-nqtL2nN5PCWq-XEl1EYTS4XecXdVIBi5QECaCwKzQIqjWxRqW53kZYuNLghoBQzIVnX_hS2JwPBWK4iSr5bjYC31ovznvJV2dKiU4b6adN1Fbd8R11a4Xy8Xxy9iusECm53j92oYLaoSc0ET6rrvfjkfUFsWvVJCS0FGBaYigmoClAt0sSD_bUVyvuDxylkTaS7RQrF3ULBQuMdnUAwUt_qT8b2oN82T-FzuTfap5KKSAOrKa8brzRSnwlRrwZ3vl4rQahpvbiUhSfVZ0bGr5I-dLpfTGO43xEaW-llca6wUoE2hOziOlZxNG0nYiN0Zm_-RMqTHLEWfnKdmmNDwpUmtp28xKkkgb6adGsd2SfVukMQr22wfWEVN4WaIShrpkT8mctM_qS-i_J9jFkKWlaSR8uuqw9U7lpfW5IaPfdQEdBpHTSRrm1tdrweI8VRe2lT64iX-7wfX_hcoAcda6x8VbVQ2Z_w9NCQrY1K-5AesFmX3u4CPG6H2BjJnnVeEcdusVr1-vYCgGilAAHZAurLuaintjP2AJ0AkLW0UFTjEfJwsfqkGKT3kWaP0impOTUca1Udt90anPqRD20XZ2uhssNG8cvApvvw4SazZeGk1DzYLu2bm0Ql2GDEl7XO0fUbmcAmSwJny0FtFbLXvpGpDSb4RqbaYVWvTMRClHlO8V0e55uip1UhrID0xiVZWr64ZAyKc8ss6zT4akSCLHrjkuqFlZqtW1TojdlKTwtytmaRXs6jLFotq48zxxg4m6tJXpjR1W_1-VbklqJWQOhvvWCg9y4OVH2dqJOiDDcZBlN5z4K4jK_E580VEhc1eGBEGxpDqYYvE5VWVhCzJjr7rOHtSpKqsjqyUK6Z0wuI2fEiC6uH_uvEq4Fl8tYqtUyT15fqPOX3iG_zlE4epnzTtxfrHCcTspfOPdpyu5DuiVisJbu8RJpXcdeUh8toHBslfZ3SqSinfLMbaV4xUnzhGpJWi4enNzdBEES1CWG5VHrXqK3KgC-PsZOFv4a8loJTMLVJdKuDjCn5jxggFMJoFaFniiizHaD7Er5yITM1AzfkDUaKIZM1R6rmOttrAj_O_XS1ARH6WWykxOgFkNiSLCG01YiMTK8CAyNF4PqGTmZ3o2SIaX5Qo4-I-1K4CyU-5wJ_cNmNAjDrOfKcXTjqnrn4Mzh37zSCoC797rwjQAX8zWj5MbYYgTDfCfOso5yqTO23KtDrsXJW4azYesG5N32Drn9duRHMs0pSUUnR1Q0q47V1rGFP30y9vAR4NYDsUImxBEHEbTG3R9ySRrZFRl2F_Pr6KYo-s4VDUdwII9A0iQQJibk_8FuWsLjRiZKpTq_IK3PFCWljthXHBmCInaAIy1RXDcVUpppQToJqplGx1NbmWHRrVXs4CVvuR_n6KoJikU5XOlJo22xCxdEqUenIUaCc2NTnnrQZeH4MUmooypuI_g0M_X_yxbQk_8QXf-cH6l8JhPxnAvk_8cWP7CeVnalz_CP_SRzpI3umaZr-UfzMaTwmTswpTekzkTI5lZ7xY5KQZ-LMkBlN_Sh_kjjJ4AxxJkkap-nfGSZO8nN2T2MijWOcwmg8b-Oy-f1dyDeF_Cinacl_EjTOUucfTZzkzfT5HYkku3w9fFSMJDGG_zH-fHf6LVnQhNF4U07z9N_DzOXc5D8xFv83PMnih_4XOE6HuT_85cLI0z_eT_AvX_7Mu8Nc9AsqDm0_zYc5HlE-T4cifuaHuHv3BQZvvL1lN83jks5l3_1Yxubnv5BWORdL8nvatxgpfpbN9_bbMPZVnr7_jfkkN2Gk-Cv750_yvwIAAP__7b8F3w">