Skip to content

Poor codegen with atomics #37064

Open
Open
@redbeard0531

Description

@redbeard0531
Bugzilla Link 37716
Version trunk
OS Linux
CC @Bigcheese,@bcardosolopes,@comex,@DougGregor,@hfinkel,@jfbastien,@RKSimon,@RalfJung

Extended Description

https://godbolt.org/g/QcLkce

#include

std::atomic progress{-1};

void combine_writes1() {
// These should be reduced to a single store(0,release),
// At least as long as release-sequence includes same-thread
// relaxed stores. If that is removed, this should just be
// a single relaxed store.
progress.store(0, std::memory_order_relaxed);
progress.store(0, std::memory_order_relaxed);
progress.store(0, std::memory_order_release);
progress.store(0, std::memory_order_release);
progress.store(0, std::memory_order_relaxed);
progress.store(0, std::memory_order_relaxed);
}

void combine_writes2() {
// Ditto above, but should store 5.
progress.store(0, std::memory_order_relaxed);
progress.store(1, std::memory_order_relaxed);
progress.store(2, std::memory_order_release);
progress.store(3, std::memory_order_release);
progress.store(4, std::memory_order_relaxed);
progress.store(5, std::memory_order_relaxed);
}

void combine_loads() {
// These should be reduced to either a single acquire-load
// or an acquire fence.
progress.load(std::memory_order_relaxed);
progress.load(std::memory_order_relaxed);
progress.load(std::memory_order_acquire);
progress.load(std::memory_order_acquire);
progress.load(std::memory_order_relaxed);
progress.load(std::memory_order_relaxed);
}

combine_writes1(): # @​combine_writes1()
mov dword ptr [rip + progress], 0
mov dword ptr [rip + progress], 0
mov dword ptr [rip + progress], 0
mov dword ptr [rip + progress], 0
mov dword ptr [rip + progress], 0
mov dword ptr [rip + progress], 0
ret
combine_writes2(): # @​combine_writes2()
mov dword ptr [rip + progress], 0
mov dword ptr [rip + progress], 1
mov dword ptr [rip + progress], 2
mov dword ptr [rip + progress], 3
mov dword ptr [rip + progress], 4
mov dword ptr [rip + progress], 5
ret
combine_loads(): # @​combine_loads()
mov eax, dword ptr [rip + progress]
mov eax, dword ptr [rip + progress]
mov eax, dword ptr [rip + progress]
mov eax, dword ptr [rip + progress]
mov eax, dword ptr [rip + progress]
mov eax, dword ptr [rip + progress]
ret
progress:
.long 4294967295 # 0xffffffff

Possibly related to #37038

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions