https://llvm.org/bugs/show_bug.cgi?id=27631
Bug ID: 27631 Summary: Poor code generation from LLVM. Product: new-bugs Version: trunk Hardware: PC OS: Linux Status: NEW Severity: normal Priority: P Component: new bugs Assignee: unassignedb...@nondot.org Reporter: co...@google.com CC: llvm-bugs@lists.llvm.org Classification: Unclassified LLVM generates very poor code for the following source code: struct A { int t[16] = {0}; }; const int N = 10000; A a[N]; void foo() { for (int i = 0; i < N; ++i) { a[i] = A(); a[i].t[0] = a[i].t[1] = a[i].t[2] = a[i].t[3] = a[i].t[4] = a[i].t[5] = a[i].t[6] = a[i].t[7] = i; } } When disabling loop unrolling, the assembly of the loop body generated on x86 is shown below (from clang++ t.C -O2 -fno-unroll-loops -S): xorps %xmm0, %xmm0 LOOP: movaps %xmm0, -24(%rsp) movaps %xmm0, -40(%rsp) movaps %xmm0, -56(%rsp) movaps %xmm0, -72(%rsp) movaps -72(%rsp), %xmm1 movaps -56(%rsp), %xmm2 movaps -40(%rsp), %xmm3 movaps -24(%rsp), %xmm4 movups %xmm4, 48(%rax) movups %xmm3, 32(%rax) movups %xmm2, 16(%rax) movups %xmm1, (%rax) movd %ecx, %xmm1 pshufd $0, %xmm1, %xmm1 # xmm1 = xmm1[0,0,0,0] movdqa %xmm1, 16(%rax) movdqa %xmm1, (%rax) incq %rcx addq $64, %rax cmpq $10000, %rcx # imm = 0x2710 jne .LBB0_1 Note that how the values in %xmm0 (all zeros) are copied to the stack multiple times, which are then copied back to other SIMD registers, which are copied to memory. Furthermore, the first 32 bytes of each object are written twice. -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs