double calcMean(double *arr, int size) {
  switch (size) {
  case 0:
    return 0;
  case 1:
    return arr[0];
  case 2:
    return (arr[0] + arr[1]) / 2;
  default: {
    int i;
    double max = arr[0];
    double min = arr[0];
    double meantime = 0;
    for (i = 0; i < size; i++) {
      if (arr[i] > max)
        max = arr[i];
      if (arr[i] < min)
        min = arr[i];
    }
    for (i = 0; i < size; i++)
      if (arr[i] != max && arr[i] != min)
        meantime += arr[i];
    return meantime / (size - 2);
  }
  }
  return 0;
}


x86 assembly (clang, -O0):
<calcMean>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x34(%rbp)
test   %eax,%eax
je     1140 <calcMean+0x40>
jmp    111e <calcMean+0x1e>
mov    -0x34(%rbp),%eax
sub    $0x1,%eax
je     114d <calcMean+0x4d>
jmp    112f <calcMean+0x2f>
mov    -0x34(%rbp),%eax
sub    $0x2,%eax
je     115f <calcMean+0x5f>
jmp    1186 <calcMean+0x86>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12c1 <calcMean+0x1c1>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12c1 <calcMean+0x1c1>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x8(%rax),%xmm0
movsd  0xe88(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12c1 <calcMean+0x1c1>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1226 <calcMean+0x126>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    11e5 <calcMean+0xe5>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1213 <calcMean+0x113>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    1218 <calcMean+0x118>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    11af <calcMean+0xaf>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12a9 <calcMean+0x1a9>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x20(%rbp),%xmm0
jne    125c <calcMean+0x15c>
jp     125c <calcMean+0x15c>
jmp    1296 <calcMean+0x196>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x28(%rbp),%xmm0
jne    127f <calcMean+0x17f>
jp     127f <calcMean+0x17f>
jmp    1296 <calcMean+0x196>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    129b <calcMean+0x19b>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    122d <calcMean+0x12d>
movsd  -0x30(%rbp),%xmm0
mov    -0x14(%rbp),%eax
sub    $0x2,%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<calcMean>:
test   %esi,%esi
je     1113 <calcMean+0x13>
cmp    $0x2,%esi
je     1117 <calcMean+0x17>
cmp    $0x1,%esi
jne    1129 <calcMean+0x29>
movsd  (%rdi),%xmm0
ret
xorps  %xmm0,%xmm0
ret
movsd  (%rdi),%xmm0
addsd  0x8(%rdi),%xmm0
mulsd  0xed8(%rip),%xmm0
ret
xorpd  %xmm0,%xmm0
jl     133a <calcMean+0x23a>
movsd  (%rdi),%xmm3
mov    %esi,%r8d
movapd %xmm3,%xmm1
movapd %xmm3,%xmm2
je     1212 <calcMean+0x112>
lea    -0x1(%r8),%rcx
lea    -0x2(%r8),%rdx
mov    %ecx,%eax
and    $0x3,%eax
cmp    $0x3,%rdx
jae    116a <calcMean+0x6a>
mov    $0x1,%edx
movapd %xmm3,%xmm4
movapd %xmm3,%xmm5
jmp    11d5 <calcMean+0xd5>
and    $0xfffffffffffffffc,%rcx
xor    %edx,%edx
movapd %xmm3,%xmm4
movapd %xmm3,%xmm5
nopl   0x0(%rax,%rax,1)
movsd  0x8(%rdi,%rdx,8),%xmm1
movsd  0x10(%rdi,%rdx,8),%xmm2
movapd %xmm1,%xmm6
maxsd  %xmm5,%xmm6
minsd  %xmm4,%xmm1
movapd %xmm2,%xmm4
maxsd  %xmm6,%xmm4
minsd  %xmm1,%xmm2
movsd  0x18(%rdi,%rdx,8),%xmm1
movapd %xmm1,%xmm6
maxsd  %xmm4,%xmm6
minsd  %xmm2,%xmm1
movsd  0x20(%rdi,%rdx,8),%xmm4
movapd %xmm4,%xmm5
maxsd  %xmm6,%xmm5
minsd  %xmm1,%xmm4
add    $0x4,%rdx
cmp    %rdx,%rcx
jne    1180 <calcMean+0x80>
add    $0x1,%rdx
movapd %xmm5,%xmm1
movapd %xmm4,%xmm2
test   %rax,%rax
je     1212 <calcMean+0x112>
lea    (%rdi,%rdx,8),%rcx
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movsd  (%rcx,%rdx,8),%xmm2
movapd %xmm2,%xmm1
maxsd  %xmm5,%xmm1
minsd  %xmm4,%xmm2
add    $0x1,%rdx
movapd %xmm2,%xmm4
movapd %xmm1,%xmm5
cmp    %rdx,%rax
jne    11f0 <calcMean+0xf0>
test   %esi,%esi
jle    133a <calcMean+0x23a>
xorpd  %xmm0,%xmm0
addsd  %xmm3,%xmm0
movapd %xmm3,%xmm4
cmpneqsd %xmm2,%xmm4
andpd  %xmm0,%xmm4
cmpneqsd %xmm1,%xmm3
andpd  %xmm4,%xmm3
movapd %xmm3,%xmm0
cmp    $0x1,%esi
je     133a <calcMean+0x23a>
add    $0xffffffffffffffff,%r8
cmp    $0x2,%esi
jne    1258 <calcMean+0x158>
mov    $0x1,%ecx
jmp    12fd <calcMean+0x1fd>
mov    %r8,%rdx
and    $0xfffffffffffffffe,%rdx
neg    %rdx
mov    $0x1,%ecx
movsd  0xd99(%rip),%xmm3
movapd %xmm0,%xmm5
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%rdi,%rcx,8),%xmm4
movsd  0x8(%rdi,%rcx,8),%xmm0
movapd %xmm4,%xmm6
cmpneqsd %xmm2,%xmm6
movapd %xmm6,%xmm7
andpd  %xmm4,%xmm7
andnpd %xmm3,%xmm6
orpd   %xmm7,%xmm6
cmpneqsd %xmm1,%xmm4
andpd  %xmm4,%xmm6
andnpd %xmm3,%xmm4
orpd   %xmm6,%xmm4
addsd  %xmm5,%xmm4
movapd %xmm0,%xmm5
cmpneqsd %xmm2,%xmm5
movapd %xmm5,%xmm6
andpd  %xmm0,%xmm6
andnpd %xmm3,%xmm5
orpd   %xmm6,%xmm5
cmpneqsd %xmm1,%xmm0
andpd  %xmm0,%xmm5
andnpd %xmm3,%xmm0
orpd   %xmm5,%xmm0
addsd  %xmm4,%xmm0
lea    (%rdx,%rcx,1),%rax
add    $0x2,%rax
add    $0x2,%rcx
movapd %xmm0,%xmm5
cmp    $0x1,%rax
jne    1280 <calcMean+0x180>
test   $0x1,%r8b
je     133a <calcMean+0x23a>
movsd  (%rdi,%rcx,8),%xmm3
cmpneqsd %xmm3,%xmm2
movapd %xmm2,%xmm4
andpd  %xmm3,%xmm4
movsd  0xceb(%rip),%xmm5
andnpd %xmm5,%xmm2
orpd   %xmm4,%xmm2
cmpneqsd %xmm3,%xmm1
andpd  %xmm1,%xmm2
andnpd %xmm5,%xmm1
orpd   %xmm2,%xmm1
addsd  %xmm1,%xmm0
add    $0xfffffffe,%esi
xorps  %xmm1,%xmm1
cvtsi2sd %esi,%xmm1
divsd  %xmm1,%xmm0
ret

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

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