<html>
    <head>
      <base href="https://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - clang 3.9 goes somewhat overboard optimizing a simple loop"
   href="https://llvm.org/bugs/show_bug.cgi?id=31400">31400</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>clang 3.9 goes somewhat overboard optimizing a simple loop
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>3.9
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>C++
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>deadalnix@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>dgregor@apple.com, llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>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</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>