llvm / llvm/llvm-project

InstCombine bitwise AND with range comparison generates a huge constant.

Open
#199,095 3 comments 0 reactions 1 assignee Assigned to @mygitljf View on GitHub
backend:X86 llvm:instcombine missed-optimization
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

https://godbolt.org/z/3G43n991K

```c++
#include

ssize_t align4(ssize_t len) {
return len & -4;
}

ssize_t align4_1(ssize_t len) {
__builtin_assume(len >= 0);

return align4(len);
}

ssize_t align4_2(ssize_t len) {
auto aligned = align4(len);

__builtin_assume(aligned >= 0);

return aligned;
}
```

```assembly
align4(long):
mov rax, rdi
and rax, -4
ret

align4_1(long):
movabs rax, 9223372036854775804
and rax, rdi
ret

align4_2(long):
movabs rax, 9223372036854775804
and rax, rdi
ret
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.