float fast_median(float *arr, int n) {
  float *alow, *ahigh, *amedian, *amiddle, *all, *ahh, val, valmax, valmax2;
  int i, nless;
  if (!n)
    return 0.0;
  else if (n == 1)
    return *arr;
  else if (n == 2)
    return 0.5 * (*arr + *(arr + 1));
  alow = arr;
  ahigh = arr + n - 1;
  amedian = arr + n / 2;
  while (ahigh > (all = alow + 1)) {
    amiddle = alow + (ahigh - alow) / 2;
    if (*amiddle > *ahigh) {
      register float t = (*amiddle);
      (*amiddle) = (*ahigh);
      (*ahigh) = t;
    };
    if (*alow > *ahigh) {
      register float t = (*alow);
      (*alow) = (*ahigh);
      (*ahigh) = t;
    };
    if (*amiddle > *alow) {
      register float t = (*amiddle);
      (*amiddle) = (*alow);
      (*alow) = t;
    };
    {
      register float t = (*amiddle);
      (*amiddle) = (*all);
      (*all) = t;
    };
    ahh = ahigh;
    for (;;) {
      while (*alow > *(++all))
        ;
      while (*(--ahh) > *alow)
        ;
      if (ahh < all)
        break;
      {
        register float t = (*all);
        (*all) = (*ahh);
        (*ahh) = t;
      };
    }
    {
      register float t = (*alow);
      (*alow) = (*ahh);
      (*ahh) = t;
    };
    if (ahh <= amedian)
      alow = all;
    if (ahh >= amedian)
      ahigh = ahh - 1;
  }
  if (ahigh == all && *alow > *ahigh) {
    register float t = (*alow);
    (*alow) = (*ahigh);
    (*ahigh) = t;
  };
  if (n & 1)
    return *amedian;
  else {
    valmax2 = *amedian;
    valmax = -1e+30;
    alow = arr;
    nless = 0;
    for (i = n / 2; i--;)
      if ((val = *(alow++)) < valmax2) {
        nless++;
        if (val > valmax)
          valmax = val;
      }
    return nless < n / 2 ? *amedian : (*amedian + valmax) / 2.0;
  }
}


x86 assembly (clang, -O0):
<fast_median>:
push   %rbp
mov    %rsp,%rbp
sub    $0x18,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1126 <fast_median+0x26>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1581 <fast_median+0x481>
cmpl   $0x1,-0x14(%rbp)
jne    1142 <fast_median+0x42>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1581 <fast_median+0x481>
cmpl   $0x2,-0x14(%rbp)
jne    117b <fast_median+0x7b>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xea7(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1581 <fast_median+0x481>
jmp    1180 <fast_median+0x80>
jmp    1185 <fast_median+0x85>
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
add    $0xfffffffffffffffc,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x80(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x80(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x4,%rcx
mov    %rcx,-0x40(%rbp)
cmp    %rcx,%rax
jbe    1403 <fast_median+0x303>
mov    -0x20(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
sar    $0x2,%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x88(%rbp),%rax
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x28(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    125c <fast_median+0x15c>
mov    -0x38(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x28(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    129b <fast_median+0x19b>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x64(%rbp)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x64(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    12da <fast_median+0x1da>
mov    -0x38(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x68(%rbp)
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x68(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x6c(%rbp)
mov    -0x40(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x6c(%rbp),%xmm0
mov    -0x40(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,-0x48(%rbp)
jmp    1311 <fast_median+0x211>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x40(%rbp)
ucomiss 0x4(%rax),%xmm0
jbe    1337 <fast_median+0x237>
jmp    1311 <fast_median+0x211>
jmp    133c <fast_median+0x23c>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffffc,%rcx
mov    %rcx,-0x48(%rbp)
movss  -0x4(%rax),%xmm0
mov    -0x20(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    1362 <fast_median+0x262>
jmp    133c <fast_median+0x23c>
mov    -0x48(%rbp),%rax
cmp    -0x40(%rbp),%rax
jae    1375 <fast_median+0x275>
jmp    13a4 <fast_median+0x2a4>
mov    -0x40(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x70(%rbp)
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x40(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x70(%rbp),%xmm0
mov    -0x48(%rbp),%rax
movss  %xmm0,(%rax)
jmp    130c <fast_median+0x20c>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x74(%rbp)
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x74(%rbp),%xmm0
mov    -0x48(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x48(%rbp),%rax
cmp    -0x30(%rbp),%rax
ja     13e4 <fast_median+0x2e4>
mov    -0x40(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x30(%rbp),%rax
jb     13fe <fast_median+0x2fe>
mov    -0x48(%rbp),%rax
add    $0xfffffffffffffffc,%rax
mov    %rax,-0x28(%rbp)
jmp    11cb <fast_median+0xcb>
mov    -0x28(%rbp),%rax
cmp    -0x40(%rbp),%rax
jne    1450 <fast_median+0x350>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x28(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    1450 <fast_median+0x350>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x78(%rbp)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x78(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x14(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1471 <fast_median+0x371>
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1581 <fast_median+0x481>
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x54(%rbp)
movss  0xb7a(%rip),%xmm0
movss  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x5c(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x58(%rbp)
mov    -0x58(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x58(%rbp)
cmp    $0x0,%eax
je     150e <fast_median+0x40e>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm1
movss  %xmm1,-0x4c(%rbp)
movss  -0x54(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1509 <fast_median+0x409>
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
movss  -0x4c(%rbp),%xmm0
ucomiss -0x50(%rbp),%xmm0
jbe    1504 <fast_median+0x404>
movss  -0x4c(%rbp),%xmm0
movss  %xmm0,-0x50(%rbp)
jmp    1509 <fast_median+0x409>
jmp    14a8 <fast_median+0x3a8>
mov    -0x5c(%rbp),%eax
mov    %eax,-0x8c(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x8c(%rbp),%eax
cmp    %ecx,%eax
jge    154b <fast_median+0x44b>
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
jmp    1570 <fast_median+0x470>
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
addss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xaa4(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x18,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fast_median>:
test   %esi,%esi
je     1113 <fast_median+0x13>
cmp    $0x2,%esi
je     1117 <fast_median+0x17>
cmp    $0x1,%esi
jne    1125 <fast_median+0x25>
movss  (%rdi),%xmm0
ret
xorps  %xmm0,%xmm0
ret
movss  (%rdi),%xmm0
addss  0x4(%rdi),%xmm0
jmp    1324 <fast_median+0x224>
movslq %esi,%rax
lea    (%rdi,%rax,4),%r10
add    $0xfffffffffffffffc,%r10
mov    %esi,%r8d
shr    $0x1f,%r8d
add    %esi,%r8d
sar    %r8d
movslq %r8d,%rax
lea    (%rdi,%rax,4),%r9
lea    0x4(%rdi),%rdx
mov    %rdi,%rax
cmp    $0x3,%esi
jge    11c0 <fast_median+0xc0>
cmp    %rdx,%r10
jne    116c <fast_median+0x6c>
movss  (%rax),%xmm0
movss  (%r10),%xmm1
ucomiss %xmm1,%xmm0
jbe    116c <fast_median+0x6c>
movss  %xmm1,(%rax)
movss  %xmm0,(%r10)
movss  (%r9),%xmm0
test   $0x1,%sil
jne    132c <fast_median+0x22c>
cmp    $0x2,%esi
jae    1291 <fast_median+0x191>
movss  0xe78(%rip),%xmm2
xor    %eax,%eax
jmp    131b <fast_median+0x21b>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movss  %xmm2,(%rax)
movss  %xmm0,(%rcx)
lea    -0x4(%rcx),%r11
cmp    %r9,%rcx
cmovbe %rdx,%rax
cmovae %r11,%r10
lea    0x4(%rax),%rdx
cmp    %rdx,%r10
jbe    1150 <fast_median+0x50>
mov    %r10,%rcx
sub    %rax,%rcx
mov    %rcx,%r11
sar    $0x2,%r11
shr    $0x3f,%rcx
add    %r11,%rcx
sar    %rcx
movss  (%rax,%rcx,4),%xmm1
movss  (%r10),%xmm0
ucomiss %xmm0,%xmm1
jbe    1200 <fast_median+0x100>
movss  %xmm0,(%rax,%rcx,4)
movss  %xmm1,(%r10)
jmp    1203 <fast_median+0x103>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movaps %xmm0,%xmm1
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    1219 <fast_median+0x119>
movss  %xmm1,(%rax)
movss  %xmm0,(%r10)
movss  (%rax),%xmm0
movss  (%rax,%rcx,4),%xmm1
ucomiss %xmm0,%xmm1
jbe    1231 <fast_median+0x131>
movss  %xmm0,(%rax,%rcx,4)
movss  %xmm1,(%rax)
movss  (%rax,%rcx,4),%xmm1
movss  (%rdx),%xmm0
movss  %xmm0,(%rax,%rcx,4)
movss  %xmm1,(%rdx)
mov    %r10,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movss  (%rax),%xmm0
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movss  0x4(%rdx),%xmm1
add    $0x4,%rdx
ucomiss %xmm1,%xmm0
ja     1260 <fast_median+0x160>
xchg   %ax,%ax
movss  -0x4(%rcx),%xmm2
add    $0xfffffffffffffffc,%rcx
ucomiss %xmm0,%xmm2
ja     1270 <fast_median+0x170>
cmp    %rdx,%rcx
jb     11a0 <fast_median+0xa0>
movss  %xmm2,(%rdx)
movss  %xmm1,(%rcx)
jmp    1250 <fast_median+0x150>
and    $0xfffffffe,%esi
cmp    $0x2,%esi
jne    12a5 <fast_median+0x1a5>
xor    %eax,%eax
movss  0xd61(%rip),%xmm1
jmp    12fe <fast_median+0x1fe>
mov    %r8d,%ecx
and    $0xfffffffe,%ecx
xor    %eax,%eax
movss  0xd4f(%rip),%xmm1
jmp    12cc <fast_median+0x1cc>
nopw   0x0(%rax,%rax,1)
movaps %xmm2,%xmm1
lea    0x8(%rdx),%rdi
add    $0xfffffffe,%ecx
je     12f7 <fast_median+0x1f7>
mov    %rdi,%rdx
movss  (%rdi),%xmm2
ucomiss %xmm2,%xmm0
jbe    12e0 <fast_median+0x1e0>
add    $0x1,%eax
ucomiss %xmm1,%xmm2
ja     12e3 <fast_median+0x1e3>
movaps %xmm1,%xmm2
movss  0x4(%rdx),%xmm1
ucomiss %xmm1,%xmm0
jbe    12c0 <fast_median+0x1c0>
add    $0x1,%eax
ucomiss %xmm2,%xmm1
jbe    12c0 <fast_median+0x1c0>
jmp    12c3 <fast_median+0x1c3>
add    $0x8,%rdx
mov    %rdx,%rdi
movaps %xmm1,%xmm2
test   $0x1,%r8b
je     131b <fast_median+0x21b>
movss  (%rdi),%xmm2
ucomiss %xmm2,%xmm0
jbe    1318 <fast_median+0x218>
add    $0x1,%eax
ucomiss %xmm1,%xmm2
ja     131b <fast_median+0x21b>
movaps %xmm1,%xmm2
cmp    %r8d,%eax
jl     132c <fast_median+0x22c>
addss  %xmm2,%xmm0
mulss  0xcd4(%rip),%xmm0
ret

LLVM IR (-O0):
define float @fast_median(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 float
%13 = alloca float
%14 = alloca float
%15 = alloca i32
%16 = alloca i32
%17 = alloca float
%18 = alloca float
%19 = alloca float
%20 = alloca float
%21 = alloca float
%22 = alloca float
%23 = alloca float
store float* %0, float** %4
store i32 %1, i32* %5
%24 = load i32, i32* %5
%25 = icmp ne i32 %24, 0
br i1 %25, label %27, label %26
26: ; preds = %2
store float 0.000000e+00, float* %3
br label %247
27: ; preds = %2
%28 = load i32, i32* %5
%29 = icmp eq i32 %28, 1
br i1 %29, label %30, label %33
30: ; preds = %27
%31 = load float*, float** %4
%32 = load float, float* %31
store float %32, float* %3
br label %247
33: ; preds = %27
%34 = load i32, i32* %5
%35 = icmp eq i32 %34, 2
br i1 %35, label %36, label %46
36: ; preds = %33
%37 = load float*, float** %4
%38 = load float, float* %37
%39 = load float*, float** %4
%40 = getelementptr inbounds float, float* %39, i64 1
%41 = load float, float* %40
%42 = fadd float %38, %41
%43 = fpext float %42 to double
%44 = fmul double 5.000000e-01, %43
%45 = fptrunc double %44 to float
store float %45, float* %3
br label %247
46: ; preds = %33
br label %47
47: ; preds = %46
br label %48
48: ; preds = %47
%49 = load float*, float** %4
store float* %49, float** %6
%50 = load float*, float** %4
%51 = load i32, i32* %5
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds float, float* %50, i64 %52
%54 = getelementptr inbounds float, float* %53, i64 -1
store float* %54, float** %7
%55 = load float*, float** %4
%56 = load i32, i32* %5
%57 = sdiv i32 %56, 2
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds float, float* %55, i64 %58
store float* %59, float** %8
br label %60
60: ; preds = %176, %48
%61 = load float*, float** %7
%62 = load float*, float** %6
%63 = getelementptr inbounds float, float* %62, i64 1
store float* %63, float** %10
%64 = icmp ugt float* %61, %63
br i1 %64, label %65, label %177
65: ; preds = %60
%66 = load float*, float** %6
%67 = load float*, float** %7
%68 = load float*, float** %6
%69 = ptrtoint float* %67 to i64
%70 = ptrtoint float* %68 to i64
%71 = sub i64 %69, %70
%72 = sdiv exact i64 %71, 4
%73 = sdiv i64 %72, 2
%74 = getelementptr inbounds float, float* %66, i64 %73
store float* %74, float** %9
%75 = load float*, float** %9
%76 = load float, float* %75
%77 = load float*, float** %7
%78 = load float, float* %77
%79 = fcmp ogt float %76, %78
br i1 %79, label %80, label %88
80: ; preds = %65
%81 = load float*, float** %9
%82 = load float, float* %81
store float %82, float* %17
%83 = load float*, float** %7
%84 = load float, float* %83
%85 = load float*, float** %9
store float %84, float* %85
%86 = load float, float* %17
%87 = load float*, float** %7
store float %86, float* %87
br label %88
88: ; preds = %80, %65
%89 = load float*, float** %6
%90 = load float, float* %89
%91 = load float*, float** %7
%92 = load float, float* %91
%93 = fcmp ogt float %90, %92
br i1 %93, label %94, label %102
94: ; preds = %88
%95 = load float*, float** %6
%96 = load float, float* %95
store float %96, float* %18
%97 = load float*, float** %7
%98 = load float, float* %97
%99 = load float*, float** %6
store float %98, float* %99
%100 = load float, float* %18
%101 = load float*, float** %7
store float %100, float* %101
br label %102
102: ; preds = %94, %88
%103 = load float*, float** %9
%104 = load float, float* %103
%105 = load float*, float** %6
%106 = load float, float* %105
%107 = fcmp ogt float %104, %106
br i1 %107, label %108, label %116
108: ; preds = %102
%109 = load float*, float** %9
%110 = load float, float* %109
store float %110, float* %19
%111 = load float*, float** %6
%112 = load float, float* %111
%113 = load float*, float** %9
store float %112, float* %113
%114 = load float, float* %19
%115 = load float*, float** %6
store float %114, float* %115
br label %116
116: ; preds = %108, %102
%117 = load float*, float** %9
%118 = load float, float* %117
store float %118, float* %20
%119 = load float*, float** %10
%120 = load float, float* %119
%121 = load float*, float** %9
store float %120, float* %121
%122 = load float, float* %20
%123 = load float*, float** %10
store float %122, float* %123
%124 = load float*, float** %7
store float* %124, float** %11
br label %125
125: ; preds = %148, %116
br label %126
126: ; preds = %133, %125
%127 = load float*, float** %6
%128 = load float, float* %127
%129 = load float*, float** %10
%130 = getelementptr inbounds float, float* %129, i32 1
store float* %130, float** %10
%131 = load float, float* %130
%132 = fcmp ogt float %128, %131
br i1 %132, label %133, label %134
133: ; preds = %126
br label %126
134: ; preds = %126
br label %135
135: ; preds = %142, %134
%136 = load float*, float** %11
%137 = getelementptr inbounds float, float* %136, i32 -1
store float* %137, float** %11
%138 = load float, float* %137
%139 = load float*, float** %6
%140 = load float, float* %139
%141 = fcmp ogt float %138, %140
br i1 %141, label %142, label %143
142: ; preds = %135
br label %135
143: ; preds = %135
%144 = load float*, float** %11
%145 = load float*, float** %10
%146 = icmp ult float* %144, %145
br i1 %146, label %147, label %148
147: ; preds = %143
br label %156
148: ; preds = %143
%149 = load float*, float** %10
%150 = load float, float* %149
store float %150, float* %21
%151 = load float*, float** %11
%152 = load float, float* %151
%153 = load float*, float** %10
store float %152, float* %153
%154 = load float, float* %21
%155 = load float*, float** %11
store float %154, float* %155
br label %125
156: ; preds = %147
%157 = load float*, float** %6
%158 = load float, float* %157
store float %158, float* %22
%159 = load float*, float** %11
%160 = load float, float* %159
%161 = load float*, float** %6
store float %160, float* %161
%162 = load float, float* %22
%163 = load float*, float** %11
store float %162, float* %163
%164 = load float*, float** %11
%165 = load float*, float** %8
%166 = icmp ule float* %164, %165
br i1 %166, label %167, label %169
167: ; preds = %156
%168 = load float*, float** %10
store float* %168, float** %6
br label %169
169: ; preds = %167, %156
%170 = load float*, float** %11
%171 = load float*, float** %8
%172 = icmp uge float* %170, %171
br i1 %172, label %173, label %176
173: ; preds = %169
%174 = load float*, float** %11
%175 = getelementptr inbounds float, float* %174, i64 -1
store float* %175, float** %7
br label %176
176: ; preds = %173, %169
br label %60
177: ; preds = %60
%178 = load float*, float** %7
%179 = load float*, float** %10
%180 = icmp eq float* %178, %179
br i1 %180, label %181, label %195
181: ; preds = %177
%182 = load float*, float** %6
%183 = load float, float* %182
%184 = load float*, float** %7
%185 = load float, float* %184
%186 = fcmp ogt float %183, %185
br i1 %186, label %187, label %195
187: ; preds = %181
%188 = load float*, float** %6
%189 = load float, float* %188
store float %189, float* %23
%190 = load float*, float** %7
%191 = load float, float* %190
%192 = load float*, float** %6
store float %191, float* %192
%193 = load float, float* %23
%194 = load float*, float** %7
store float %193, float* %194
br label %195
195: ; preds = %187, %181, %177
%196 = load i32, i32* %5
%197 = and i32 %196, 1
%198 = icmp ne i32 %197, 0
br i1 %198, label %199, label %202
199: ; preds = %195
%200 = load float*, float** %8
%201 = load float, float* %200
store float %201, float* %3
br label %247
202: ; preds = %195
%203 = load float*, float** %8
%204 = load float, float* %203
store float %204, float* %14
store float 0xC6293E5940000000, float* %13
%205 = load float*, float** %4
store float* %205, float** %6
store i32 0, i32* %16
%206 = load i32, i32* %5
%207 = sdiv i32 %206, 2
store i32 %207, i32* %15
br label %208
208: ; preds = %227, %202
%209 = load i32, i32* %15
%210 = add nsw i32 %209, -1
store i32 %210, i32* %15
%211 = icmp ne i32 %209, 0
br i1 %211, label %212, label %228
212: ; preds = %208
%213 = load float*, float** %6
%214 = getelementptr inbounds float, float* %213, i32 1
store float* %214, float** %6
%215 = load float, float* %213
store float %215, float* %12
%216 = load float, float* %14
%217 = fcmp olt float %215, %216
br i1 %217, label %218, label %227
218: ; preds = %212
%219 = load i32, i32* %16
%220 = add nsw i32 %219, 1
store i32 %220, i32* %16
%221 = load float, float* %12
%222 = load float, float* %13
%223 = fcmp ogt float %221, %222
br i1 %223, label %224, label %226
224: ; preds = %218
%225 = load float, float* %12
store float %225, float* %13
br label %226
226: ; preds = %224, %218
br label %227
227: ; preds = %226, %212
br label %208
228: ; preds = %208
%229 = load i32, i32* %16
%230 = load i32, i32* %5
%231 = sdiv i32 %230, 2
%232 = icmp slt i32 %229, %231
br i1 %232, label %233, label %237
233: ; preds = %228
%234 = load float*, float** %8
%235 = load float, float* %234
%236 = fpext float %235 to double
br label %244
237: ; preds = %228
%238 = load float*, float** %8
%239 = load float, float* %238
%240 = load float, float* %13
%241 = fadd float %239, %240
%242 = fpext float %241 to double
%243 = fdiv double %242, 2.000000e+00
br label %244
244: ; preds = %237, %233
%245 = phi double [ %236, %233 ], [ %243, %237 ]
%246 = fptrunc double %245 to float
store float %246, float* %3
br label %247
247: ; preds = %244, %199, %36, %30, %26
%248 = load float, float* %3
ret float %248
}

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