int my_calc_center(double *g, double *center, int x_size, int y_size) {
  int x, y;
  register double n = 0, gt;
  center[0] = center[1] = 0;
  for (x = 0; x < x_size; x++)
    for (y = 0; y < y_size; y++) {
      gt = g[x * y_size + y];
      if (gt > 0) {
        center[0] += gt * x;
        center[1] += gt * y;
        n += gt;
      }
    }
  if (n != 0) {
    center[0] /= n;
    center[1] /= n;
    return 0;
  } else
    return 1;
}


x86 assembly (clang, -O0):
<my_calc_center>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11f7 <my_calc_center+0xf7>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11e4 <my_calc_center+0xe4>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x20(%rbp),%ecx
add    -0x28(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    11d1 <my_calc_center+0xd1>
movsd  -0x38(%rbp),%xmm0
cvtsi2sdl -0x24(%rbp),%xmm2
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x38(%rbp),%xmm0
cvtsi2sdl -0x28(%rbp),%xmm2
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
movsd  -0x38(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    11d6 <my_calc_center+0xd6>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    114b <my_calc_center+0x4b>
jmp    11e9 <my_calc_center+0xe9>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1138 <my_calc_center+0x38>
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1214 <my_calc_center+0x114>
jp     1214 <my_calc_center+0x114>
jmp    124c <my_calc_center+0x14c>
movsd  -0x30(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x30(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1253 <my_calc_center+0x153>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<my_calc_center>:
push   %rbp
push   %r15
push   %r14
push   %rbx
xorpd  %xmm0,%xmm0
movupd %xmm0,(%rsi)
mov    $0x1,%eax
test   %edx,%edx
jle    1235 <my_calc_center+0x135>
movslq %ecx,%r8
mov    %edx,%r10d
mov    %r8d,%r9d
mov    %r9d,%r11d
and    $0xfffffffe,%r11d
lea    0x8(%rdi),%rdx
lea    0x0(,%r8,8),%r14
xorpd  %xmm2,%xmm2
xor    %r15d,%r15d
xorpd  %xmm1,%xmm1
jmp    1160 <my_calc_center+0x60>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%r15
add    %r14,%rdx
cmp    %r10,%r15
je     121b <my_calc_center+0x11b>
test   %ecx,%ecx
jle    1150 <my_calc_center+0x50>
xorps  %xmm3,%xmm3
cvtsi2sd %r15d,%xmm3
xor    %ebx,%ebx
cmp    $0x1,%ecx
jne    11b9 <my_calc_center+0xb9>
test   $0x1,%r9b
je     1150 <my_calc_center+0x50>
mov    %r15,%rbp
imul   %r8,%rbp
add    %rbx,%rbp
movsd  (%rdi,%rbp,8),%xmm4
ucomisd %xmm2,%xmm4
jbe    1150 <my_calc_center+0x50>
xorps  %xmm5,%xmm5
cvtsi2sd %ebx,%xmm5
addsd  %xmm4,%xmm1
unpcklpd %xmm4,%xmm4
unpcklpd %xmm5,%xmm3
mulpd  %xmm4,%xmm3
addpd  %xmm3,%xmm0
movupd %xmm0,(%rsi)
jmp    1150 <my_calc_center+0x50>
nop
add    $0x2,%rbx
cmp    %rbx,%r11
je     1173 <my_calc_center+0x73>
movsd  -0x8(%rdx,%rbx,8),%xmm4
ucomisd %xmm2,%xmm4
jbe    11e8 <my_calc_center+0xe8>
xorps  %xmm5,%xmm5
cvtsi2sd %ebx,%xmm5
addsd  %xmm4,%xmm1
unpcklpd %xmm4,%xmm4
movapd %xmm3,%xmm6
unpcklpd %xmm5,%xmm6
mulpd  %xmm4,%xmm6
addpd  %xmm6,%xmm0
movupd %xmm0,(%rsi)
movsd  (%rdx,%rbx,8),%xmm4
ucomisd %xmm2,%xmm4
jbe    11b0 <my_calc_center+0xb0>
lea    0x1(%rbx),%ebp
xorps  %xmm5,%xmm5
cvtsi2sd %ebp,%xmm5
addsd  %xmm4,%xmm1
unpcklpd %xmm4,%xmm4
movapd %xmm3,%xmm6
unpcklpd %xmm5,%xmm6
mulpd  %xmm4,%xmm6
addpd  %xmm6,%xmm0
movupd %xmm0,(%rsi)
jmp    11b0 <my_calc_center+0xb0>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    1227 <my_calc_center+0x127>
jnp    1235 <my_calc_center+0x135>
unpcklpd %xmm1,%xmm1
divpd  %xmm1,%xmm0
movupd %xmm0,(%rsi)
xor    %eax,%eax
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @my_calc_center(double* nocapture %0, double* nocapture %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %2, 0
%6 = bitcast double* %1 to i8*
br i1 %5, label %7, label %98
7: ; preds = %4
%8 = icmp sgt i32 %3, 0
%9 = sext i32 %3 to i64
%10 = zext i32 %2 to i64
%11 = zext i32 %3 to i64
%12 = and i64 %11, 1
%13 = icmp eq i32 %3, 1
%14 = and i64 %11, 4294967294
%15 = bitcast double* %1 to <2 x double>*
%16 = bitcast double* %1 to <2 x double>*
%17 = icmp eq i64 %12, 0
%18 = bitcast double* %1 to <2 x double>*
br label %19
19: ; preds = %7, %86
%20 = phi i64 [ 0, %7 ], [ %89, %86 ]
%21 = phi double [ 0.000000e+00, %7 ], [ %87, %86 ]
%22 = phi <2 x double> [ zeroinitializer, %7 ], [ %88, %86 ]
br i1 %8, label %23, label %86
23: ; preds = %19
%24 = mul nsw i64 %20, %9
%25 = trunc i64 %20 to i32
%26 = sitofp i32 %25 to double
%27 = insertelement <2 x double> poison, double %26, i64 0
br i1 %13, label %67, label %28
28: ; preds = %23, %61
%29 = phi i64 [ %64, %61 ], [ 0, %23 ]
%30 = phi double [ %62, %61 ], [ %21, %23 ]
%31 = phi <2 x double> [ %63, %61 ], [ %22, %23 ]
%32 = phi i64 [ %65, %61 ], [ 0, %23 ]
%33 = add nsw i64 %29, %24
%34 = getelementptr inbounds double, double* %0, i64 %33
%35 = load double, double* %34
%36 = fcmp ogt double %35, 0.000000e+00
br i1 %36, label %37, label %45
37: ; preds = %28
%38 = trunc i64 %29 to i32
%39 = sitofp i32 %38 to double
%40 = insertelement <2 x double> poison, double %35, i64 0
%41 = shufflevector <2 x double> %40, <2 x double> poison, <2 x i32> zeroinitializer
%42 = insertelement <2 x double> %27, double %39, i64 1
%43 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %41, <2 x double> %42, <2 x double> %31)
store <2 x double> %43, <2 x double>* %15
%44 = fadd double %30, %35
br label %45
45: ; preds = %28, %37
%46 = phi double [ %44, %37 ], [ %30, %28 ]
%47 = phi <2 x double> [ %43, %37 ], [ %31, %28 ]
%48 = or i64 %29, 1
%49 = add nsw i64 %48, %24
%50 = getelementptr inbounds double, double* %0, i64 %49
%51 = load double, double* %50
%52 = fcmp ogt double %51, 0.000000e+00
br i1 %52, label %53, label %61
53: ; preds = %45
%54 = trunc i64 %48 to i32
%55 = sitofp i32 %54 to double
%56 = insertelement <2 x double> poison, double %51, i64 0
%57 = shufflevector <2 x double> %56, <2 x double> poison, <2 x i32> zeroinitializer
%58 = insertelement <2 x double> %27, double %55, i64 1
%59 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %57, <2 x double> %58, <2 x double> %47)
store <2 x double> %59, <2 x double>* %16
%60 = fadd double %46, %51
br label %61
61: ; preds = %53, %45
%62 = phi double [ %60, %53 ], [ %46, %45 ]
%63 = phi <2 x double> [ %59, %53 ], [ %47, %45 ]
%64 = add nuw nsw i64 %29, 2
%65 = add i64 %32, 2
%66 = icmp eq i64 %65, %14
br i1 %66, label %67, label %28
67: ; preds = %61, %23
%68 = phi double [ undef, %23 ], [ %62, %61 ]
%69 = phi <2 x double> [ undef, %23 ], [ %63, %61 ]
%70 = phi i64 [ 0, %23 ], [ %64, %61 ]
%71 = phi double [ %21, %23 ], [ %62, %61 ]
%72 = phi <2 x double> [ %22, %23 ], [ %63, %61 ]
br i1 %17, label %86, label %73
73: ; preds = %67
%74 = add nsw i64 %70, %24
%75 = getelementptr inbounds double, double* %0, i64 %74
%76 = load double, double* %75
%77 = fcmp ogt double %76, 0.000000e+00
br i1 %77, label %78, label %86
78: ; preds = %73
%79 = trunc i64 %70 to i32
%80 = sitofp i32 %79 to double
%81 = insertelement <2 x double> poison, double %76, i64 0
%82 = shufflevector <2 x double> %81, <2 x double> poison, <2 x i32> zeroinitializer
%83 = insertelement <2 x double> %27, double %80, i64 1
%84 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %83, <2 x double> %72)
store <2 x double> %84, <2 x double>* %18
%85 = fadd double %71, %76
br label %86
86: ; preds = %67, %78, %73, %19
%87 = phi double [ %21, %19 ], [ %68, %67 ], [ %85, %78 ], [ %71, %73 ]
%88 = phi <2 x double> [ %22, %19 ], [ %69, %67 ], [ %84, %78 ], [ %72, %73 ]
%89 = add nuw nsw i64 %20, 1
%90 = icmp eq i64 %89, %10
br i1 %90, label %91, label %19
91: ; preds = %86
%92 = fcmp une double %87, 0.000000e+00
br i1 %92, label %93, label %98
93: ; preds = %91
%94 = insertelement <2 x double> poison, double %87, i64 0
%95 = shufflevector <2 x double> %94, <2 x double> poison, <2 x i32> zeroinitializer
%96 = fdiv <2 x double> %88, %95
%97 = bitcast double* %1 to <2 x double>*
store <2 x double> %96, <2 x double>* %97
br label %98
98: ; preds = %4, %91, %93
%99 = phi i32 [ 0, %93 ], [ 1, %91 ], [ 1, %4 ]
ret i32 %99
}