[llvm-bugs] [Bug 43664] New: Missed vectorization for std::reverse

via llvm-bugs llvm-bugs at lists.llvm.org
Sun Oct 13 13:42:54 PDT 2019


https://bugs.llvm.org/show_bug.cgi?id=43664

            Bug ID: 43664
           Summary: Missed vectorization for std::reverse
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Loop Optimizer
          Assignee: unassignedbugs at nondot.org
          Reporter: david.bolvansky at gmail.com
                CC: llvm-bugs at lists.llvm.org

#include <algorithm>
#include <vector>
#include <cstdint>

void reverse_epi8(std::vector<int32_t>&v) {
    std::reverse(v.begin(),v.begin()+32);
}

void reverse_epi32(std::vector<int32_t>& v) {
    std::reverse(v.begin(),v.begin()+32);
}

Clang does not vectorize std::reverse with -O3 -march=haswell -std=c++11. 
reverse_epi8(std::vector<int, std::allocator<int> >&):     #
@reverse_epi8(std::vector<int, std::allocator<int> >&)
        mov     rax, qword ptr [rdi]
        lea     rcx, [rax + 124]
        add     rax, 4
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        mov     edx, dword ptr [rax - 4]
        mov     esi, dword ptr [rcx]
        mov     dword ptr [rax - 4], esi
        mov     dword ptr [rcx], edx
        add     rcx, -4
        cmp     rax, rcx
        lea     rax, [rax + 4]
        jb      .LBB0_1
        ret

GCC 8+ vectorizes it.

reverse_epi8(std::vector<int, std::allocator<int> >&):
        mov     rax, QWORD PTR [rdi]
        vmovdqa ymm0, YMMWORD PTR .LC0[rip]
        vmovdqu ymm1, YMMWORD PTR [rax]
        vpermd  ymm2, ymm0, YMMWORD PTR [rax+96]
        vpermd  ymm1, ymm0, ymm1
        vmovdqu YMMWORD PTR [rax], ymm2
        vpermd  ymm2, ymm0, YMMWORD PTR [rax+64]
        vmovdqu YMMWORD PTR [rax+96], ymm1
        vmovdqu ymm1, YMMWORD PTR [rax+32]
        vmovdqu YMMWORD PTR [rax+32], ymm2
        vpermd  ymm0, ymm0, ymm1
        vmovdqu YMMWORD PTR [rax+64], ymm0
        vzeroupper
        ret


https://godbolt.org/z/gJkt3c


Another issue, with std::reverse(v.begin(), v.begin()+2), there is really bad
codegen:
https://godbolt.org/z/D-k-SA

-- 
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/20191013/1e50a805/attachment.html>


More information about the llvm-bugs mailing list