Skip to content

[x86]: Failure to use LEA for base + index + displacement #149413

@Kmeakin

Description

@Kmeakin

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]
        ret

but 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
        ret

For base_plus_index_plus_displacement and base_plus_index_times_scale_plus_displacement, the inc could be folded into the lea

Metadata

Metadata

Assignees

No one assigned

    Labels

    backend:X86missed-optimizationquestionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions