float smoothAverage(float *arr, int count) {
  float min, max, minI, maxI, Sum, n;
  int j;
  if (count == 0) {
    return 0.0;
  }
  if (count == 1) {
    return arr[0];
  }
  if (count == 2) {
    return (arr[0] + arr[1]) / 2;
  }
  minI = maxI = arr[0];
  min = max = 0;
  for (j = 1; j < count; j++) {
    if (arr[j] < min) {
      minI = j;
      min = arr[j];
    }
    if (arr[j] > max) {
      maxI = j;
      max = arr[j];
    }
  }
  n = 0.0;
  Sum = 0.0;
  for (j = 0; j < count; j++) {
    if (j != minI && j != maxI) {
      Sum += arr[j];
      n += 1.0;
    }
  }
  return Sum / n;
}


x86 assembly (clang, -O0):
<smoothAverage>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1122 <smoothAverage+0x22>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12cf <smoothAverage+0x1cf>
cmpl   $0x1,-0x14(%rbp)
jne    113e <smoothAverage+0x3e>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12cf <smoothAverage+0x1cf>
cmpl   $0x2,-0x14(%rbp)
jne    116f <smoothAverage+0x6f>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x4(%rax),%xmm0
movss  0xea7(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12cf <smoothAverage+0x1cf>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1221 <smoothAverage+0x121>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x18(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    11db <smoothAverage+0xdb>
cvtsi2ssl -0x30(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x1c(%rbp),%xmm0
jbe    120e <smoothAverage+0x10e>
cvtsi2ssl -0x30(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x1c(%rbp)
jmp    1213 <smoothAverage+0x113>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1198 <smoothAverage+0x98>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x28(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12c0 <smoothAverage+0x1c0>
cvtsi2ssl -0x30(%rbp),%xmm0
ucomiss -0x20(%rbp),%xmm0
jne    125e <smoothAverage+0x15e>
jp     125e <smoothAverage+0x15e>
jmp    12ad <smoothAverage+0x1ad>
cvtsi2ssl -0x30(%rbp),%xmm0
ucomiss -0x24(%rbp),%xmm0
jne    1278 <smoothAverage+0x178>
jp     1278 <smoothAverage+0x178>
jmp    12ad <smoothAverage+0x1ad>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd60(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
jmp    12b2 <smoothAverage+0x1b2>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1238 <smoothAverage+0x138>
movss  -0x28(%rbp),%xmm0
divss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<smoothAverage>:
test   %esi,%esi
je     1113 <smoothAverage+0x13>
cmp    $0x2,%esi
je     1117 <smoothAverage+0x17>
cmp    $0x1,%esi
jne    1129 <smoothAverage+0x29>
movss  (%rdi),%xmm0
ret
xorps  %xmm0,%xmm0
ret
movss  (%rdi),%xmm0
addss  0x4(%rdi),%xmm0
mulss  0xed8(%rip),%xmm0
ret
movss  0xed3(%rip),%xmm0
jle    1315 <smoothAverage+0x215>
movss  (%rdi),%xmm8
mov    %esi,%r8d
lea    -0x1(%r8),%r9
cmp    $0x2,%esi
jne    115c <smoothAverage+0x5c>
xorps  %xmm3,%xmm3
mov    $0x1,%edx
movaps %xmm8,%xmm9
xorps  %xmm4,%xmm4
jmp    1215 <smoothAverage+0x115>
mov    %r9,%rcx
and    $0xfffffffffffffffe,%rcx
xorps  %xmm3,%xmm3
mov    $0x1,%edx
movaps %xmm8,%xmm9
xorps  %xmm4,%xmm4
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xorps  %xmm7,%xmm7
cvtsi2ss %edx,%xmm7
movss  (%rdi,%rdx,4),%xmm1
movaps %xmm1,%xmm2
movaps %xmm1,%xmm6
maxss  %xmm3,%xmm6
cmpltss %xmm1,%xmm3
minss  %xmm4,%xmm1
cmpltss %xmm4,%xmm2
movss  0x4(%rdi,%rdx,4),%xmm4
movaps %xmm2,%xmm5
andps  %xmm7,%xmm5
andnps %xmm9,%xmm2
orps   %xmm5,%xmm2
andps  %xmm3,%xmm7
andnps %xmm8,%xmm3
movaps %xmm3,%xmm5
orps   %xmm7,%xmm5
lea    0x1(%rdx),%rax
xorps  %xmm7,%xmm7
cvtsi2ss %eax,%xmm7
movaps %xmm4,%xmm9
movaps %xmm4,%xmm3
maxss  %xmm6,%xmm3
cmpltss %xmm4,%xmm6
minss  %xmm1,%xmm4
cmpltss %xmm1,%xmm9
movaps %xmm9,%xmm1
andnps %xmm2,%xmm1
andps  %xmm7,%xmm9
orps   %xmm1,%xmm9
movaps %xmm6,%xmm1
andnps %xmm5,%xmm1
andps  %xmm7,%xmm6
orps   %xmm1,%xmm6
movaps %xmm6,%xmm8
add    $0x2,%rdx
cmp    %rcx,%rax
jne    1180 <smoothAverage+0x80>
test   $0x1,%r9b
je     1250 <smoothAverage+0x150>
movss  (%rdi,%rdx,4),%xmm5
xorps  %xmm6,%xmm6
cvtsi2ss %edx,%xmm6
cmpltss %xmm5,%xmm3
cmpltss %xmm4,%xmm5
movaps %xmm5,%xmm4
andps  %xmm6,%xmm4
andnps %xmm9,%xmm5
orps   %xmm4,%xmm5
andps  %xmm3,%xmm6
andnps %xmm8,%xmm3
orps   %xmm6,%xmm3
movaps %xmm5,%xmm9
movaps %xmm3,%xmm8
test   %esi,%esi
jle    1315 <smoothAverage+0x215>
test   %r9,%r9
je     12df <smoothAverage+0x1df>
mov    %r8d,%edx
and    $0xfffffffe,%edx
xorps  %xmm3,%xmm3
xor    %eax,%eax
movss  0xd94(%rip),%xmm4
xorps  %xmm0,%xmm0
jmp    1289 <smoothAverage+0x189>
nopl   0x0(%rax)
add    $0x1,%rax
cmp    %rdx,%rax
je     12d3 <smoothAverage+0x1d3>
mov    %rax,%rcx
xorps  %xmm5,%xmm5
cvtsi2ss %ecx,%xmm5
ucomiss %xmm5,%xmm9
jne    129b <smoothAverage+0x19b>
jnp    12ac <smoothAverage+0x1ac>
ucomiss %xmm5,%xmm8
jne    12a3 <smoothAverage+0x1a3>
jnp    12ac <smoothAverage+0x1ac>
addss  (%rdi,%rcx,4),%xmm0
addss  %xmm4,%xmm3
lea    0x1(%rcx),%rax
xorps  %xmm5,%xmm5
cvtsi2ss %eax,%xmm5
ucomiss %xmm5,%xmm9
jne    12bf <smoothAverage+0x1bf>
jnp    1280 <smoothAverage+0x180>
ucomiss %xmm5,%xmm8
jne    12c7 <smoothAverage+0x1c7>
jnp    1280 <smoothAverage+0x180>
addss  0x4(%rdi,%rcx,4),%xmm0
addss  %xmm4,%xmm3
jmp    1280 <smoothAverage+0x180>
add    $0x2,%rcx
test   $0x1,%r8b
jne    12ed <smoothAverage+0x1ed>
jmp    1311 <smoothAverage+0x211>
xorps  %xmm3,%xmm3
xor    %ecx,%ecx
xorps  %xmm0,%xmm0
test   $0x1,%r8b
je     1311 <smoothAverage+0x211>
xorps  %xmm4,%xmm4
cvtsi2ss %ecx,%xmm4
ucomiss %xmm4,%xmm9
jne    12fc <smoothAverage+0x1fc>
jnp    1311 <smoothAverage+0x211>
ucomiss %xmm4,%xmm8
jne    1304 <smoothAverage+0x204>
jnp    1311 <smoothAverage+0x211>
addss  (%rdi,%rcx,4),%xmm0
addss  0xcf7(%rip),%xmm3
divss  %xmm3,%xmm0
ret

LLVM IR (-O0):
define float @smoothAverage(float* %0, i32 %1) {
%3 = alloca float
%4 = alloca float*
%5 = alloca i32
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca i32
store float* %0, float** %4
store i32 %1, i32* %5
%13 = load i32, i32* %5
%14 = icmp eq i32 %13, 0
br i1 %14, label %15, label %16
15: ; preds = %2
store float 0.000000e+00, float* %3
br label %114
16: ; preds = %2
%17 = load i32, i32* %5
%18 = icmp eq i32 %17, 1
br i1 %18, label %19, label %23
19: ; preds = %16
%20 = load float*, float** %4
%21 = getelementptr inbounds float, float* %20, i64 0
%22 = load float, float* %21
store float %22, float* %3
br label %114
23: ; preds = %16
%24 = load i32, i32* %5
%25 = icmp eq i32 %24, 2
br i1 %25, label %26, label %35
26: ; preds = %23
%27 = load float*, float** %4
%28 = getelementptr inbounds float, float* %27, i64 0
%29 = load float, float* %28
%30 = load float*, float** %4
%31 = getelementptr inbounds float, float* %30, i64 1
%32 = load float, float* %31
%33 = fadd float %29, %32
%34 = fdiv float %33, 2.000000e+00
store float %34, float* %3
br label %114
35: ; preds = %23
%36 = load float*, float** %4
%37 = getelementptr inbounds float, float* %36, i64 0
%38 = load float, float* %37
store float %38, float* %9
store float %38, float* %8
store float 0.000000e+00, float* %7
store float 0.000000e+00, float* %6
store i32 1, i32* %12
br label %39
39: ; preds = %76, %35
%40 = load i32, i32* %12
%41 = load i32, i32* %5
%42 = icmp slt i32 %40, %41
br i1 %42, label %43, label %79
43: ; preds = %39
%44 = load float*, float** %4
%45 = load i32, i32* %12
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds float, float* %44, i64 %46
%48 = load float, float* %47
%49 = load float, float* %6
%50 = fcmp olt float %48, %49
br i1 %50, label %51, label %59
51: ; preds = %43
%52 = load i32, i32* %12
%53 = sitofp i32 %52 to float
store float %53, float* %8
%54 = load float*, float** %4
%55 = load i32, i32* %12
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds float, float* %54, i64 %56
%58 = load float, float* %57
store float %58, float* %6
br label %59
59: ; preds = %51, %43
%60 = load float*, float** %4
%61 = load i32, i32* %12
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds float, float* %60, i64 %62
%64 = load float, float* %63
%65 = load float, float* %7
%66 = fcmp ogt float %64, %65
br i1 %66, label %67, label %75
67: ; preds = %59
%68 = load i32, i32* %12
%69 = sitofp i32 %68 to float
store float %69, float* %9
%70 = load float*, float** %4
%71 = load i32, i32* %12
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds float, float* %70, i64 %72
%74 = load float, float* %73
store float %74, float* %7
br label %75
75: ; preds = %67, %59
br label %76
76: ; preds = %75
%77 = load i32, i32* %12
%78 = add nsw i32 %77, 1
store i32 %78, i32* %12
br label %39
79: ; preds = %39
store float 0.000000e+00, float* %11
store float 0.000000e+00, float* %10
store i32 0, i32* %12
br label %80
80: ; preds = %107, %79
%81 = load i32, i32* %12
%82 = load i32, i32* %5
%83 = icmp slt i32 %81, %82
br i1 %83, label %84, label %110
84: ; preds = %80
%85 = load i32, i32* %12
%86 = sitofp i32 %85 to float
%87 = load float, float* %8
%88 = fcmp une float %86, %87
br i1 %88, label %89, label %106
89: ; preds = %84
%90 = load i32, i32* %12
%91 = sitofp i32 %90 to float
%92 = load float, float* %9
%93 = fcmp une float %91, %92
br i1 %93, label %94, label %106
94: ; preds = %89
%95 = load float*, float** %4
%96 = load i32, i32* %12
%97 = sext i32 %96 to i64
%98 = getelementptr inbounds float, float* %95, i64 %97
%99 = load float, float* %98
%100 = load float, float* %10
%101 = fadd float %100, %99
store float %101, float* %10
%102 = load float, float* %11
%103 = fpext float %102 to double
%104 = fadd double %103, 1.000000e+00
%105 = fptrunc double %104 to float
store float %105, float* %11
br label %106
106: ; preds = %94, %89, %84
br label %107
107: ; preds = %106
%108 = load i32, i32* %12
%109 = add nsw i32 %108, 1
store i32 %109, i32* %12
br label %80
110: ; preds = %80
%111 = load float, float* %10
%112 = load float, float* %11
%113 = fdiv float %111, %112
store float %113, float* %3
br label %114
114: ; preds = %110, %26, %19, %15
%115 = load float, float* %3
ret float %115
}

LLVM IR (-O2):
define float @smoothAverage(float* nocapture %0, i32 %1) {
switch i32 %1, label %11 [
i32 0, label %136
i32 1, label %3
i32 2, label %5
]
3: ; preds = %2
%4 = load float, float* %0
br label %136
5: ; preds = %2
%6 = load float, float* %0
%7 = getelementptr inbounds float, float* %0, i64 1
%8 = load float, float* %7
%9 = fadd float %6, %8
%10 = fmul float %9, 5.000000e-01
br label %136
11: ; preds = %2
%12 = load float, float* %0
%13 = icmp sgt i32 %1, 1
br i1 %13, label %14, label %136
14: ; preds = %11
%15 = zext i32 %1 to i64
%16 = add nsw i64 %15, -1
%17 = and i64 %16, 1
%18 = icmp eq i32 %1, 2
br i1 %18, label %21, label %19
19: ; preds = %14
%20 = and i64 %16, -2
br label %48
21: ; preds = %48, %14
%22 = phi float [ undef, %14 ], [ %72, %48 ]
%23 = phi float [ undef, %14 ], [ %75, %48 ]
%24 = phi i64 [ 1, %14 ], [ %76, %48 ]
%25 = phi float [ %12, %14 ], [ %75, %48 ]
%26 = phi float [ %12, %14 ], [ %72, %48 ]
%27 = phi float [ 0.000000e+00, %14 ], [ %74, %48 ]
%28 = phi float [ 0.000000e+00, %14 ], [ %71, %48 ]
%29 = icmp eq i64 %17, 0
br i1 %29, label %39, label %30
30: ; preds = %21
%31 = getelementptr inbounds float, float* %0, i64 %24
%32 = load float, float* %31
%33 = fcmp olt float %32, %28
%34 = trunc i64 %24 to i32
%35 = sitofp i32 %34 to float
%36 = select i1 %33, float %35, float %26
%37 = fcmp ogt float %32, %27
%38 = select i1 %37, float %35, float %25
br label %39
39: ; preds = %21, %30
%40 = phi float [ %22, %21 ], [ %36, %30 ]
%41 = phi float [ %23, %21 ], [ %38, %30 ]
%42 = icmp sgt i32 %1, 0
br i1 %42, label %43, label %136
43: ; preds = %39
%44 = and i64 %15, 1
%45 = icmp eq i64 %16, 0
br i1 %45, label %114, label %46
46: ; preds = %43
%47 = and i64 %15, 4294967294
br label %79
48: ; preds = %48, %19
%49 = phi i64 [ 1, %19 ], [ %76, %48 ]
%50 = phi float [ %12, %19 ], [ %75, %48 ]
%51 = phi float [ %12, %19 ], [ %72, %48 ]
%52 = phi float [ 0.000000e+00, %19 ], [ %74, %48 ]
%53 = phi float [ 0.000000e+00, %19 ], [ %71, %48 ]
%54 = phi i64 [ 0, %19 ], [ %77, %48 ]
%55 = getelementptr inbounds float, float* %0, i64 %49
%56 = load float, float* %55
%57 = fcmp olt float %56, %53
%58 = trunc i64 %49 to i32
%59 = sitofp i32 %58 to float
%60 = select i1 %57, float %56, float %53
%61 = select i1 %57, float %59, float %51
%62 = fcmp ogt float %56, %52
%63 = select i1 %62, float %56, float %52
%64 = select i1 %62, float %59, float %50
%65 = add nuw nsw i64 %49, 1
%66 = getelementptr inbounds float, float* %0, i64 %65
%67 = load float, float* %66
%68 = fcmp olt float %67, %60
%69 = trunc i64 %65 to i32
%70 = sitofp i32 %69 to float
%71 = select i1 %68, float %67, float %60
%72 = select i1 %68, float %70, float %61
%73 = fcmp ogt float %67, %63
%74 = select i1 %73, float %67, float %63
%75 = select i1 %73, float %70, float %64
%76 = add nuw nsw i64 %49, 2
%77 = add i64 %54, 2
%78 = icmp eq i64 %77, %20
br i1 %78, label %21, label %48
79: ; preds = %108, %46
%80 = phi i64 [ 0, %46 ], [ %111, %108 ]
%81 = phi float [ 0.000000e+00, %46 ], [ %110, %108 ]
%82 = phi float [ 0.000000e+00, %46 ], [ %109, %108 ]
%83 = phi i64 [ 0, %46 ], [ %112, %108 ]
%84 = trunc i64 %80 to i32
%85 = sitofp i32 %84 to float
%86 = fcmp une float %40, %85
%87 = fcmp une float %41, %85
%88 = select i1 %86, i1 %87, i1 false
br i1 %88, label %89, label %94
89: ; preds = %79
%90 = getelementptr inbounds float, float* %0, i64 %80
%91 = load float, float* %90
%92 = fadd float %82, %91
%93 = fadd float %81, 1.000000e+00
br label %94
94: ; preds = %79, %89
%95 = phi float [ %92, %89 ], [ %82, %79 ]
%96 = phi float [ %93, %89 ], [ %81, %79 ]
%97 = or i64 %80, 1
%98 = trunc i64 %97 to i32
%99 = sitofp i32 %98 to float
%100 = fcmp une float %40, %99
%101 = fcmp une float %41, %99
%102 = select i1 %100, i1 %101, i1 false
br i1 %102, label %103, label %108
103: ; preds = %94
%104 = getelementptr inbounds float, float* %0, i64 %97
%105 = load float, float* %104
%106 = fadd float %95, %105
%107 = fadd float %96, 1.000000e+00
br label %108
108: ; preds = %103, %94
%109 = phi float [ %106, %103 ], [ %95, %94 ]
%110 = phi float [ %107, %103 ], [ %96, %94 ]
%111 = add nuw nsw i64 %80, 2
%112 = add i64 %83, 2
%113 = icmp eq i64 %112, %47
br i1 %113, label %114, label %79
114: ; preds = %108, %43
%115 = phi float [ undef, %43 ], [ %109, %108 ]
%116 = phi float [ undef, %43 ], [ %110, %108 ]
%117 = phi i64 [ 0, %43 ], [ %111, %108 ]
%118 = phi float [ 0.000000e+00, %43 ], [ %110, %108 ]
%119 = phi float [ 0.000000e+00, %43 ], [ %109, %108 ]
%120 = icmp eq i64 %44, 0
br i1 %120, label %132, label %121
121: ; preds = %114
%122 = trunc i64 %117 to i32
%123 = sitofp i32 %122 to float
%124 = fcmp une float %40, %123
%125 = fcmp une float %41, %123
%126 = select i1 %124, i1 %125, i1 false
br i1 %126, label %127, label %132
127: ; preds = %121
%128 = getelementptr inbounds float, float* %0, i64 %117
%129 = load float, float* %128
%130 = fadd float %119, %129
%131 = fadd float %118, 1.000000e+00
br label %132
132: ; preds = %121, %127, %114
%133 = phi float [ %115, %114 ], [ %130, %127 ], [ %119, %121 ]
%134 = phi float [ %116, %114 ], [ %131, %127 ], [ %118, %121 ]
%135 = fdiv float %133, %134
br label %136
136: ; preds = %11, %39, %132, %2, %5, %3
%137 = phi float [ %4, %3 ], [ %10, %5 ], [ 0.000000e+00, %2 ], [ %135, %132 ], [ 0x7FF8000000000000, %39 ], [ 0x7FF8000000000000, %11 ]
ret float %137
}