Issue |
149413
|
Summary |
[x86]: Failure to use LEA for base + index + displacement
|
Labels |
backend:X86,
missed-optimization
|
Assignees |
|
Reporter |
Kmeakin
|
https://godbolt.org/z/v89xz7bP8
```c++
#include <stdint.h>
using u64 = uint64_t;
u64 base_plus_index(u64 base, u64 index) { return base + index; }
u64 base_plus_displacement(u64 base) {
return base + 1;
}
u64 base_plus_index_plus_displacement(u64 base, u64 index) {
return base + index + 1;
}
u64 base_plus_index_times_scale_plus_displacement(u64 base, u64 index) {
return base + index * 2 + 1;
}
```
GCC produces
```asm
"base_plus_index(unsigned long, unsigned long)":
lea rax, [rdi+rsi]
ret
"base_plus_displacement(unsigned long)":
lea rax, [rdi+1]
ret
"base_plus_index_plus_displacement(unsigned long, unsigned long)":
lea rax, [rdi+1+rsi]
ret
"base_plus_index_times_scale_plus_displacement(unsigned long, unsigned long)":
lea rax, [rdi+1+rsi*2]
ret
```
but LLVM produces
```asm
base_plus_index(unsigned long, unsigned long):
lea rax, [rdi + rsi]
ret
base_plus_displacement(unsigned long):
lea rax, [rdi + 1]
ret
base_plus_index_plus_displacement(unsigned long, unsigned long):
lea rax, [rdi + rsi]
inc rax
ret
base_plus_index_times_scale_plus_displacement(unsigned long, unsigned long):
lea rax, [rdi + 2*rsi]
inc rax
ret
```
For `base_plus_index_plus_displacement` and `base_plus_index_times_scale_plus_displacement`, the `inc` could be folded into the `lea`
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs