void matrix_ft_self_atimes(const double *x, double *y, double ex, double ey,
                           double ez, double xa, double ya, double yb,
                           double xc, double yc) {
  double a1, a2;
  double b1;
  double c1, c2;
  double b1x, b1y, b1z;
  double exx, eyy, ezz, exy, eyz, exz;
  a1 = ya;
  a2 = xa - ya;
  b1 = yb;
  c1 = yc;
  c2 = xc - yc;
  exx = ex * ex;
  eyy = ey * ey;
  ezz = ez * ez;
  exy = ex * ey;
  eyz = ey * ez;
  exz = ez * ex;
  b1x = b1 * ex;
  b1y = b1 * ey;
  b1z = b1 * ez;
  y[0] += x[0] * (a1 + a2 * exx);
  y[1] += x[1] * (a1 + a2 * eyy);
  y[2] += x[2] * (a1 + a2 * ezz);
  y[0] += x[1] * (a2 * exy);
  y[1] += x[0] * (a2 * exy);
  y[1] += x[2] * (a2 * eyz);
  y[2] += x[1] * (a2 * eyz);
  y[2] += x[0] * (a2 * exz);
  y[0] += x[2] * (a2 * exz);
  y[3] += x[1] * (+b1z);
  y[3] += x[2] * (-b1y);
  y[4] += x[0] * (-b1z);
  y[4] += x[2] * (+b1x);
  y[5] += x[0] * (+b1y);
  y[5] += x[1] * (-b1x);
  y[1] += x[3] * (+b1z);
  y[2] += x[3] * (-b1y);
  y[0] += x[4] * (-b1z);
  y[2] += x[4] * (+b1x);
  y[0] += x[5] * (+b1y);
  y[1] += x[5] * (-b1x);
  y[3] += x[3] * (c1 + c2 * exx);
  y[4] += x[4] * (c1 + c2 * eyy);
  y[5] += x[5] * (c1 + c2 * ezz);
  y[3] += x[4] * (c2 * exy);
  y[4] += x[3] * (c2 * exy);
  y[4] += x[5] * (c2 * eyz);
  y[5] += x[4] * (c2 * eyz);
  y[5] += x[3] * (c2 * exz);
  y[3] += x[5] * (c2 * exz);
}


x86 assembly (clang, -O0):
<matrix_ft_self_atimes>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
movsd  %xmm2,-0x28(%rbp)
movsd  %xmm3,-0x30(%rbp)
movsd  %xmm4,-0x38(%rbp)
movsd  %xmm5,-0x40(%rbp)
movsd  %xmm6,-0x48(%rbp)
movsd  %xmm7,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x30(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x18(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0x68(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x68(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
movsd  -0x68(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x58(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm3
ff
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x58(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm3
ff
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x58(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm2
movsd  -0xa8(%rbp),%xmm3
ff
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  -0xb0(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  -0xb0(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  -0xb8(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  -0xb8(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  -0xc0(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  -0xc0(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x90(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x88(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x90(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x80(%rbp),%xmm2
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x88(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x28(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x80(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x28(%rax)
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x90(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x88(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x90(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x80(%rbp),%xmm2
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x88(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x80(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x70(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm3
ff
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x70(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm3
ff
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax)
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x70(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm2
movsd  -0xa8(%rbp),%xmm3
ff
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x28(%rax)
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  -0xb0(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  -0xb0(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax)
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  -0xb8(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax)
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  -0xb8(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x28(%rax)
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  -0xc0(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x28(%rax)
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  -0xc0(%rbp),%xmm2
ff
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rax)
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<matrix_ft_self_atimes>:
movsd  %xmm7,-0x8(%rsp)
movsd  %xmm6,-0x10(%rsp)
movapd %xmm2,%xmm10
movapd %xmm0,%xmm11
subsd  %xmm4,%xmm3
movapd %xmm0,%xmm13
mulsd  %xmm0,%xmm13
movapd %xmm1,%xmm12
mulsd  %xmm1,%xmm12
movapd %xmm2,%xmm6
mulsd  %xmm2,%xmm6
movapd %xmm0,%xmm7
mulsd  %xmm1,%xmm7
movapd %xmm1,%xmm9
mulsd  %xmm2,%xmm9
movapd %xmm0,%xmm8
mulsd  %xmm2,%xmm8
mulsd  %xmm5,%xmm11
movapd %xmm3,%xmm15
mulsd  %xmm13,%xmm15
addsd  %xmm4,%xmm15
mulsd  (%rdi),%xmm15
mulsd  %xmm5,%xmm1
addsd  (%rsi),%xmm15
movsd  %xmm15,(%rsi)
movapd %xmm3,%xmm0
mulsd  %xmm12,%xmm0
addsd  %xmm4,%xmm0
mulsd  0x8(%rdi),%xmm0
mulsd  %xmm5,%xmm10
addsd  0x8(%rsi),%xmm0
movsd  %xmm0,0x8(%rsi)
movapd %xmm3,%xmm5
mulsd  %xmm6,%xmm5
addsd  %xmm4,%xmm5
mulsd  0x10(%rdi),%xmm5
addsd  0x10(%rsi),%xmm5
movsd  %xmm5,0x10(%rsi)
movapd %xmm7,%xmm4
mulsd  %xmm3,%xmm4
movsd  0x8(%rdi),%xmm14
mulsd  %xmm4,%xmm14
addsd  %xmm15,%xmm14
movsd  %xmm14,(%rsi)
mulsd  (%rdi),%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,0x8(%rsi)
movapd %xmm9,%xmm15
mulsd  %xmm3,%xmm15
movsd  0x10(%rdi),%xmm2
mulsd  %xmm15,%xmm2
addsd  %xmm4,%xmm2
movsd  %xmm2,0x8(%rsi)
mulsd  0x8(%rdi),%xmm15
addsd  %xmm5,%xmm15
movsd  %xmm15,0x10(%rsi)
mulsd  %xmm8,%xmm3
movsd  (%rdi),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm15,%xmm4
movsd  %xmm4,0x10(%rsi)
mulsd  0x10(%rdi),%xmm3
addsd  %xmm14,%xmm3
movsd  %xmm3,(%rsi)
movsd  0x8(%rdi),%xmm14
mulsd  %xmm10,%xmm14
addsd  0x18(%rsi),%xmm14
movsd  %xmm14,0x18(%rsi)
movsd  0x10(%rdi),%xmm5
mulsd  %xmm1,%xmm5
subsd  %xmm5,%xmm14
movsd  %xmm14,0x18(%rsi)
movsd  (%rdi),%xmm5
mulsd  %xmm10,%xmm5
movsd  0x20(%rsi),%xmm0
subsd  %xmm5,%xmm0
movsd  %xmm0,0x20(%rsi)
movsd  0x10(%rdi),%xmm15
mulsd  %xmm11,%xmm15
addsd  %xmm0,%xmm15
movsd  %xmm15,0x20(%rsi)
movsd  (%rdi),%xmm5
mulsd  %xmm1,%xmm5
addsd  0x28(%rsi),%xmm5
movsd  %xmm5,0x28(%rsi)
movsd  0x8(%rdi),%xmm0
mulsd  %xmm11,%xmm0
subsd  %xmm0,%xmm5
movsd  %xmm5,0x28(%rsi)
movsd  0x18(%rdi),%xmm0
mulsd  %xmm10,%xmm0
addsd  %xmm2,%xmm0
movsd  %xmm0,0x8(%rsi)
movsd  0x18(%rdi),%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm4
movsd  %xmm4,0x10(%rsi)
mulsd  0x20(%rdi),%xmm10
subsd  %xmm10,%xmm3
movsd  %xmm3,(%rsi)
movsd  0x20(%rdi),%xmm2
mulsd  %xmm11,%xmm2
addsd  %xmm4,%xmm2
movsd  %xmm2,0x10(%rsi)
mulsd  0x28(%rdi),%xmm1
addsd  %xmm3,%xmm1
movsd  %xmm1,(%rsi)
mulsd  0x28(%rdi),%xmm11
subsd  %xmm11,%xmm0
movsd  %xmm0,0x8(%rsi)
movsd  -0x10(%rsp),%xmm2
movsd  -0x8(%rsp),%xmm0
subsd  %xmm0,%xmm2
mulsd  %xmm2,%xmm13
addsd  %xmm0,%xmm13
mulsd  0x18(%rdi),%xmm13
addsd  %xmm14,%xmm13
movsd  %xmm13,0x18(%rsi)
mulsd  %xmm2,%xmm12
addsd  %xmm0,%xmm12
mulsd  0x20(%rdi),%xmm12
addsd  %xmm15,%xmm12
mulsd  %xmm2,%xmm6
addsd  %xmm0,%xmm6
movsd  %xmm12,0x20(%rsi)
mulsd  0x28(%rdi),%xmm6
addsd  %xmm5,%xmm6
movsd  %xmm6,0x28(%rsi)
mulsd  %xmm2,%xmm7
movsd  0x20(%rdi),%xmm0
mulsd  %xmm7,%xmm0
addsd  %xmm13,%xmm0
movsd  %xmm0,0x18(%rsi)
mulsd  0x18(%rdi),%xmm7
addsd  %xmm12,%xmm7
movsd  %xmm7,0x20(%rsi)
mulsd  %xmm2,%xmm9
movsd  0x28(%rdi),%xmm1
mulsd  %xmm9,%xmm1
addsd  %xmm7,%xmm1
movsd  %xmm1,0x20(%rsi)
mulsd  0x20(%rdi),%xmm9
addsd  %xmm6,%xmm9
movsd  %xmm9,0x28(%rsi)
mulsd  %xmm2,%xmm8
movsd  0x18(%rdi),%xmm1
mulsd  %xmm8,%xmm1
addsd  %xmm9,%xmm1
movsd  %xmm1,0x28(%rsi)
mulsd  0x28(%rdi),%xmm8
addsd  %xmm0,%xmm8
movsd  %xmm8,0x18(%rsi)
ret

LLVM IR (-O0):
define void @matrix_ft_self_atimes(double* %0, double* %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9) {
%11 = alloca double*
%12 = alloca double*
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
%33 = alloca double
%34 = alloca double
store double* %0, double** %11
store double* %1, double** %12
store double %2, double* %13
store double %3, double* %14
store double %4, double* %15
store double %5, double* %16
store double %6, double* %17
store double %7, double* %18
store double %8, double* %19
store double %9, double* %20
%35 = load double, double* %17
store double %35, double* %21
%36 = load double, double* %16
%37 = load double, double* %17
%38 = fsub double %36, %37
store double %38, double* %22
%39 = load double, double* %18
store double %39, double* %23
%40 = load double, double* %20
store double %40, double* %24
%41 = load double, double* %19
%42 = load double, double* %20
%43 = fsub double %41, %42
store double %43, double* %25
%44 = load double, double* %13
%45 = load double, double* %13
%46 = fmul double %44, %45
store double %46, double* %29
%47 = load double, double* %14
%48 = load double, double* %14
%49 = fmul double %47, %48
store double %49, double* %30
%50 = load double, double* %15
%51 = load double, double* %15
%52 = fmul double %50, %51
store double %52, double* %31
%53 = load double, double* %13
%54 = load double, double* %14
%55 = fmul double %53, %54
store double %55, double* %32
%56 = load double, double* %14
%57 = load double, double* %15
%58 = fmul double %56, %57
store double %58, double* %33
%59 = load double, double* %15
%60 = load double, double* %13
%61 = fmul double %59, %60
store double %61, double* %34
%62 = load double, double* %23
%63 = load double, double* %13
%64 = fmul double %62, %63
store double %64, double* %26
%65 = load double, double* %23
%66 = load double, double* %14
%67 = fmul double %65, %66
store double %67, double* %27
%68 = load double, double* %23
%69 = load double, double* %15
%70 = fmul double %68, %69
store double %70, double* %28
%71 = load double*, double** %11
%72 = getelementptr inbounds double, double* %71, i64 0
%73 = load double, double* %72
%74 = load double, double* %21
%75 = load double, double* %22
%76 = load double, double* %29
%77 = call double @llvm.fmuladd.f64(double %75, double %76, double %74)
%78 = load double*, double** %12
%79 = getelementptr inbounds double, double* %78, i64 0
%80 = load double, double* %79
%81 = call double @llvm.fmuladd.f64(double %73, double %77, double %80)
store double %81, double* %79
%82 = load double*, double** %11
%83 = getelementptr inbounds double, double* %82, i64 1
%84 = load double, double* %83
%85 = load double, double* %21
%86 = load double, double* %22
%87 = load double, double* %30
%88 = call double @llvm.fmuladd.f64(double %86, double %87, double %85)
%89 = load double*, double** %12
%90 = getelementptr inbounds double, double* %89, i64 1
%91 = load double, double* %90
%92 = call double @llvm.fmuladd.f64(double %84, double %88, double %91)
store double %92, double* %90
%93 = load double*, double** %11
%94 = getelementptr inbounds double, double* %93, i64 2
%95 = load double, double* %94
%96 = load double, double* %21
%97 = load double, double* %22
%98 = load double, double* %31
%99 = call double @llvm.fmuladd.f64(double %97, double %98, double %96)
%100 = load double*, double** %12
%101 = getelementptr inbounds double, double* %100, i64 2
%102 = load double, double* %101
%103 = call double @llvm.fmuladd.f64(double %95, double %99, double %102)
store double %103, double* %101
%104 = load double*, double** %11
%105 = getelementptr inbounds double, double* %104, i64 1
%106 = load double, double* %105
%107 = load double, double* %22
%108 = load double, double* %32
%109 = fmul double %107, %108
%110 = load double*, double** %12
%111 = getelementptr inbounds double, double* %110, i64 0
%112 = load double, double* %111
%113 = call double @llvm.fmuladd.f64(double %106, double %109, double %112)
store double %113, double* %111
%114 = load double*, double** %11
%115 = getelementptr inbounds double, double* %114, i64 0
%116 = load double, double* %115
%117 = load double, double* %22
%118 = load double, double* %32
%119 = fmul double %117, %118
%120 = load double*, double** %12
%121 = getelementptr inbounds double, double* %120, i64 1
%122 = load double, double* %121
%123 = call double @llvm.fmuladd.f64(double %116, double %119, double %122)
store double %123, double* %121
%124 = load double*, double** %11
%125 = getelementptr inbounds double, double* %124, i64 2
%126 = load double, double* %125
%127 = load double, double* %22
%128 = load double, double* %33
%129 = fmul double %127, %128
%130 = load double*, double** %12
%131 = getelementptr inbounds double, double* %130, i64 1
%132 = load double, double* %131
%133 = call double @llvm.fmuladd.f64(double %126, double %129, double %132)
store double %133, double* %131
%134 = load double*, double** %11
%135 = getelementptr inbounds double, double* %134, i64 1
%136 = load double, double* %135
%137 = load double, double* %22
%138 = load double, double* %33
%139 = fmul double %137, %138
%140 = load double*, double** %12
%141 = getelementptr inbounds double, double* %140, i64 2
%142 = load double, double* %141
%143 = call double @llvm.fmuladd.f64(double %136, double %139, double %142)
store double %143, double* %141
%144 = load double*, double** %11
%145 = getelementptr inbounds double, double* %144, i64 0
%146 = load double, double* %145
%147 = load double, double* %22
%148 = load double, double* %34
%149 = fmul double %147, %148
%150 = load double*, double** %12
%151 = getelementptr inbounds double, double* %150, i64 2
%152 = load double, double* %151
%153 = call double @llvm.fmuladd.f64(double %146, double %149, double %152)
store double %153, double* %151
%154 = load double*, double** %11
%155 = getelementptr inbounds double, double* %154, i64 2
%156 = load double, double* %155
%157 = load double, double* %22
%158 = load double, double* %34
%159 = fmul double %157, %158
%160 = load double*, double** %12
%161 = getelementptr inbounds double, double* %160, i64 0
%162 = load double, double* %161
%163 = call double @llvm.fmuladd.f64(double %156, double %159, double %162)
store double %163, double* %161
%164 = load double*, double** %11
%165 = getelementptr inbounds double, double* %164, i64 1
%166 = load double, double* %165
%167 = load double, double* %28
%168 = load double*, double** %12
%169 = getelementptr inbounds double, double* %168, i64 3
%170 = load double, double* %169
%171 = call double @llvm.fmuladd.f64(double %166, double %167, double %170)
store double %171, double* %169
%172 = load double*, double** %11
%173 = getelementptr inbounds double, double* %172, i64 2
%174 = load double, double* %173
%175 = load double, double* %27
%176 = fneg double %175
%177 = load double*, double** %12
%178 = getelementptr inbounds double, double* %177, i64 3
%179 = load double, double* %178
%180 = call double @llvm.fmuladd.f64(double %174, double %176, double %179)
store double %180, double* %178
%181 = load double*, double** %11
%182 = getelementptr inbounds double, double* %181, i64 0
%183 = load double, double* %182
%184 = load double, double* %28
%185 = fneg double %184
%186 = load double*, double** %12
%187 = getelementptr inbounds double, double* %186, i64 4
%188 = load double, double* %187
%189 = call double @llvm.fmuladd.f64(double %183, double %185, double %188)
store double %189, double* %187
%190 = load double*, double** %11
%191 = getelementptr inbounds double, double* %190, i64 2
%192 = load double, double* %191
%193 = load double, double* %26
%194 = load double*, double** %12
%195 = getelementptr inbounds double, double* %194, i64 4
%196 = load double, double* %195
%197 = call double @llvm.fmuladd.f64(double %192, double %193, double %196)
store double %197, double* %195
%198 = load double*, double** %11
%199 = getelementptr inbounds double, double* %198, i64 0
%200 = load double, double* %199
%201 = load double, double* %27
%202 = load double*, double** %12
%203 = getelementptr inbounds double, double* %202, i64 5
%204 = load double, double* %203
%205 = call double @llvm.fmuladd.f64(double %200, double %201, double %204)
store double %205, double* %203
%206 = load double*, double** %11
%207 = getelementptr inbounds double, double* %206, i64 1
%208 = load double, double* %207
%209 = load double, double* %26
%210 = fneg double %209
%211 = load double*, double** %12
%212 = getelementptr inbounds double, double* %211, i64 5
%213 = load double, double* %212
%214 = call double @llvm.fmuladd.f64(double %208, double %210, double %213)
store double %214, double* %212
%215 = load double*, double** %11
%216 = getelementptr inbounds double, double* %215, i64 3
%217 = load double, double* %216
%218 = load double, double* %28
%219 = load double*, double** %12
%220 = getelementptr inbounds double, double* %219, i64 1
%221 = load double, double* %220
%222 = call double @llvm.fmuladd.f64(double %217, double %218, double %221)
store double %222, double* %220
%223 = load double*, double** %11
%224 = getelementptr inbounds double, double* %223, i64 3
%225 = load double, double* %224
%226 = load double, double* %27
%227 = fneg double %226
%228 = load double*, double** %12
%229 = getelementptr inbounds double, double* %228, i64 2
%230 = load double, double* %229
%231 = call double @llvm.fmuladd.f64(double %225, double %227, double %230)
store double %231, double* %229
%232 = load double*, double** %11
%233 = getelementptr inbounds double, double* %232, i64 4
%234 = load double, double* %233
%235 = load double, double* %28
%236 = fneg double %235
%237 = load double*, double** %12
%238 = getelementptr inbounds double, double* %237, i64 0
%239 = load double, double* %238
%240 = call double @llvm.fmuladd.f64(double %234, double %236, double %239)
store double %240, double* %238
%241 = load double*, double** %11
%242 = getelementptr inbounds double, double* %241, i64 4
%243 = load double, double* %242
%244 = load double, double* %26
%245 = load double*, double** %12
%246 = getelementptr inbounds double, double* %245, i64 2
%247 = load double, double* %246
%248 = call double @llvm.fmuladd.f64(double %243, double %244, double %247)
store double %248, double* %246
%249 = load double*, double** %11
%250 = getelementptr inbounds double, double* %249, i64 5
%251 = load double, double* %250
%252 = load double, double* %27
%253 = load double*, double** %12
%254 = getelementptr inbounds double, double* %253, i64 0
%255 = load double, double* %254
%256 = call double @llvm.fmuladd.f64(double %251, double %252, double %255)
store double %256, double* %254
%257 = load double*, double** %11
%258 = getelementptr inbounds double, double* %257, i64 5
%259 = load double, double* %258
%260 = load double, double* %26
%261 = fneg double %260
%262 = load double*, double** %12
%263 = getelementptr inbounds double, double* %262, i64 1
%264 = load double, double* %263
%265 = call double @llvm.fmuladd.f64(double %259, double %261, double %264)
store double %265, double* %263
%266 = load double*, double** %11
%267 = getelementptr inbounds double, double* %266, i64 3
%268 = load double, double* %267
%269 = load double, double* %24
%270 = load double, double* %25
%271 = load double, double* %29
%272 = call double @llvm.fmuladd.f64(double %270, double %271, double %269)
%273 = load double*, double** %12
%274 = getelementptr inbounds double, double* %273, i64 3
%275 = load double, double* %274
%276 = call double @llvm.fmuladd.f64(double %268, double %272, double %275)
store double %276, double* %274
%277 = load double*, double** %11
%278 = getelementptr inbounds double, double* %277, i64 4
%279 = load double, double* %278
%280 = load double, double* %24
%281 = load double, double* %25
%282 = load double, double* %30
%283 = call double @llvm.fmuladd.f64(double %281, double %282, double %280)
%284 = load double*, double** %12
%285 = getelementptr inbounds double, double* %284, i64 4
%286 = load double, double* %285
%287 = call double @llvm.fmuladd.f64(double %279, double %283, double %286)
store double %287, double* %285
%288 = load double*, double** %11
%289 = getelementptr inbounds double, double* %288, i64 5
%290 = load double, double* %289
%291 = load double, double* %24
%292 = load double, double* %25
%293 = load double, double* %31
%294 = call double @llvm.fmuladd.f64(double %292, double %293, double %291)
%295 = load double*, double** %12
%296 = getelementptr inbounds double, double* %295, i64 5
%297 = load double, double* %296
%298 = call double @llvm.fmuladd.f64(double %290, double %294, double %297)
store double %298, double* %296
%299 = load double*, double** %11
%300 = getelementptr inbounds double, double* %299, i64 4
%301 = load double, double* %300
%302 = load double, double* %25
%303 = load double, double* %32
%304 = fmul double %302, %303
%305 = load double*, double** %12
%306 = getelementptr inbounds double, double* %305, i64 3
%307 = load double, double* %306
%308 = call double @llvm.fmuladd.f64(double %301, double %304, double %307)
store double %308, double* %306
%309 = load double*, double** %11
%310 = getelementptr inbounds double, double* %309, i64 3
%311 = load double, double* %310
%312 = load double, double* %25
%313 = load double, double* %32
%314 = fmul double %312, %313
%315 = load double*, double** %12
%316 = getelementptr inbounds double, double* %315, i64 4
%317 = load double, double* %316
%318 = call double @llvm.fmuladd.f64(double %311, double %314, double %317)
store double %318, double* %316
%319 = load double*, double** %11
%320 = getelementptr inbounds double, double* %319, i64 5
%321 = load double, double* %320
%322 = load double, double* %25
%323 = load double, double* %33
%324 = fmul double %322, %323
%325 = load double*, double** %12
%326 = getelementptr inbounds double, double* %325, i64 4
%327 = load double, double* %326
%328 = call double @llvm.fmuladd.f64(double %321, double %324, double %327)
store double %328, double* %326
%329 = load double*, double** %11
%330 = getelementptr inbounds double, double* %329, i64 4
%331 = load double, double* %330
%332 = load double, double* %25
%333 = load double, double* %33
%334 = fmul double %332, %333
%335 = load double*, double** %12
%336 = getelementptr inbounds double, double* %335, i64 5
%337 = load double, double* %336
%338 = call double @llvm.fmuladd.f64(double %331, double %334, double %337)
store double %338, double* %336
%339 = load double*, double** %11
%340 = getelementptr inbounds double, double* %339, i64 3
%341 = load double, double* %340
%342 = load double, double* %25
%343 = load double, double* %34
%344 = fmul double %342, %343
%345 = load double*, double** %12
%346 = getelementptr inbounds double, double* %345, i64 5
%347 = load double, double* %346
%348 = call double @llvm.fmuladd.f64(double %341, double %344, double %347)
store double %348, double* %346
%349 = load double*, double** %11
%350 = getelementptr inbounds double, double* %349, i64 5
%351 = load double, double* %350
%352 = load double, double* %25
%353 = load double, double* %34
%354 = fmul double %352, %353
%355 = load double*, double** %12
%356 = getelementptr inbounds double, double* %355, i64 3
%357 = load double, double* %356
%358 = call double @llvm.fmuladd.f64(double %351, double %354, double %357)
store double %358, double* %356
ret void
}

LLVM IR (-O2):
define void @matrix_ft_self_atimes(double* nocapture %0, double* nocapture %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9) {
%11 = fsub double %5, %6
%12 = fsub double %8, %9
%13 = fmul double %2, %2
%14 = fmul double %3, %3
%15 = fmul double %4, %4
%16 = fmul double %2, %3
%17 = fmul double %3, %4
%18 = fmul double %2, %4
%19 = fmul double %2, %7
%20 = fmul double %3, %7
%21 = fmul double %4, %7
%22 = load double, double* %0
%23 = tail call double @llvm.fmuladd.f64(double %11, double %13, double %6)
%24 = load double, double* %1
%25 = tail call double @llvm.fmuladd.f64(double %22, double %23, double %24)
store double %25, double* %1
%26 = getelementptr inbounds double, double* %0, i64 1
%27 = load double, double* %26
%28 = tail call double @llvm.fmuladd.f64(double %11, double %14, double %6)
%29 = getelementptr inbounds double, double* %1, i64 1
%30 = load double, double* %29
%31 = tail call double @llvm.fmuladd.f64(double %27, double %28, double %30)
store double %31, double* %29
%32 = getelementptr inbounds double, double* %0, i64 2
%33 = load double, double* %32
%34 = tail call double @llvm.fmuladd.f64(double %11, double %15, double %6)
%35 = getelementptr inbounds double, double* %1, i64 2
%36 = load double, double* %35
%37 = tail call double @llvm.fmuladd.f64(double %33, double %34, double %36)
store double %37, double* %35
%38 = load double, double* %26
%39 = fmul double %16, %11
%40 = tail call double @llvm.fmuladd.f64(double %38, double %39, double %25)
store double %40, double* %1
%41 = load double, double* %0
%42 = tail call double @llvm.fmuladd.f64(double %41, double %39, double %31)
store double %42, double* %29
%43 = load double, double* %32
%44 = fmul double %17, %11
%45 = tail call double @llvm.fmuladd.f64(double %43, double %44, double %42)
store double %45, double* %29
%46 = load double, double* %26
%47 = tail call double @llvm.fmuladd.f64(double %46, double %44, double %37)
store double %47, double* %35
%48 = load double, double* %0
%49 = fmul double %18, %11
%50 = tail call double @llvm.fmuladd.f64(double %48, double %49, double %47)
store double %50, double* %35
%51 = load double, double* %32
%52 = tail call double @llvm.fmuladd.f64(double %51, double %49, double %40)
store double %52, double* %1
%53 = load double, double* %26
%54 = getelementptr inbounds double, double* %1, i64 3
%55 = load double, double* %54
%56 = tail call double @llvm.fmuladd.f64(double %53, double %21, double %55)
store double %56, double* %54
%57 = load double, double* %32
%58 = fneg double %20
%59 = tail call double @llvm.fmuladd.f64(double %57, double %58, double %56)
store double %59, double* %54
%60 = load double, double* %0
%61 = fneg double %21
%62 = getelementptr inbounds double, double* %1, i64 4
%63 = load double, double* %62
%64 = tail call double @llvm.fmuladd.f64(double %60, double %61, double %63)
store double %64, double* %62
%65 = load double, double* %32
%66 = tail call double @llvm.fmuladd.f64(double %65, double %19, double %64)
store double %66, double* %62
%67 = load double, double* %0
%68 = getelementptr inbounds double, double* %1, i64 5
%69 = load double, double* %68
%70 = tail call double @llvm.fmuladd.f64(double %67, double %20, double %69)
store double %70, double* %68
%71 = load double, double* %26
%72 = fneg double %19
%73 = tail call double @llvm.fmuladd.f64(double %71, double %72, double %70)
store double %73, double* %68
%74 = getelementptr inbounds double, double* %0, i64 3
%75 = load double, double* %74
%76 = tail call double @llvm.fmuladd.f64(double %75, double %21, double %45)
store double %76, double* %29
%77 = load double, double* %74
%78 = tail call double @llvm.fmuladd.f64(double %77, double %58, double %50)
store double %78, double* %35
%79 = getelementptr inbounds double, double* %0, i64 4
%80 = load double, double* %79
%81 = tail call double @llvm.fmuladd.f64(double %80, double %61, double %52)
store double %81, double* %1
%82 = load double, double* %79
%83 = tail call double @llvm.fmuladd.f64(double %82, double %19, double %78)
store double %83, double* %35
%84 = getelementptr inbounds double, double* %0, i64 5
%85 = load double, double* %84
%86 = tail call double @llvm.fmuladd.f64(double %85, double %20, double %81)
store double %86, double* %1
%87 = load double, double* %84
%88 = tail call double @llvm.fmuladd.f64(double %87, double %72, double %76)
store double %88, double* %29
%89 = load double, double* %74
%90 = tail call double @llvm.fmuladd.f64(double %12, double %13, double %9)
%91 = tail call double @llvm.fmuladd.f64(double %89, double %90, double %59)
store double %91, double* %54
%92 = load double, double* %79
%93 = tail call double @llvm.fmuladd.f64(double %12, double %14, double %9)
%94 = tail call double @llvm.fmuladd.f64(double %92, double %93, double %66)
store double %94, double* %62
%95 = load double, double* %84
%96 = tail call double @llvm.fmuladd.f64(double %12, double %15, double %9)
%97 = tail call double @llvm.fmuladd.f64(double %95, double %96, double %73)
store double %97, double* %68
%98 = load double, double* %79
%99 = fmul double %16, %12
%100 = tail call double @llvm.fmuladd.f64(double %98, double %99, double %91)
store double %100, double* %54
%101 = load double, double* %74
%102 = tail call double @llvm.fmuladd.f64(double %101, double %99, double %94)
store double %102, double* %62
%103 = load double, double* %84
%104 = fmul double %17, %12
%105 = tail call double @llvm.fmuladd.f64(double %103, double %104, double %102)
store double %105, double* %62
%106 = load double, double* %79
%107 = tail call double @llvm.fmuladd.f64(double %106, double %104, double %97)
store double %107, double* %68
%108 = load double, double* %74
%109 = fmul double %18, %12
%110 = tail call double @llvm.fmuladd.f64(double %108, double %109, double %107)
store double %110, double* %68
%111 = load double, double* %84
%112 = tail call double @llvm.fmuladd.f64(double %111, double %109, double %100)
store double %112, double* %54
ret void
}