llvm / llvm/llvm-project

Allow hoisting of `test` above an `andn`

Open
#205,019 2 comments 0 reactions 0 assignees View on GitHub
backend:X86 missed-optimization
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.