[llvm-bugs] [Bug 33426] New: widening of atomic loads
via llvm-bugs
llvm-bugs at lists.llvm.org
Mon Jun 12 13:09:37 PDT 2017
https://bugs.llvm.org/show_bug.cgi?id=33426
Bug ID: 33426
Summary: widening of atomic loads
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: Scalar Optimizations
Assignee: unassignedbugs at nondot.org
Reporter: richard-llvm at metafoo.co.uk
CC: llvm-bugs at lists.llvm.org
Testcase:
#include <atomic>
#include <cstring>
#include <x86intrin.h>
alignas(16) std::atomic<char> data[16];
void store(int n, char v) { data[n].store(std::memory_order_relaxed); }
__m128i load() {
char copy[16];
for (int n = 0; n != 16; ++n)
copy[n] = data[n].load(std::memory_order_relaxed);
__m128i result;
std::memcpy(&result, copy, 16);
return result;
}
When targeting x86_64, LLVM optimizes the 'load' function to a sequence of 16
load/store pairs:
movb data(%rip), %al
movb %al, -24(%rsp)
movb data+1(%rip), %al
movb %al, -23(%rsp)
movb data+2(%rip), %al
movb %al, -22(%rsp)
movb data+3(%rip), %al
movb %al, -21(%rsp)
movb data+4(%rip), %al
movb %al, -20(%rsp)
movb data+5(%rip), %al
movb %al, -19(%rsp)
movb data+6(%rip), %al
movb %al, -18(%rsp)
movb data+7(%rip), %al
movb %al, -17(%rsp)
movb data+8(%rip), %al
movb %al, -16(%rsp)
movb data+9(%rip), %al
movb %al, -15(%rsp)
movb data+10(%rip), %al
movb %al, -14(%rsp)
movb data+11(%rip), %al
movb %al, -13(%rsp)
movb data+12(%rip), %al
movb %al, -12(%rsp)
movb data+13(%rip), %al
movb %al, -11(%rsp)
movb data+14(%rip), %al
movb %al, -10(%rsp)
movb data+15(%rip), %al
movb %al, -9(%rsp)
movaps -24(%rsp), %xmm0
retq
The function should be optimized to a single 16-byte load.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170612/3b968dbd/attachment.html>
More information about the llvm-bugs
mailing list