void Value_block(float *Estimate, unsigned char *Label, int x, int y, int z,
                 int neighborhoodsize, float *average, double global_sum,
                 int sx, int sy, int sz) {
  int x_pos, y_pos, z_pos;
  int is_outside;
  double value = 0.0;
  unsigned char label = 0;
  double denoised_value = 0.0;
  int count = 0;
  int a, b, c, ns, sxy;
  ns = 2 * neighborhoodsize + 1;
  sxy = sx * sy;
  for (c = 0; c < ns; c++) {
    for (b = 0; b < ns; b++) {
      for (a = 0; a < ns; a++) {
        is_outside = 0;
        x_pos = x + a - neighborhoodsize;
        y_pos = y + b - neighborhoodsize;
        z_pos = z + c - neighborhoodsize;
        if ((z_pos < 0) || (z_pos > sz - 1))
          is_outside = 1;
        if ((y_pos < 0) || (y_pos > sy - 1))
          is_outside = 1;
        if ((x_pos < 0) || (x_pos > sx - 1))
          is_outside = 1;
        if (!is_outside) {
          value = (double)Estimate[z_pos * (sxy) + (y_pos * sx) + x_pos];
          value += ((double)average[count] / global_sum);
          label = Label[(x_pos + y_pos * sx + z_pos * sxy)];
          Estimate[z_pos * (sxy) + (y_pos * sx) + x_pos] = (float)value;
          Label[(x_pos + y_pos * sx + z_pos * sxy)] = label + 1;
        }
        count++;
      }
    }
  }
}


x86 assembly (clang, -O0):
<Value_block>:
push   %rbp
mov    %rsp,%rbp
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9d,-0x20(%rbp)
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movb   $0x0,-0x41(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x20(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
mov    0x18(%rbp),%eax
imul   0x20(%rbp),%eax
mov    %eax,-0x68(%rbp)
movl   $0x0,-0x60(%rbp)
mov    -0x60(%rbp),%eax
cmp    -0x64(%rbp),%eax
jge    1328 <Value_block+0x228>
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0x64(%rbp),%eax
jge    1315 <Value_block+0x215>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x64(%rbp),%eax
jge    1302 <Value_block+0x202>
movl   $0x0,-0x38(%rbp)
mov    -0x14(%rbp),%eax
add    -0x58(%rbp),%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x18(%rbp),%eax
add    -0x5c(%rbp),%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x60(%rbp),%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jl     11dc <Value_block+0xdc>
mov    -0x34(%rbp),%eax
mov    0x28(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    11e3 <Value_block+0xe3>
movl   $0x1,-0x38(%rbp)
cmpl   $0x0,-0x30(%rbp)
jl     11fe <Value_block+0xfe>
mov    -0x30(%rbp),%eax
mov    0x20(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    1205 <Value_block+0x105>
movl   $0x1,-0x38(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jl     1220 <Value_block+0x120>
mov    -0x2c(%rbp),%eax
mov    0x18(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    1227 <Value_block+0x127>
movl   $0x1,-0x38(%rbp)
cmpl   $0x0,-0x38(%rbp)
jne    12eb <Value_block+0x1eb>
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   -0x68(%rbp),%ecx
mov    -0x30(%rbp),%edx
imul   0x18(%rbp),%edx
add    %edx,%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x10(%rbp),%rax
movslq -0x54(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x28(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    -0x30(%rbp),%edx
imul   0x18(%rbp),%edx
add    %edx,%ecx
mov    -0x34(%rbp),%edx
imul   -0x68(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x41(%rbp)
movsd  -0x40(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   -0x68(%rbp),%ecx
mov    -0x30(%rbp),%edx
imul   0x18(%rbp),%edx
add    %edx,%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movzbl -0x41(%rbp),%eax
add    $0x1,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    -0x30(%rbp),%esi
imul   0x18(%rbp),%esi
add    %esi,%ecx
mov    -0x34(%rbp),%esi
imul   -0x68(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    118a <Value_block+0x8a>
jmp    1307 <Value_block+0x207>
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1177 <Value_block+0x77>
jmp    131a <Value_block+0x21a>
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    1164 <Value_block+0x64>
pop    %rbp
ret

x86 assembly (clang, -O2):
<Value_block>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r9d,%ebp
mov    %edx,-0x18(%rsp)
lea    0x1(%rbp,%rbp,1),%eax
mov    %eax,-0x1c(%rsp)
test   %eax,%eax
jle    123d <Value_block+0x13d>
mov    0x48(%rsp),%eax
mov    0x40(%rsp),%ebx
mov    0x38(%rsp),%r14
mov    %ecx,%r15d
sub    %ebp,%r15d
sub    %ebp,%r8d
mov    -0x1c(%rsp),%r11d
mov    %eax,%edx
mov    %r8d,-0x10(%rsp)
imul   %r8d,%edx
add    %ecx,%edx
sub    %ebp,%edx
imul   %ebx,%edx
imul   %ebx,%eax
mov    %eax,-0x14(%rsp)
sub    %ebp,-0x18(%rsp)
xor    %eax,%eax
xor    %ecx,%ecx
jmp    117a <Value_block+0x7a>
nop
mov    -0x8(%rsp),%rax
add    $0x1,%eax
mov    -0xc(%rsp),%edx
add    -0x14(%rsp),%edx
cmp    -0x1c(%rsp),%eax
je     123d <Value_block+0x13d>
mov    -0x10(%rsp),%ebp
mov    %rax,-0x8(%rsp)
add    %eax,%ebp
sets   %r8b
cmp    0x50(%rsp),%ebp
setge  %r10b
or     %r8b,%r10b
mov    %edx,-0xc(%rsp)
mov    %edx,%r13d
xor    %r8d,%r8d
jmp    11ae <Value_block+0xae>
add    $0x1,%r8d
add    %ebx,%r13d
cmp    -0x1c(%rsp),%r8d
je     1160 <Value_block+0x60>
mov    %r15d,%ebp
add    %r8d,%ebp
sets   %al
cmp    0x48(%rsp),%ebp
setge  %r12b
or     %al,%r12b
movslq %ecx,%rcx
mov    %r11,%rbp
mov    -0x18(%rsp),%eax
mov    %eax,%r9d
jmp    11ee <Value_block+0xee>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%rcx
add    $0x1,%r9d
add    $0xffffffffffffffff,%rbp
je     11a0 <Value_block+0xa0>
test   %r9d,%r9d
sets   %al
cmp    %ebx,%r9d
setge  %dl
or     %al,%dl
or     %r12b,%dl
or     %r10b,%dl
jne    11e0 <Value_block+0xe0>
lea    (%r9,%r13,1),%eax
cltq
movss  (%rdi,%rax,4),%xmm1
cvtss2sd %xmm1,%xmm1
movss  (%r14,%rcx,4),%xmm2
cvtss2sd %xmm2,%xmm2
divsd  %xmm0,%xmm2
addsd  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm1
movzbl (%rsi,%rax,1),%edx
movss  %xmm1,(%rdi,%rax,4)
add    $0x1,%dl
mov    %dl,(%rsi,%rax,1)
jmp    11e0 <Value_block+0xe0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @Value_block(float* nocapture %0, i8* nocapture %1, i32 %2, i32 %3, i32 %4, i32 %5, float* nocapture %6, double %7, i32 %8, i32 %9, i32 %10) {
%12 = shl nsw i32 %5, 1
%13 = or i32 %12, 1
%14 = mul nsw i32 %9, %8
%15 = icmp sgt i32 %13, 0
br i1 %15, label %16, label %75
16: ; preds = %11
%17 = sub i32 %2, %5
%18 = sub i32 %3, %5
%19 = sub i32 %4, %5
%20 = zext i32 %13 to i64
br label %21
21: ; preds = %72, %16
%22 = phi i32 [ 0, %16 ], [ %73, %72 ]
%23 = phi i64 [ 0, %16 ], [ %66, %72 ]
%24 = add i32 %19, %22
%25 = icmp slt i32 %24, 0
%26 = icmp sge i32 %24, %10
%27 = or i1 %25, %26
%28 = mul nsw i32 %14, %24
br label %29
29: ; preds = %69, %21
%30 = phi i32 [ 0, %21 ], [ %70, %69 ]
%31 = phi i64 [ %23, %21 ], [ %66, %69 ]
%32 = add i32 %18, %30
%33 = icmp slt i32 %32, 0
%34 = icmp sge i32 %32, %9
%35 = or i1 %33, %34
%36 = mul nsw i32 %32, %8
%37 = add i32 %36, %28
%38 = shl i64 %31, 32
%39 = ashr exact i64 %38, 32
br label %40
40: ; preds = %29, %65
%41 = phi i64 [ %39, %29 ], [ %66, %65 ]
%42 = phi i64 [ 0, %29 ], [ %67, %65 ]
%43 = trunc i64 %42 to i32
%44 = add i32 %17, %43
%45 = icmp slt i32 %44, 0
%46 = icmp sge i32 %44, %8
%47 = or i1 %45, %46
%48 = select i1 %47, i1 true, i1 %35
%49 = select i1 %48, i1 true, i1 %27
br i1 %49, label %65, label %50
50: ; preds = %40
%51 = add i32 %37, %44
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds float, float* %0, i64 %52
%54 = load float, float* %53
%55 = fpext float %54 to double
%56 = getelementptr inbounds float, float* %6, i64 %41
%57 = load float, float* %56
%58 = fpext float %57 to double
%59 = fdiv double %58, %7
%60 = fadd double %59, %55
%61 = getelementptr inbounds i8, i8* %1, i64 %52
%62 = load i8, i8* %61
%63 = fptrunc double %60 to float
store float %63, float* %53
%64 = add i8 %62, 1
store i8 %64, i8* %61
br label %65
65: ; preds = %50, %40
%66 = add nsw i64 %41, 1
%67 = add nuw nsw i64 %42, 1
%68 = icmp eq i64 %67, %20
br i1 %68, label %69, label %40
69: ; preds = %65
%70 = add nuw nsw i32 %30, 1
%71 = icmp eq i32 %70, %13
br i1 %71, label %72, label %29
72: ; preds = %69
%73 = add nuw nsw i32 %22, 1
%74 = icmp eq i32 %73, %13
br i1 %74, label %75, label %21
75: ; preds = %72, %11
ret void
}