Skip to content

Remove unused atomic loads without ordering requirements #161372

@tmatheson-arm

Description

@tmatheson-arm

https://godbolt.org/z/TYrzds3dT

#include <atomic>

std::atomic<uint64_t> x;
uint64_t y;

void atomic() {
    uint64_t unused = x.load(std::memory_order_relaxed);
}

void nonatomic() {
    uint64_t unused = y;
}

For atomic(), the load is generated as load atomic i64, ptr @x monotonic whereas for nonatomic() it is already optimised out. The load here has no ordering constraints, so for aarch64 (and other targets) this results in an unnecessary load operation:

atomic():
        adrp    x8, x
        ldr     xzr, [x8, :lo12:x]
        ret

nonatomic():
        ret

Metadata

Metadata

Assignees

No one assigned

    Labels

    backend:AArch64backend:X86clang:codegenIR generation bugs: mangling, exceptions, etc.missed-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