[llvm-bugs] [Bug 31400] New: clang 3.9 goes somewhat overboard optimizing a simple loop

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Dec 15 16:11:28 PST 2016


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

            Bug ID: 31400
           Summary: clang 3.9 goes somewhat overboard optimizing a simple
                    loop
           Product: clang
           Version: 3.9
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
          Assignee: unassignedclangbugs at nondot.org
          Reporter: deadalnix at gmail.com
                CC: dgregor at apple.com, llvm-bugs at lists.llvm.org
    Classification: Unclassified

Sample code:

  int pow(int num, int pow){
    long res = num;
    while(--pow > 0){
      res *= num;
    }
    return res;
  }

Codegen using O2/O3/Ofast :

.LCPI0_0:
        .quad   1                       # 0x1
        .quad   1                       # 0x1
.LCPI0_1:
        .quad   1                       # 0x1
pow(int, int):                               # @pow(int, int)
        movsxd  rcx, edi
        cmp     esi, 2
        jl      .LBB0_1
        lea     r10d, [rsi - 1]
        cmp     r10d, 16
        jae     .LBB0_4
        mov     rax, rcx
        jmp     .LBB0_15
.LBB0_1:
        mov     rax, rcx
        ret
.LBB0_4:
        mov     r8d, r10d
        and     r8d, -16
        mov     r9d, r10d
        and     r9d, -16
        je      .LBB0_5
        vmovq   xmm0, rcx
        mov     eax, 1
        vmovq   xmm1, rax
        vpunpcklqdq     xmm0, xmm0, xmm1 # xmm0 = xmm0[0],xmm1[0]
        vinserti128     ymm2, ymm0, xmmword ptr [rip + .LCPI0_0], 1
        vmovq   xmm0, rcx
        vpbroadcastq    ymm0, xmm0
        lea     edi, [r9 - 16]
        mov     edx, edi
        shr     edx, 4
        lea     eax, [rdx + 1]
        and     eax, 7
        cmp     edi, 112
        jae     .LBB0_8
        vpbroadcastq    ymm4, qword ptr [rip + .LCPI0_1]
        vmovdqa ymm5, ymm4
        vmovdqa ymm3, ymm4
        jmp     .LBB0_10
.LBB0_5:
        mov     rax, rcx
        jmp     .LBB0_15
.LBB0_8:
        lea     edi, [rax - 1]
        sub     edi, edx
        vpbroadcastq    ymm4, qword ptr [rip + .LCPI0_1]
        vpsrlq  ymm1, ymm0, 32
        vmovdqa ymm5, ymm4
        vmovdqa ymm3, ymm4
.LBB0_9:                                # =>This Inner Loop Header: Depth=1
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        add     edi, 8
        jne     .LBB0_9
.LBB0_10:
        test    eax, eax
        je      .LBB0_13
        neg     eax
        vpsrlq  ymm1, ymm0, 32
.LBB0_12:                               # =>This Inner Loop Header: Depth=1
        vpmuludq        ymm6, ymm2, ymm0
        vpmuludq        ymm7, ymm2, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm2, ymm2, 32
        vpmuludq        ymm2, ymm2, ymm0
        vpsllq  ymm2, ymm2, 32
        vpaddq  ymm2, ymm6, ymm2
        vpmuludq        ymm6, ymm4, ymm0
        vpmuludq        ymm7, ymm4, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm4, ymm4, 32
        vpmuludq        ymm4, ymm4, ymm0
        vpsllq  ymm4, ymm4, 32
        vpaddq  ymm4, ymm6, ymm4
        vpmuludq        ymm6, ymm5, ymm0
        vpmuludq        ymm7, ymm5, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm5, ymm5, 32
        vpmuludq        ymm5, ymm5, ymm0
        vpsllq  ymm5, ymm5, 32
        vpaddq  ymm5, ymm6, ymm5
        vpmuludq        ymm6, ymm3, ymm0
        vpmuludq        ymm7, ymm3, ymm1
        vpsllq  ymm7, ymm7, 32
        vpaddq  ymm6, ymm6, ymm7
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm3, ymm3, ymm0
        vpsllq  ymm3, ymm3, 32
        vpaddq  ymm3, ymm6, ymm3
        add     eax, 1
        jne     .LBB0_12
.LBB0_13:
        vpmuludq        ymm0, ymm4, ymm2
        vpsrlq  ymm1, ymm2, 32
        vpmuludq        ymm1, ymm4, ymm1
        vpsllq  ymm1, ymm1, 32
        vpaddq  ymm0, ymm0, ymm1
        vpsrlq  ymm1, ymm4, 32
        vpmuludq        ymm1, ymm1, ymm2
        vpsllq  ymm1, ymm1, 32
        vpaddq  ymm0, ymm0, ymm1
        vpmuludq        ymm1, ymm5, ymm0
        vpsrlq  ymm2, ymm0, 32
        vpmuludq        ymm2, ymm5, ymm2
        vpsllq  ymm2, ymm2, 32
        vpsrlq  ymm4, ymm5, 32
        vpmuludq        ymm0, ymm4, ymm0
        vpsllq  ymm0, ymm0, 32
        vpaddq  ymm0, ymm1, ymm0
        vpaddq  ymm0, ymm2, ymm0
        vpmuludq        ymm1, ymm3, ymm0
        vpsrlq  ymm2, ymm0, 32
        vpmuludq        ymm2, ymm3, ymm2
        vpsllq  ymm2, ymm2, 32
        vpsrlq  ymm3, ymm3, 32
        vpmuludq        ymm0, ymm3, ymm0
        vpsllq  ymm0, ymm0, 32
        vpaddq  ymm0, ymm1, ymm0
        vpaddq  ymm0, ymm2, ymm0
        vextracti128    xmm1, ymm0, 1
        vpmuludq        ymm2, ymm0, ymm1
        vpsrlq  ymm3, ymm1, 32
        vpmuludq        ymm3, ymm0, ymm3
        vpsllq  ymm3, ymm3, 32
        vpsrlq  ymm0, ymm0, 32
        vpmuludq        ymm0, ymm0, ymm1
        vpsllq  ymm0, ymm0, 32
        vpaddq  ymm0, ymm2, ymm0
        vpaddq  ymm0, ymm3, ymm0
        vpshufd xmm1, xmm0, 78          # xmm1 = xmm0[2,3,0,1]
        vpmuludq        ymm2, ymm0, ymm1
        vpsrlq  ymm3, ymm1, 32
        vpmuludq        ymm3, ymm0, ymm3
        vpsllq  ymm3, ymm3, 32
        vpsrlq  ymm0, ymm0, 32
        vpmuludq        ymm0, ymm0, ymm1
        vpsllq  ymm0, ymm0, 32
        vpaddq  ymm0, ymm2, ymm0
        vpaddq  ymm0, ymm3, ymm0
        vmovq   rax, xmm0
        cmp     r10d, r9d
        je      .LBB0_16
        sub     esi, r8d
.LBB0_15:                               # =>This Inner Loop Header: Depth=1
        add     esi, -1
        imul    rax, rcx
        cmp     esi, 1
        jg      .LBB0_15
.LBB0_16:
        vzeroupper
        ret

-- 
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/20161216/ec01fd79/attachment-0001.html>


More information about the llvm-bugs mailing list