https://bugs.llvm.org/show_bug.cgi?id=44969
Bug ID: 44969
Summary: Failure to remove monotonic atomic reads
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: Scalar Optimizations
Assignee: unassignedb...@nondot.org
Reporter: hfin...@anl.gov
CC: jdoerf...@anl.gov, llvm-bugs@lists.llvm.org
#include <atomic>
#include <memory>
int *convert(std::atomic<int> *in, int n) {
int *out = (int *) in;
for (int i = 0; i < n; ++i) {
int v = in[i].load(std::memory_order_relaxed);
new (&out[i]) int(v);
}
return out;
}
currently generates IR, using clang -O3 -emit-llvm -g0 -fno-unroll-loops
-std=c++17, that looks like this:
define dso_local i32* @_Z7convertPSt6atomicIiEi(%"struct.std::atomic"* %0, i32
%1) local_unnamed_addr #0 personality i32 (...)* @__gxx_personality_v0 {
%3 = getelementptr %"struct.std::atomic", %"struct.std::atomic"* %0, i64 0,
i32 0, i32 0
%4 = icmp sgt i32 %1, 0
br i1 %4, label %5, label %7
5: ; preds = %2
%6 = zext i32 %1 to i64
br label %8
7: ; preds = %8, %2
ret i32* %3
8: ; preds = %8, %5
%9 = phi i64 [ 0, %5 ], [ %12, %8 ]
%10 = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"*
%0, i64 %9, i32 0, i32 0
%11 = load atomic i32, i32* %10 monotonic, align 4
%12 = add nuw nsw i64 %9, 1
%13 = icmp eq i64 %12, %6
br i1 %13, label %7, label %8
}
and so we successfully remove the store from the placement new, but not the
atomic. AFAIK, there's no reason why we cannot remove it, and we should do so
in order to make it possible for the compiler to remove loops converting atomic
data to non-atomic data (which actually do nothing at all).
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs