double compute_variance(unsigned char *im, int stride, int x, int y,
                        double *mean) {
  double sum = 0.0;
  double sumsq = 0.0;
  double var;
  int i, j;
  for (i = 0; i < 15; ++i)
    for (j = 0; j < 15; ++j) {
      sum += im[(i + y - ((15 - 1) / 2)) * stride + (j + x - ((15 - 1) / 2))];
      sumsq +=
          im[(i + y - ((15 - 1) / 2)) * stride + (j + x - ((15 - 1) / 2))] *
          im[(i + y - ((15 - 1) / 2)) * stride + (j + x - ((15 - 1) / 2))];
    }
  var = (sumsq * (15 * 15) - sum * sum) / ((15 * 15) * (15 * 15));
  if (mean)
    *mean = sum / (15 * 15);
  return var;
}


x86 assembly (clang, -O0):
<compute_variance>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0xf,-0x3c(%rbp)
jge    11f0 <compute_variance+0xf0>
movl   $0x0,-0x40(%rbp)
cmpl   $0xf,-0x40(%rbp)
jge    11dd <compute_variance+0xdd>
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    -0x14(%rbp),%ecx
sub    $0x7,%ecx
imul   -0xc(%rbp),%ecx
mov    -0x40(%rbp),%edx
add    -0x10(%rbp),%edx
sub    $0x7,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    -0x14(%rbp),%ecx
sub    $0x7,%ecx
imul   -0xc(%rbp),%ecx
mov    -0x40(%rbp),%edx
add    -0x10(%rbp),%edx
sub    $0x7,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x8(%rbp),%rcx
mov    -0x3c(%rbp),%edx
add    -0x14(%rbp),%edx
sub    $0x7,%edx
imul   -0xc(%rbp),%edx
mov    -0x40(%rbp),%esi
add    -0x10(%rbp),%esi
sub    $0x7,%esi
add    %esi,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
imul   %ecx,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    113d <compute_variance+0x3d>
jmp    11e2 <compute_variance+0xe2>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    112c <compute_variance+0x2c>
movsd  -0x30(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xdea(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xdd2(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
cmpq   $0x0,-0x20(%rbp)
je     125b <compute_variance+0x15b>
movsd  -0x28(%rbp),%xmm0
movsd  0xdb9(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x38(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<compute_variance>:
push   %rbx
add    $0xfffffff9,%ecx
imul   %esi,%ecx
add    %edx,%ecx
xorpd  %xmm0,%xmm0
mov    $0xf,%r9d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    -0x7(%rcx),%edx
movslq %edx,%rdx
movzbl (%rdi,%rdx,1),%r11d
xorps  %xmm1,%xmm1
cvtsi2sd %r11d,%xmm1
lea    -0x6(%rcx),%eax
cltq
movzbl (%rdi,%rax,1),%ebx
imul   %r11d,%r11d
xorps  %xmm6,%xmm6
cvtsi2sd %ebx,%xmm6
lea    -0x5(%rcx),%r10d
imul   %ebx,%ebx
movslq %r10d,%rdx
movzbl (%rdi,%rdx,1),%edx
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
imul   %edx,%edx
lea    -0x4(%rcx),%r10d
xorps  %xmm3,%xmm3
cvtsi2sd %r11d,%xmm3
movslq %r10d,%rax
movzbl (%rdi,%rax,1),%eax
xorps  %xmm5,%xmm5
cvtsi2sd %ebx,%xmm5
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
xorps  %xmm7,%xmm7
cvtsi2sd %edx,%xmm7
imul   %eax,%eax
xorps  %xmm8,%xmm8
cvtsi2sd %eax,%xmm8
lea    -0x3(%rcx),%eax
cltq
unpcklpd %xmm3,%xmm1
movzbl (%rdi,%rax,1),%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
addpd  %xmm0,%xmm1
unpcklpd %xmm5,%xmm6
lea    -0x2(%rcx),%edx
movslq %edx,%rdx
unpcklpd %xmm7,%xmm2
movzbl (%rdi,%rdx,1),%edx
xorps  %xmm5,%xmm5
cvtsi2sd %edx,%xmm5
addpd  %xmm1,%xmm6
imul   %eax,%eax
imul   %edx,%edx
lea    -0x1(%rcx),%ebx
addpd  %xmm6,%xmm2
movslq %ebx,%rbx
movzbl (%rdi,%rbx,1),%ebx
xorps  %xmm7,%xmm7
cvtsi2sd %eax,%xmm7
xorps  %xmm1,%xmm1
cvtsi2sd %ebx,%xmm1
imul   %ebx,%ebx
unpcklpd %xmm8,%xmm4
movslq %ecx,%rcx
movzbl (%rdi,%rcx,1),%eax
xorps  %xmm6,%xmm6
cvtsi2sd %edx,%xmm6
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
xorps  %xmm8,%xmm8
cvtsi2sd %ebx,%xmm8
addpd  %xmm2,%xmm4
lea    0x1(%rcx),%edx
movslq %edx,%rdx
unpcklpd %xmm7,%xmm3
movzbl (%rdi,%rdx,1),%edx
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
addpd  %xmm4,%xmm3
imul   %eax,%eax
imul   %edx,%edx
lea    0x2(%rcx),%ebx
unpcklpd %xmm6,%xmm5
movslq %ebx,%rbx
movzbl (%rdi,%rbx,1),%ebx
xorps  %xmm6,%xmm6
cvtsi2sd %eax,%xmm6
xorps  %xmm4,%xmm4
cvtsi2sd %ebx,%xmm4
cvtsi2sd %edx,%xmm9
addpd  %xmm3,%xmm5
lea    0x3(%rcx),%eax
cltq
unpcklpd %xmm8,%xmm1
movzbl (%rdi,%rax,1),%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
addpd  %xmm5,%xmm1
imul   %ebx,%ebx
imul   %eax,%eax
lea    0x4(%rcx),%edx
unpcklpd %xmm6,%xmm0
movslq %edx,%rdx
movzbl (%rdi,%rdx,1),%edx
xorps  %xmm6,%xmm6
cvtsi2sd %ebx,%xmm6
xorps  %xmm5,%xmm5
cvtsi2sd %edx,%xmm5
xorps  %xmm7,%xmm7
cvtsi2sd %eax,%xmm7
imul   %edx,%edx
xorps  %xmm8,%xmm8
cvtsi2sd %edx,%xmm8
addpd  %xmm1,%xmm0
unpcklpd %xmm9,%xmm2
lea    0x5(%rcx),%eax
cltq
unpcklpd %xmm6,%xmm4
movzbl (%rdi,%rax,1),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
unpcklpd %xmm7,%xmm3
imul   %eax,%eax
xorps  %xmm6,%xmm6
cvtsi2sd %eax,%xmm6
addpd  %xmm0,%xmm2
unpcklpd %xmm8,%xmm5
lea    0x6(%rcx),%eax
cltq
unpcklpd %xmm6,%xmm1
movzbl (%rdi,%rax,1),%eax
xorps  %xmm6,%xmm6
cvtsi2sd %eax,%xmm6
addpd  %xmm2,%xmm4
imul   %eax,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
addpd  %xmm4,%xmm3
unpcklpd %xmm0,%xmm6
lea    0x7(%rcx),%eax
cltq
addpd  %xmm3,%xmm5
movzbl (%rdi,%rax,1),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
addpd  %xmm5,%xmm1
imul   %eax,%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
addpd  %xmm1,%xmm6
unpcklpd %xmm2,%xmm0
addpd  %xmm6,%xmm0
add    %esi,%ecx
add    $0xffffffffffffffff,%r9
jne    1120 <compute_variance+0x20>
test   %r8,%r8
je     1354 <compute_variance+0x254>
movapd %xmm0,%xmm1
divsd  0xcb1(%rip),%xmm1
movsd  %xmm1,(%r8)
movapd %xmm0,%xmm1
unpckhpd %xmm0,%xmm0
mulsd  0xc9c(%rip),%xmm0
mulsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
divsd  0xc94(%rip),%xmm0
pop    %rbx
ret

LLVM IR (-O0):
define double @compute_variance(i8* %0, i32 %1, i32 %2, i32 %3, double* %4) {
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca double*
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca i32
%15 = alloca i32
store i8* %0, i8** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store double* %4, double** %10
store double 0.000000e+00, double* %11
store double 0.000000e+00, double* %12
store i32 0, i32* %14
br label %16
16: ; preds = %83, %5
%17 = load i32, i32* %14
%18 = icmp slt i32 %17, 15
br i1 %18, label %19, label %86
19: ; preds = %16
store i32 0, i32* %15
br label %20
20: ; preds = %79, %19
%21 = load i32, i32* %15
%22 = icmp slt i32 %21, 15
br i1 %22, label %23, label %82
23: ; preds = %20
%24 = load i8*, i8** %6
%25 = load i32, i32* %14
%26 = load i32, i32* %9
%27 = add nsw i32 %25, %26
%28 = sub nsw i32 %27, 7
%29 = load i32, i32* %7
%30 = mul nsw i32 %28, %29
%31 = load i32, i32* %15
%32 = load i32, i32* %8
%33 = add nsw i32 %31, %32
%34 = sub nsw i32 %33, 7
%35 = add nsw i32 %30, %34
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %24, i64 %36
%38 = load i8, i8* %37
%39 = zext i8 %38 to i32
%40 = sitofp i32 %39 to double
%41 = load double, double* %11
%42 = fadd double %41, %40
store double %42, double* %11
%43 = load i8*, i8** %6
%44 = load i32, i32* %14
%45 = load i32, i32* %9
%46 = add nsw i32 %44, %45
%47 = sub nsw i32 %46, 7
%48 = load i32, i32* %7
%49 = mul nsw i32 %47, %48
%50 = load i32, i32* %15
%51 = load i32, i32* %8
%52 = add nsw i32 %50, %51
%53 = sub nsw i32 %52, 7
%54 = add nsw i32 %49, %53
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i8, i8* %43, i64 %55
%57 = load i8, i8* %56
%58 = zext i8 %57 to i32
%59 = load i8*, i8** %6
%60 = load i32, i32* %14
%61 = load i32, i32* %9
%62 = add nsw i32 %60, %61
%63 = sub nsw i32 %62, 7
%64 = load i32, i32* %7
%65 = mul nsw i32 %63, %64
%66 = load i32, i32* %15
%67 = load i32, i32* %8
%68 = add nsw i32 %66, %67
%69 = sub nsw i32 %68, 7
%70 = add nsw i32 %65, %69
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i8, i8* %59, i64 %71
%73 = load i8, i8* %72
%74 = zext i8 %73 to i32
%75 = mul nsw i32 %58, %74
%76 = sitofp i32 %75 to double
%77 = load double, double* %12
%78 = fadd double %77, %76
store double %78, double* %12
br label %79
79: ; preds = %23
%80 = load i32, i32* %15
%81 = add nsw i32 %80, 1
store i32 %81, i32* %15
br label %20
82: ; preds = %20
br label %83
83: ; preds = %82
%84 = load i32, i32* %14
%85 = add nsw i32 %84, 1
store i32 %85, i32* %14
br label %16
86: ; preds = %16
%87 = load double, double* %12
%88 = load double, double* %11
%89 = load double, double* %11
%90 = fmul double %88, %89
%91 = fneg double %90
%92 = call double @llvm.fmuladd.f64(double %87, double 2.250000e+02, double %91)
%93 = fdiv double %92, 5.062500e+04
store double %93, double* %13
%94 = load double*, double** %10
%95 = icmp ne double* %94, null
br i1 %95, label %96, label %100
96: ; preds = %86
%97 = load double, double* %11
%98 = fdiv double %97, 2.250000e+02
%99 = load double*, double** %10
store double %98, double* %99
br label %100
100: ; preds = %96, %86
%101 = load double, double* %13
ret double %101
}

LLVM IR (-O2):
define double @compute_variance(i8* nocapture %0, i32 %1, i32 %2, i32 %3, double* writeonly %4) {
%6 = add i32 %3, -7
%7 = add i32 %2, -7
br label %8
8: ; preds = %5, %8
%9 = phi i64 [ 0, %5 ], [ %179, %8 ]
%10 = phi <2 x double> [ zeroinitializer, %5 ], [ %178, %8 ]
%11 = trunc i64 %9 to i32
%12 = add i32 %6, %11
%13 = mul nsw i32 %12, %1
%14 = add i32 %7, %13
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i8, i8* %0, i64 %15
%17 = load i8, i8* %16
%18 = zext i8 %17 to i32
%19 = uitofp i8 %17 to double
%20 = mul nuw nsw i32 %18, %18
%21 = sitofp i32 %20 to double
%22 = insertelement <2 x double> poison, double %19, i64 0
%23 = insertelement <2 x double> %22, double %21, i64 1
%24 = fadd <2 x double> %10, %23
%25 = add i32 %14, 1
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %0, i64 %26
%28 = load i8, i8* %27
%29 = zext i8 %28 to i32
%30 = uitofp i8 %28 to double
%31 = mul nuw nsw i32 %29, %29
%32 = sitofp i32 %31 to double
%33 = insertelement <2 x double> poison, double %30, i64 0
%34 = insertelement <2 x double> %33, double %32, i64 1
%35 = fadd <2 x double> %24, %34
%36 = add i32 %14, 2
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i8, i8* %0, i64 %37
%39 = load i8, i8* %38
%40 = zext i8 %39 to i32
%41 = uitofp i8 %39 to double
%42 = mul nuw nsw i32 %40, %40
%43 = sitofp i32 %42 to double
%44 = insertelement <2 x double> poison, double %41, i64 0
%45 = insertelement <2 x double> %44, double %43, i64 1
%46 = fadd <2 x double> %35, %45
%47 = add i32 %14, 3
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %0, i64 %48
%50 = load i8, i8* %49
%51 = zext i8 %50 to i32
%52 = uitofp i8 %50 to double
%53 = mul nuw nsw i32 %51, %51
%54 = sitofp i32 %53 to double
%55 = insertelement <2 x double> poison, double %52, i64 0
%56 = insertelement <2 x double> %55, double %54, i64 1
%57 = fadd <2 x double> %46, %56
%58 = add i32 %14, 4
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8, i8* %0, i64 %59
%61 = load i8, i8* %60
%62 = zext i8 %61 to i32
%63 = uitofp i8 %61 to double
%64 = mul nuw nsw i32 %62, %62
%65 = sitofp i32 %64 to double
%66 = insertelement <2 x double> poison, double %63, i64 0
%67 = insertelement <2 x double> %66, double %65, i64 1
%68 = fadd <2 x double> %57, %67
%69 = add i32 %14, 5
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds i8, i8* %0, i64 %70
%72 = load i8, i8* %71
%73 = zext i8 %72 to i32
%74 = uitofp i8 %72 to double
%75 = mul nuw nsw i32 %73, %73
%76 = sitofp i32 %75 to double
%77 = insertelement <2 x double> poison, double %74, i64 0
%78 = insertelement <2 x double> %77, double %76, i64 1
%79 = fadd <2 x double> %68, %78
%80 = add i32 %14, 6
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i8, i8* %0, i64 %81
%83 = load i8, i8* %82
%84 = zext i8 %83 to i32
%85 = uitofp i8 %83 to double
%86 = mul nuw nsw i32 %84, %84
%87 = sitofp i32 %86 to double
%88 = insertelement <2 x double> poison, double %85, i64 0
%89 = insertelement <2 x double> %88, double %87, i64 1
%90 = fadd <2 x double> %79, %89
%91 = add i32 %13, %2
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds i8, i8* %0, i64 %92
%94 = load i8, i8* %93
%95 = zext i8 %94 to i32
%96 = uitofp i8 %94 to double
%97 = mul nuw nsw i32 %95, %95
%98 = sitofp i32 %97 to double
%99 = insertelement <2 x double> poison, double %96, i64 0
%100 = insertelement <2 x double> %99, double %98, i64 1
%101 = fadd <2 x double> %90, %100
%102 = add i32 %14, 8
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8, i8* %0, i64 %103
%105 = load i8, i8* %104
%106 = zext i8 %105 to i32
%107 = uitofp i8 %105 to double
%108 = mul nuw nsw i32 %106, %106
%109 = sitofp i32 %108 to double
%110 = insertelement <2 x double> poison, double %107, i64 0
%111 = insertelement <2 x double> %110, double %109, i64 1
%112 = fadd <2 x double> %101, %111
%113 = add i32 %14, 9
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds i8, i8* %0, i64 %114
%116 = load i8, i8* %115
%117 = zext i8 %116 to i32
%118 = uitofp i8 %116 to double
%119 = mul nuw nsw i32 %117, %117
%120 = sitofp i32 %119 to double
%121 = insertelement <2 x double> poison, double %118, i64 0
%122 = insertelement <2 x double> %121, double %120, i64 1
%123 = fadd <2 x double> %112, %122
%124 = add i32 %14, 10
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds i8, i8* %0, i64 %125
%127 = load i8, i8* %126
%128 = zext i8 %127 to i32
%129 = uitofp i8 %127 to double
%130 = mul nuw nsw i32 %128, %128
%131 = sitofp i32 %130 to double
%132 = insertelement <2 x double> poison, double %129, i64 0
%133 = insertelement <2 x double> %132, double %131, i64 1
%134 = fadd <2 x double> %123, %133
%135 = add i32 %14, 11
%136 = sext i32 %135 to i64
%137 = getelementptr inbounds i8, i8* %0, i64 %136
%138 = load i8, i8* %137
%139 = zext i8 %138 to i32
%140 = uitofp i8 %138 to double
%141 = mul nuw nsw i32 %139, %139
%142 = sitofp i32 %141 to double
%143 = insertelement <2 x double> poison, double %140, i64 0
%144 = insertelement <2 x double> %143, double %142, i64 1
%145 = fadd <2 x double> %134, %144
%146 = add i32 %14, 12
%147 = sext i32 %146 to i64
%148 = getelementptr inbounds i8, i8* %0, i64 %147
%149 = load i8, i8* %148
%150 = zext i8 %149 to i32
%151 = uitofp i8 %149 to double
%152 = mul nuw nsw i32 %150, %150
%153 = sitofp i32 %152 to double
%154 = insertelement <2 x double> poison, double %151, i64 0
%155 = insertelement <2 x double> %154, double %153, i64 1
%156 = fadd <2 x double> %145, %155
%157 = add i32 %14, 13
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds i8, i8* %0, i64 %158
%160 = load i8, i8* %159
%161 = zext i8 %160 to i32
%162 = uitofp i8 %160 to double
%163 = mul nuw nsw i32 %161, %161
%164 = sitofp i32 %163 to double
%165 = insertelement <2 x double> poison, double %162, i64 0
%166 = insertelement <2 x double> %165, double %164, i64 1
%167 = fadd <2 x double> %156, %166
%168 = add i32 %14, 14
%169 = sext i32 %168 to i64
%170 = getelementptr inbounds i8, i8* %0, i64 %169
%171 = load i8, i8* %170
%172 = zext i8 %171 to i32
%173 = uitofp i8 %171 to double
%174 = mul nuw nsw i32 %172, %172
%175 = sitofp i32 %174 to double
%176 = insertelement <2 x double> poison, double %173, i64 0
%177 = insertelement <2 x double> %176, double %175, i64 1
%178 = fadd <2 x double> %167, %177
%179 = add nuw nsw i64 %9, 1
%180 = icmp eq i64 %179, 15
br i1 %180, label %181, label %8
181: ; preds = %8
%182 = icmp eq double* %4, null
br i1 %182, label %186, label %183
183: ; preds = %181
%184 = extractelement <2 x double> %178, i64 0
%185 = fdiv double %184, 2.250000e+02
store double %185, double* %4
br label %186
186: ; preds = %183, %181
%187 = extractelement <2 x double> %178, i64 0
%188 = fneg double %187
%189 = fmul double %187, %188
%190 = extractelement <2 x double> %178, i64 1
%191 = tail call double @llvm.fmuladd.f64(double %190, double 2.250000e+02, double %189)
%192 = fdiv double %191, 5.062500e+04
ret double %192
}