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

Reply via email to