| Issue |
108102
|
| Summary |
Clang fails to fold bitwise and with constant and load
|
| Labels |
clang
|
| Assignees |
|
| Reporter |
SeeSpring
|
In the following code (adapted from https://coredumped.dev/2024/09/09/what-is-the-best-pointer-tagging-method/), Clang fails to merge the `and` and the load
```c
#include <stdint.h>
typedef struct {
uint32_t _pad[1];
int32_t data;
} Data;
typedef struct {
uint8_t *data;
} LowBits;
int32_t untag_bits(LowBits self) {
uint8_t tag = (uint8_t)((uint64_t)self.data & 0b111);
uint8_t *ptr = (uint8_t *)((uint64_t)self.data - tag);
if (tag == 1) {
return ((Data *)ptr)->data;
} else {
return 13;
}
}
```
[Godbolt](
https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1AB9U8lJL6yAngGVG6AMKpaAVxYM9DgDJ4GmADl3ACNMYj0AB1QFQlsGZzcPSOjYgV9/IJZQ8K4LTCsbASECJmICBPdPXMtMazji0oJ0wJCwvQUSsoqk6s6mvxastq4ASgtUV2Jkdg4AUgAmAGY/ZDcsAGpZxccO/EEAOgQt7FmNAEFTs4IATwjMLCp1juJXa02AdgAhS/X11z8CIt5sYCOtjBEmOhZgBWT5cGEAES233OvwBQJB63QTBKyMus3eCPWCJxTDx50uNzuDyeBBebwJKLOv3%2BggAHJiAFTY3GLJkEoneVAAd0%2BhAU5Iu53RwNBrkETGAxmC4ogQtF4qe%2BSoIw%2BTJZAI5oJKwE2iyJEFZBCNIygVoAbJIQSNLFR9jymJt5vb1hpglwAyNJQb2VyInSzRarUb1pzbZaAY7na73aT1gBadYmoN8n7rPCPCAmyNbImjPV537ETAESYMdZQEklWMjcPEEbp44e4MfIn5JQV1G/dbV2vEetcRY9gX4wmXDhjWicaG8TzcXioTiOJ4TKaYL2LHikAiaBdjADWIEP%2BwAnHf3jepO8uGyb/NJPN5vpOJJV6fSJuHC8AoIAaMep5jHAsBIGgLARHQYTkJQsHwfQ4TIMAUhfjQtAEGEIEQME/4qswxDXJwR4kaU1wAPLBNotQnuupCwWwgg0QwtDkRwWikFgwSuMAjhiLQIHMVgLCGMA4g8bw%2BDVnUABumBibxmCqLUrh4f%2BAL5P%2BtB4MExDUc4WD/nSeAsBRvDKcQwTRJgCKYJJRgGUYEF8AYwAKAAangmDCjRdxrke/CCCIYjsFIMiCIoKjqLJpC6LkBjuaYxjmAZwQgZAYyoOGcRiemNGLButnEHgWA5RAYw1HUdgQA43RVKQPgDJk2TJDEhTxC4lRdakDDNB1wx5AU9R9M17T5IxE2NMNrQ5BYk19T0y3ze1i0SLVu7TNt34cCupBrrxgHrKobL2umjrrMAyDIOsUj7PMDa4IQJAHqMvBMVoIwXlekj7PawNsu80JcDekjvO8H7QvaB2/sd/6AcBoHgbJkEwIgKCoHBCFkBQEAofjKCrFJL5cGBOF4cQBFEYlVFkdZpCM7R9GMczrGMAQHFcf%2B/GCcJtCiczElSTJvHybNymqbw6madpiW6UuiVZcZZGmTMvEWVZzG2fZShOS50l%2BKAGOeYqvn%2BYFwXM2FwiiOI0X23Faj/roX6pSYZj6IZ1V5QVAhFSVZVhBVVXwLVM31Z4jUME4q0tW1GRbbkUTdXEU1pykPULUMS11T1DRdIn03jUUfR551vSNFn61lFXww7ZMe2jAdR0nRunDnZd12SOsZNGI9bL7Fw%2BwaK9%2BBEMQn0jN9EH/Ysiz7Evq9r%2BvCN/olKMWGjP1ngd8xb6dnDzxjYy2TEdiSEAA%3D)
Clang has
```asm
and rdi, -8
mov eax, dword ptr [rdi + 4]
```
GCC has
```asm
mov eax, DWORD PTR [rdi+3]
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs