Issue 140639
Summary `a & ~(a - b)` optimizes to `a & (~a + b)` even though most targets have an `ANDN` instruction
Labels new issue
Assignees
Reporter Validark
    [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
}
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to