Allow hoisting of `test` above an `andn`
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
[C Godbolt](https://c.godbo.lt/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1AB9U8lJL6yAngGVG6AMKpaAVxYMJATlIOAMngMmABy7gBGmMQgAGykAA6oCoS2DM5uHt7xickCAUGhLBFRsZaY1ilCBEzEBGnunlw%2BpeUCldUEeSHhkTEWVTV1GY197Z0FRTEAlBaorsTI7BwApABMAMyByG5YANRLa44KBPiCAHQI%2B9hLGgCCqxsMW667%2B4fHYagu55fXd7eugQI0UkxgIO20AGsIADBMDQTtVKQdjCgSCwQBPJEfFw7ABUYUmewA7AAhX47Cl4sJ7NYAER2UAAfqo9itojt0YSwGB9vTOfsybdKTtiJgCHMGDtmaz2eiBb8lkTab8ONNaJwAKy8TwcLSkVCcRw7BSzeaYVlrHikAiaVXTCEgSRE05EjSSLgajVE6IADmiROG6o4km1tv1nF4ChAGmttumcFgMEQKFQLDidEi5EoaDTGaiyC2hmAoOIrgYEL4dAIkSjEDCYbCgWq6M4VsbzGI6IA8mFtGUbdxeDm2IIuwxaC3dbwsGFXMBHGJaFHB6QsCwi%2BIp6u8KLygA3TDLvWYVRlVzV1u8QGYIN62h4MLEZvOLBhgjEPAsS%2BkA/ED5KWlMHXIx7yMOM%2BAMYAFAANTwTAAHcuziRhv34QQRDEdgpBkQRFBUdQt10Lh9CLEBTGMcx7zCKNIGmVA4hsARlwAWi7NYdmY9d5guOkAC8GF/LV9V/D8sBoiBpmaRjPAgBxBk8NYY38QIukKHoViyJJpPkkBFM0nIGDGboog0qSKn6WoXHqXSYzM1oLKMtSTJGAYrIyPSjlGFTxnUyTTQWCQ1U1UMtwNDgET9ZjgR2QsjAZd8ywhQkIFwQgSAtLhJl4ActEme0QA1FZThWLwNR9SRJHWLg1hWH0uDdfROBDUgvw1GMdT1MLI2jWMp3jJMICQHN03oMgKAgYa8xAaoWD3H1mILAwjGYhLy0rWhq2IWt6y3dtm2/PbOx7PtrG/YdGAIMcJzDGc5wXWgl2/NcN0WPV8F3GwDyPXgTzPC8V2vW9eCop9OxfV7so/L8V1/f9MEA4DgFA0A%2BogpgoNghCkJQlc0OEURxGwvG8LUMNdA0paTDMfQH3EuiGJSFi2I4lhkDiVxeSYOI4noTjmtQES8DE%2BBJJvfsUnsBgnDchpfClxyJmIhItJSHSleyaSFZ6Yi7IYNpXPSWXdf1jpvOMvRPIN6ydYcs2nMCmY5gCzLGo4ISOt4MKdhmubmKYGLKfi0ty2S1KiGIDKst63LpgQTAmCwKIJNd5rWvasMuosHqcrtUgHUK4rSvKyrLRquqGqDNYQs6iNo9zoMVmrz3a5zvKfxrCXJCAA%3D)
```c
#include
#include
uint64_t jk(uint64_t x, uint64_t y, bool *b) {
*b = ((~x & y) != y);
return ~x & y;
}
```
Compiles to:
```asm
jk:
andn rax, rdi, rsi
cmp rax, rsi
setne byte ptr [rdx]
ret
```
Should be:
```asm
jk:
test rsi, rdi
setne byte ptr [rdx]
andn rax, rdi, rsi
ret
```
Contributor guide
Research direction
Start with the linked Godbolt reproduction and the C function `jk`, then inspect LLVM's instruction-selection or code-generation path for this `andn` sequence. Done means the generated assembly uses `test rsi, rdi` before `setne` and emits `andn` without the redundant `cmp` shown in the report.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100