-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Closed
Labels
backend:X86missed-optimizationquestionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!A question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!
Description
https://godbolt.org/z/v89xz7bP8
#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
"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]
retbut LLVM produces
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
retFor base_plus_index_plus_displacement and base_plus_index_times_scale_plus_displacement, the inc could be folded into the lea
Metadata
Metadata
Assignees
Labels
backend:X86missed-optimizationquestionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!A question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!