double tss_m(double *x, int stride, int n, double m) {
  double tss = 0.0;
  int i;
  for (i = 0; i < n; i += stride)
    tss += (x[i] - m) * (x[i] - m);
  return tss;
}


x86 assembly (clang, -O0):
<tss_m>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1172 <tss_m+0x72>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
subsd  -0x18(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1122 <tss_m+0x22>
movsd  -0x20(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<tss_m>:
test   %edx,%edx
jle    112e <tss_m+0x2e>
movslq %esi,%rax
mov    %edx,%ecx
xorpd  %xmm1,%xmm1
xor    %edx,%edx
nop
movsd  (%rdi,%rdx,8),%xmm2
subsd  %xmm0,%xmm2
mulsd  %xmm2,%xmm2
addsd  %xmm2,%xmm1
add    %rax,%rdx
cmp    %rcx,%rdx
jl     1110 <tss_m+0x10>
movapd %xmm1,%xmm0
ret
xorps  %xmm0,%xmm0
ret

LLVM IR (-O0):
define double @tss_m(double* %0, i32 %1, i32 %2, double %3) {
%5 = alloca double*
%6 = alloca i32
%7 = alloca i32
%8 = alloca double
%9 = alloca double
%10 = alloca i32
store double* %0, double** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store double %3, double* %8
store double 0.000000e+00, double* %9
store i32 0, i32* %10
br label %11
11: ; preds = %32, %4
%12 = load i32, i32* %10
%13 = load i32, i32* %7
%14 = icmp slt i32 %12, %13
br i1 %14, label %15, label %36
15: ; preds = %11
%16 = load double*, double** %5
%17 = load i32, i32* %10
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds double, double* %16, i64 %18
%20 = load double, double* %19
%21 = load double, double* %8
%22 = fsub double %20, %21
%23 = load double*, double** %5
%24 = load i32, i32* %10
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds double, double* %23, i64 %25
%27 = load double, double* %26
%28 = load double, double* %8
%29 = fsub double %27, %28
%30 = load double, double* %9
%31 = call double @llvm.fmuladd.f64(double %22, double %29, double %30)
store double %31, double* %9
br label %32
32: ; preds = %15
%33 = load i32, i32* %6
%34 = load i32, i32* %10
%35 = add nsw i32 %34, %33
store i32 %35, i32* %10
br label %11
36: ; preds = %11
%37 = load double, double* %9
ret double %37
}

LLVM IR (-O2):
define double @tss_m(double* nocapture %0, i32 %1, i32 %2, double %3) {
%5 = icmp sgt i32 %2, 0
br i1 %5, label %6, label %18
6: ; preds = %4
%7 = sext i32 %1 to i64
%8 = zext i32 %2 to i64
br label %9
9: ; preds = %6, %9
%10 = phi i64 [ 0, %6 ], [ %16, %9 ]
%11 = phi double [ 0.000000e+00, %6 ], [ %15, %9 ]
%12 = getelementptr inbounds double, double* %0, i64 %10
%13 = load double, double* %12
%14 = fsub double %13, %3
%15 = tail call double @llvm.fmuladd.f64(double %14, double %14, double %11)
%16 = add i64 %10, %7
%17 = icmp slt i64 %16, %8
br i1 %17, label %9, label %18
18: ; preds = %9, %4
%19 = phi double [ 0.000000e+00, %4 ], [ %15, %9 ]
ret double %19
}