double compactness(const double *x, const double *pr, const double eps,
                   const int nx, const int ny, const double flux) {
  register int i, j;
  double reg = 0.0;
  for (j = 0; j < ny; ++j) {
    for (i = 0; i < nx; ++i) {
      reg += ((i - 0.5 * (nx - 1)) * (i - 0.5 * (nx - 1)) +
              (j - 0.5 * (ny - 1)) * (j - 0.5 * (ny - 1))) /
             (nx * ny) * x[i + nx * j];
    }
  }
  return reg;
}


x86 assembly (clang, -O0):
<compactness>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
movsd  %xmm1,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    122c <compactness+0x12c>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1219 <compactness+0x119>
cvtsi2sdl -0x2c(%rbp),%xmm1
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm0
movsd  0xe9f(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsi2sdl -0x2c(%rbp),%xmm1
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm2
movsd  0xe80(%rip),%xmm3
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
cvtsi2sdl -0x30(%rbp),%xmm3
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm1
movsd  0xe61(%rip),%xmm4
mulsd  %xmm4,%xmm1
addsd  %xmm3,%xmm1
cvtsi2sdl -0x30(%rbp),%xmm4
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm3
movsd  0xe42(%rip),%xmm5
mulsd  %xmm5,%xmm3
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x1c(%rbp),%eax
imul   -0x20(%rbp),%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    -0x1c(%rbp),%edx
imul   -0x30(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    113e <compactness+0x3e>
jmp    121e <compactness+0x11e>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    112b <compactness+0x2b>
movsd  -0x38(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<compactness>:
test   %ecx,%ecx
jle    11ac <compactness+0xac>
lea    -0x1(%rdx),%eax
cvtsi2sd %eax,%xmm1
lea    -0x1(%rcx),%eax
cvtsi2sd %eax,%xmm2
mov    %ecx,%r8d
imul   %edx,%ecx
cvtsi2sd %ecx,%xmm3
movslq %edx,%r9
mov    %r9d,%esi
shl    $0x3,%r9
xorpd  %xmm0,%xmm0
xor    %eax,%eax
mulsd  0xec8(%rip),%xmm2
mulsd  0xec0(%rip),%xmm1
jmp    115c <compactness+0x5c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%rax
add    %r9,%rdi
cmp    %r8,%rax
je     11ab <compactness+0xab>
test   %edx,%edx
jle    1150 <compactness+0x50>
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
addsd  %xmm2,%xmm4
mulsd  %xmm4,%xmm4
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorps  %xmm5,%xmm5
cvtsi2sd %ecx,%xmm5
addsd  %xmm1,%xmm5
mulsd  %xmm5,%xmm5
addsd  %xmm4,%xmm5
divsd  %xmm3,%xmm5
mulsd  (%rdi,%rcx,8),%xmm5
addsd  %xmm5,%xmm0
add    $0x1,%rcx
cmp    %rcx,%rsi
jne    1180 <compactness+0x80>
jmp    1150 <compactness+0x50>
ret
xorps  %xmm0,%xmm0
ret

LLVM IR (-O0):
define double @compactness(double* %0, double* %1, double %2, i32 %3, i32 %4, double %5) {
%7 = alloca double*
%8 = alloca double*
%9 = alloca double
%10 = alloca i32
%11 = alloca i32
%12 = alloca double
%13 = alloca i32
%14 = alloca i32
%15 = alloca double
store double* %0, double** %7
store double* %1, double** %8
store double %2, double* %9
store i32 %3, i32* %10
store i32 %4, i32* %11
store double %5, double* %12
store double 0.000000e+00, double* %15
store i32 0, i32* %14
br label %16
16: ; preds = %72, %6
%17 = load i32, i32* %14
%18 = load i32, i32* %11
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %75
20: ; preds = %16
store i32 0, i32* %13
br label %21
21: ; preds = %68, %20
%22 = load i32, i32* %13
%23 = load i32, i32* %10
%24 = icmp slt i32 %22, %23
br i1 %24, label %25, label %71
25: ; preds = %21
%26 = load i32, i32* %13
%27 = sitofp i32 %26 to double
%28 = load i32, i32* %10
%29 = sub nsw i32 %28, 1
%30 = sitofp i32 %29 to double
%31 = call double @llvm.fmuladd.f64(double -5.000000e-01, double %30, double %27)
%32 = load i32, i32* %13
%33 = sitofp i32 %32 to double
%34 = load i32, i32* %10
%35 = sub nsw i32 %34, 1
%36 = sitofp i32 %35 to double
%37 = call double @llvm.fmuladd.f64(double -5.000000e-01, double %36, double %33)
%38 = load i32, i32* %14
%39 = sitofp i32 %38 to double
%40 = load i32, i32* %11
%41 = sub nsw i32 %40, 1
%42 = sitofp i32 %41 to double
%43 = call double @llvm.fmuladd.f64(double -5.000000e-01, double %42, double %39)
%44 = load i32, i32* %14
%45 = sitofp i32 %44 to double
%46 = load i32, i32* %11
%47 = sub nsw i32 %46, 1
%48 = sitofp i32 %47 to double
%49 = call double @llvm.fmuladd.f64(double -5.000000e-01, double %48, double %45)
%50 = fmul double %43, %49
%51 = call double @llvm.fmuladd.f64(double %31, double %37, double %50)
%52 = load i32, i32* %10
%53 = load i32, i32* %11
%54 = mul nsw i32 %52, %53
%55 = sitofp i32 %54 to double
%56 = fdiv double %51, %55
%57 = load double*, double** %7
%58 = load i32, i32* %13
%59 = load i32, i32* %10
%60 = load i32, i32* %14
%61 = mul nsw i32 %59, %60
%62 = add nsw i32 %58, %61
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds double, double* %57, i64 %63
%65 = load double, double* %64
%66 = load double, double* %15
%67 = call double @llvm.fmuladd.f64(double %56, double %65, double %66)
store double %67, double* %15
br label %68
68: ; preds = %25
%69 = load i32, i32* %13
%70 = add nsw i32 %69, 1
store i32 %70, i32* %13
br label %21
71: ; preds = %21
br label %72
72: ; preds = %71
%73 = load i32, i32* %14
%74 = add nsw i32 %73, 1
store i32 %74, i32* %14
br label %16
75: ; preds = %16
%76 = load double, double* %15
ret double %76
}

LLVM IR (-O2):
define double @compactness(double* nocapture %0, double* nocapture readnone %1, double %2, i32 %3, i32 %4, double %5) {
%7 = icmp sgt i32 %4, 0
br i1 %7, label %8, label %46
8: ; preds = %6
%9 = icmp sgt i32 %3, 0
%10 = add nsw i32 %3, -1
%11 = sitofp i32 %10 to double
%12 = add nsw i32 %4, -1
%13 = sitofp i32 %12 to double
%14 = mul nsw i32 %4, %3
%15 = sitofp i32 %14 to double
%16 = sext i32 %3 to i64
%17 = zext i32 %4 to i64
%18 = zext i32 %3 to i64
br label %19
19: ; preds = %8, %42
%20 = phi i64 [ 0, %8 ], [ %44, %42 ]
%21 = phi double [ 0.000000e+00, %8 ], [ %43, %42 ]
br i1 %9, label %22, label %42
22: ; preds = %19
%23 = trunc i64 %20 to i32
%24 = sitofp i32 %23 to double
%25 = tail call double @llvm.fmuladd.f64(double %13, double -5.000000e-01, double %24)
%26 = fmul double %25, %25
%27 = mul nsw i64 %20, %16
br label %28
28: ; preds = %22, %28
%29 = phi i64 [ 0, %22 ], [ %40, %28 ]
%30 = phi double [ %21, %22 ], [ %39, %28 ]
%31 = trunc i64 %29 to i32
%32 = sitofp i32 %31 to double
%33 = tail call double @llvm.fmuladd.f64(double %11, double -5.000000e-01, double %32)
%34 = tail call double @llvm.fmuladd.f64(double %33, double %33, double %26)
%35 = fdiv double %34, %15
%36 = add nsw i64 %29, %27
%37 = getelementptr inbounds double, double* %0, i64 %36
%38 = load double, double* %37
%39 = tail call double @llvm.fmuladd.f64(double %35, double %38, double %30)
%40 = add nuw nsw i64 %29, 1
%41 = icmp eq i64 %40, %18
br i1 %41, label %42, label %28
42: ; preds = %28, %19
%43 = phi double [ %21, %19 ], [ %39, %28 ]
%44 = add nuw nsw i64 %20, 1
%45 = icmp eq i64 %44, %17
br i1 %45, label %46, label %19
46: ; preds = %42, %6
%47 = phi double [ 0.000000e+00, %6 ], [ %43, %42 ]
ret double %47
}