#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int floatmax(int, float *);
float floatmin(int, float *);
float nth(int ndat, float *dat, float n) {
  float a, temp;
  int i, nmax;
  float s;
  int nsame;
  if (n >= ndat - 1)
    return dat[ndat - 1];
  if (ndat == 1 || n < 0)
    return dat[0];
  if (ndat <= 2) {
    if (dat[0] < dat[1])
      return (dat[0] * (1. - n) + n * dat[1]);
    else
      return (dat[1] * (1. - n) + n * dat[0]);
  }
  a = dat[0];
  nmax = ndat;
  nsame = 1;
  for (i = 1; i < nmax; i++) {
    if (dat[i] > a) {
      temp = dat[i];
      dat[i] = dat[nmax - 1];
      dat[nmax - 1] = temp;
      nmax--;
      i--;
    } else if (dat[i] == a) {
      temp = dat[i];
      dat[i] = dat[nsame];
      dat[nsame] = temp;
      nsame++;
    }
  }
  if (nmax == ndat) {
    if (nmax - nsame <= n) {
      return a;
    } else if (nmax - nsame - 1 > n) {
      return nth(nmax - nsame, dat + nsame, n);
    } else {
      s = n - (nmax - nsame - 1);
      return (floatmax(nmax - nsame, dat + nsame) * (1. - s) + s * dat[0]);
    }
  }
  if (n < nmax - nsame - 1) {
    return nth(nmax - nsame, dat + nsame, n);
  } else if (n < nmax - nsame) {
    s = n - (nmax - nsame - 1);
    return (floatmax(nmax - nsame, dat + nsame) * (1. - s) + s * dat[0]);
  } else if (n <= nmax - 1) {
    return a;
  } else if (n < nmax) {
    s = n - (nmax - 1);
    return (dat[0] * (1. - s) + s * floatmin(ndat - nmax, dat + nmax));
  } else {
    return nth(ndat - nmax, dat + nmax, n - nmax);
  }
}


x86 assembly (clang, -O0):
<nth>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
ucomiss %xmm1,%xmm0
jb     1178 <nth+0x48>
mov    -0x10(%rbp),%rax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
cmpl   $0x1,-0x8(%rbp)
je     118f <nth+0x5f>
xorps  %xmm0,%xmm0
ucomiss -0x14(%rbp),%xmm0
jbe    11a1 <nth+0x71>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
cmpl   $0x2,-0x8(%rbp)
jg     1257 <nth+0x127>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    120e <nth+0xde>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe1e(%rip),%xmm2
subsd  %xmm1,%xmm2
movss  -0x14(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mulss  0x4(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xdd4(%rip),%xmm2
subsd  %xmm1,%xmm2
movss  -0x14(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mulss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x24(%rbp)
movl   $0x1,-0x2c(%rbp)
movl   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1376 <nth+0x246>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x18(%rbp),%xmm0
jbe    12fa <nth+0x1ca>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x1c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1363 <nth+0x233>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x18(%rbp),%xmm0
jne    135e <nth+0x22e>
jp     135e <nth+0x22e>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x1c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1363 <nth+0x233>
jmp    1368 <nth+0x238>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1278 <nth+0x148>
mov    -0x24(%rbp),%eax
cmp    -0x8(%rbp),%eax
jne    145e <nth+0x32e>
mov    -0x24(%rbp),%eax
sub    -0x2c(%rbp),%eax
cvtsi2ss %eax,%xmm1
movss  -0x14(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     13a9 <nth+0x279>
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
mov    -0x24(%rbp),%eax
sub    -0x2c(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm0
ucomiss -0x14(%rbp),%xmm0
jbe    13e9 <nth+0x2b9>
mov    -0x24(%rbp),%edi
sub    -0x2c(%rbp),%edi
mov    -0x10(%rbp),%rsi
movslq -0x2c(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rsi
movss  -0x14(%rbp),%xmm0
call   1050 <nth@plt>
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
movss  -0x14(%rbp),%xmm0
mov    -0x24(%rbp),%eax
sub    -0x2c(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x24(%rbp),%edi
sub    -0x2c(%rbp),%edi
mov    -0x10(%rbp),%rsi
movslq -0x2c(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rsi
call   1040 <floatmax@plt>
cvtsi2sd %eax,%xmm0
movss  -0x28(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xbcd(%rip),%xmm2
subsd  %xmm1,%xmm2
movss  -0x28(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mulss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
movss  -0x14(%rbp),%xmm1
mov    -0x24(%rbp),%eax
sub    -0x2c(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm0
ucomiss %xmm1,%xmm0
jbe    14a2 <nth+0x372>
mov    -0x24(%rbp),%edi
sub    -0x2c(%rbp),%edi
mov    -0x10(%rbp),%rsi
movslq -0x2c(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rsi
movss  -0x14(%rbp),%xmm0
call   1050 <nth@plt>
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
movss  -0x14(%rbp),%xmm1
mov    -0x24(%rbp),%eax
sub    -0x2c(%rbp),%eax
cvtsi2ss %eax,%xmm0
ucomiss %xmm1,%xmm0
jbe    152f <nth+0x3ff>
movss  -0x14(%rbp),%xmm0
mov    -0x24(%rbp),%eax
sub    -0x2c(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x24(%rbp),%edi
sub    -0x2c(%rbp),%edi
mov    -0x10(%rbp),%rsi
movslq -0x2c(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rsi
call   1040 <floatmax@plt>
cvtsi2sd %eax,%xmm0
movss  -0x28(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xafc(%rip),%xmm2
subsd  %xmm1,%xmm2
movss  -0x28(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mulss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
movss  -0x14(%rbp),%xmm1
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm0
ucomiss %xmm1,%xmm0
jb     1556 <nth+0x426>
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
movss  -0x14(%rbp),%xmm1
cvtsi2ssl -0x24(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1600 <nth+0x4d0>
movss  -0x14(%rbp),%xmm0
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xa5d(%rip),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x8(%rbp),%edi
sub    -0x24(%rbp),%edi
mov    -0x10(%rbp),%rsi
movslq -0x24(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rsi
call   1030 <floatmin@plt>
movss  -0x44(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
movaps %xmm0,%xmm3
movsd  -0x38(%rbp),%xmm0
mulss  %xmm3,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    162d <nth+0x4fd>
mov    -0x8(%rbp),%edi
sub    -0x24(%rbp),%edi
mov    -0x10(%rbp),%rsi
movslq -0x24(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rsi
movss  -0x14(%rbp),%xmm0
cvtsi2ssl -0x24(%rbp),%xmm1
subss  %xmm1,%xmm0
call   1050 <nth@plt>
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<nth>:
push   %rbx
sub    $0x10,%rsp
mov    %edi,%r8d
lea    -0x1(%r8),%eax
cvtsi2ss %eax,%xmm1
mov    %rsi,%rbx
ucomiss %xmm1,%xmm0
jae    1288 <nth+0x168>
movaps %xmm0,%xmm4
xorps  %xmm1,%xmm1
mov    %r8d,%edi
jmp    1160 <nth+0x40>
nopw   0x0(%rax,%rax,1)
movslq %edx,%rcx
lea    (%rbx,%rcx,4),%rbx
ucomiss %xmm2,%xmm4
jae    1288 <nth+0x168>
cmp    $0x1,%edi
je     1295 <nth+0x175>
ucomiss %xmm4,%xmm1
ja     1295 <nth+0x175>
movss  (%rbx),%xmm0
cmp    $0x3,%edi
jl     129b <nth+0x17b>
mov    $0x1,%edx
mov    %edi,%esi
mov    $0x1,%eax
jmp    11b3 <nth+0x93>
nopl   (%rax)
movslq %esi,%rax
add    $0xffffffff,%esi
movss  -0x4(%rbx,%rax,4),%xmm3
movss  %xmm3,(%rbx,%rcx,4)
movss  %xmm2,-0x4(%rbx,%rax,4)
add    $0xffffffff,%ecx
mov    %ecx,%eax
add    $0x1,%eax
cmp    %esi,%eax
jge    11e0 <nth+0xc0>
movslq %eax,%rcx
movss  (%rbx,%rcx,4),%xmm2
ucomiss %xmm0,%xmm2
ja     1190 <nth+0x70>
jne    11ac <nth+0x8c>
jp     11ac <nth+0x8c>
movslq %edx,%rdx
movss  (%rbx,%rdx,4),%xmm3
movss  %xmm3,(%rbx,%rcx,4)
movss  %xmm2,(%rbx,%rdx,4)
add    $0x1,%edx
jmp    11ac <nth+0x8c>
nopl   0x0(%rax,%rax,1)
mov    %edi,%r8d
sub    %esi,%r8d
jne    1220 <nth+0x100>
sub    %edx,%edi
xorps  %xmm2,%xmm2
cvtsi2ss %edi,%xmm2
ucomiss %xmm2,%xmm4
jae    128f <nth+0x16f>
lea    -0x1(%rdi),%eax
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
ucomiss %xmm4,%xmm2
ja     1150 <nth+0x30>
jmp    12fa <nth+0x1da>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %esi,%ecx
sub    %edx,%ecx
lea    -0x1(%rcx),%eax
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
ucomiss %xmm4,%xmm2
jbe    123a <nth+0x11a>
mov    %ecx,%edi
jmp    1150 <nth+0x30>
xorps  %xmm3,%xmm3
cvtsi2ss %ecx,%xmm3
ucomiss %xmm4,%xmm3
ja     134c <nth+0x22c>
lea    -0x1(%rsi),%eax
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
ucomiss %xmm4,%xmm2
jae    128f <nth+0x16f>
xorps  %xmm0,%xmm0
cvtsi2ss %esi,%xmm0
ucomiss %xmm4,%xmm0
ja     1361 <nth+0x241>
movslq %esi,%rcx
lea    -0x1(%r8),%eax
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
lea    (%rbx,%rcx,4),%rbx
subss  %xmm0,%xmm4
ucomiss %xmm2,%xmm4
jb     1142 <nth+0x22>
cltq
movss  (%rbx,%rax,4),%xmm0
add    $0x10,%rsp
pop    %rbx
ret
movss  (%rbx),%xmm0
jmp    128f <nth+0x16f>
movss  0x4(%rbx),%xmm1
ucomiss %xmm0,%xmm1
jbe    12cd <nth+0x1ad>
cvtss2sd %xmm0,%xmm0
xorps  %xmm2,%xmm2
cvtss2sd %xmm4,%xmm2
movsd  0xd48(%rip),%xmm3
subsd  %xmm2,%xmm3
mulsd  %xmm0,%xmm3
mulss  %xmm4,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
jmp    12f0 <nth+0x1d0>
cvtss2sd %xmm1,%xmm1
xorps  %xmm2,%xmm2
cvtss2sd %xmm4,%xmm2
movsd  0xd20(%rip),%xmm3
subsd  %xmm2,%xmm3
mulsd  %xmm1,%xmm3
mulss  %xmm4,%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm3,%xmm0
cvtsd2ss %xmm0,%xmm0
jmp    128f <nth+0x16f>
subss  %xmm2,%xmm4
movss  %xmm4,0x4(%rsp)
movslq %edx,%rax
lea    (%rbx,%rax,4),%rsi
call   1040 <floatmax@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movss  0x4(%rsp),%xmm3
xorps  %xmm1,%xmm1
cvtss2sd %xmm3,%xmm1
movsd  0xcd4(%rip),%xmm2
subsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
mulss  (%rbx),%xmm3
xorps  %xmm0,%xmm0
cvtss2sd %xmm3,%xmm0
addsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
jmp    128f <nth+0x16f>
subss  %xmm2,%xmm4
movss  %xmm4,0x4(%rsp)
movslq %edx,%rax
lea    (%rbx,%rax,4),%rsi
mov    %ecx,%edi
jmp    130b <nth+0x1eb>
subss  %xmm2,%xmm4
movss  %xmm4,0x4(%rsp)
movss  (%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm4,%xmm1
movsd  0xc7e(%rip),%xmm2
subsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,0x8(%rsp)
sub    %esi,%edi
movslq %esi,%rax
lea    (%rbx,%rax,4),%rsi
call   1030 <floatmin@plt>
mulss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0x8(%rsp),%xmm0
cvtsd2ss %xmm0,%xmm0
jmp    128f <nth+0x16f>

LLVM IR (-O0):
define float @nth(i32 %0, float* %1, float %2) {
%4 = alloca float
%5 = alloca i32
%6 = alloca float*
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca i32
%11 = alloca i32
%12 = alloca float
%13 = alloca i32
store i32 %0, i32* %5
store float* %1, float** %6
store float %2, float* %7
%14 = load float, float* %7
%15 = load i32, i32* %5
%16 = sub nsw i32 %15, 1
%17 = sitofp i32 %16 to float
%18 = fcmp oge float %14, %17
br i1 %18, label %19, label %26
19: ; preds = %3
%20 = load float*, float** %6
%21 = load i32, i32* %5
%22 = sub nsw i32 %21, 1
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds float, float* %20, i64 %23
%25 = load float, float* %24
store float %25, float* %4
br label %321
26: ; preds = %3
%27 = load i32, i32* %5
%28 = icmp eq i32 %27, 1
br i1 %28, label %32, label %29
29: ; preds = %26
%30 = load float, float* %7
%31 = fcmp olt float %30, 0.000000e+00
br i1 %31, label %32, label %36
32: ; preds = %29, %26
%33 = load float*, float** %6
%34 = getelementptr inbounds float, float* %33, i64 0
%35 = load float, float* %34
store float %35, float* %4
br label %321
36: ; preds = %29
%37 = load i32, i32* %5
%38 = icmp sle i32 %37, 2
br i1 %38, label %39, label %79
39: ; preds = %36
%40 = load float*, float** %6
%41 = getelementptr inbounds float, float* %40, i64 0
%42 = load float, float* %41
%43 = load float*, float** %6
%44 = getelementptr inbounds float, float* %43, i64 1
%45 = load float, float* %44
%46 = fcmp olt float %42, %45
br i1 %46, label %47, label %63
47: ; preds = %39
%48 = load float*, float** %6
%49 = getelementptr inbounds float, float* %48, i64 0
%50 = load float, float* %49
%51 = fpext float %50 to double
%52 = load float, float* %7
%53 = fpext float %52 to double
%54 = fsub double 1.000000e+00, %53
%55 = load float, float* %7
%56 = load float*, float** %6
%57 = getelementptr inbounds float, float* %56, i64 1
%58 = load float, float* %57
%59 = fmul float %55, %58
%60 = fpext float %59 to double
%61 = call double @llvm.fmuladd.f64(double %51, double %54, double %60)
%62 = fptrunc double %61 to float
store float %62, float* %4
br label %321
63: ; preds = %39
%64 = load float*, float** %6
%65 = getelementptr inbounds float, float* %64, i64 1
%66 = load float, float* %65
%67 = fpext float %66 to double
%68 = load float, float* %7
%69 = fpext float %68 to double
%70 = fsub double 1.000000e+00, %69
%71 = load float, float* %7
%72 = load float*, float** %6
%73 = getelementptr inbounds float, float* %72, i64 0
%74 = load float, float* %73
%75 = fmul float %71, %74
%76 = fpext float %75 to double
%77 = call double @llvm.fmuladd.f64(double %67, double %70, double %76)
%78 = fptrunc double %77 to float
store float %78, float* %4
br label %321
79: ; preds = %36
%80 = load float*, float** %6
%81 = getelementptr inbounds float, float* %80, i64 0
%82 = load float, float* %81
store float %82, float* %8
%83 = load i32, i32* %5
store i32 %83, i32* %11
store i32 1, i32* %13
store i32 1, i32* %10
br label %84
84: ; preds = %154, %79
%85 = load i32, i32* %10
%86 = load i32, i32* %11
%87 = icmp slt i32 %85, %86
br i1 %87, label %88, label %157
88: ; preds = %84
%89 = load float*, float** %6
%90 = load i32, i32* %10
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds float, float* %89, i64 %91
%93 = load float, float* %92
%94 = load float, float* %8
%95 = fcmp ogt float %93, %94
br i1 %95, label %96, label %122
96: ; preds = %88
%97 = load float*, float** %6
%98 = load i32, i32* %10
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds float, float* %97, i64 %99
%101 = load float, float* %100
store float %101, float* %9
%102 = load float*, float** %6
%103 = load i32, i32* %11
%104 = sub nsw i32 %103, 1
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds float, float* %102, i64 %105
%107 = load float, float* %106
%108 = load float*, float** %6
%109 = load i32, i32* %10
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds float, float* %108, i64 %110
store float %107, float* %111
%112 = load float, float* %9
%113 = load float*, float** %6
%114 = load i32, i32* %11
%115 = sub nsw i32 %114, 1
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds float, float* %113, i64 %116
store float %112, float* %117
%118 = load i32, i32* %11
%119 = add nsw i32 %118, -1
store i32 %119, i32* %11
%120 = load i32, i32* %10
%121 = add nsw i32 %120, -1
store i32 %121, i32* %10
br label %153
122: ; preds = %88
%123 = load float*, float** %6
%124 = load i32, i32* %10
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds float, float* %123, i64 %125
%127 = load float, float* %126
%128 = load float, float* %8
%129 = fcmp oeq float %127, %128
br i1 %129, label %130, label %152
130: ; preds = %122
%131 = load float*, float** %6
%132 = load i32, i32* %10
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds float, float* %131, i64 %133
%135 = load float, float* %134
store float %135, float* %9
%136 = load float*, float** %6
%137 = load i32, i32* %13
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds float, float* %136, i64 %138
%140 = load float, float* %139
%141 = load float*, float** %6
%142 = load i32, i32* %10
%143 = sext i32 %142 to i64
%144 = getelementptr inbounds float, float* %141, i64 %143
store float %140, float* %144
%145 = load float, float* %9
%146 = load float*, float** %6
%147 = load i32, i32* %13
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds float, float* %146, i64 %148
store float %145, float* %149
%150 = load i32, i32* %13
%151 = add nsw i32 %150, 1
store i32 %151, i32* %13
br label %152
152: ; preds = %130, %122
br label %153
153: ; preds = %152, %96
br label %154
154: ; preds = %153
%155 = load i32, i32* %10
%156 = add nsw i32 %155, 1
store i32 %156, i32* %10
br label %84
157: ; preds = %84
%158 = load i32, i32* %11
%159 = load i32, i32* %5
%160 = icmp eq i32 %158, %159
br i1 %160, label %161, label %216
161: ; preds = %157
%162 = load i32, i32* %11
%163 = load i32, i32* %13
%164 = sub nsw i32 %162, %163
%165 = sitofp i32 %164 to float
%166 = load float, float* %7
%167 = fcmp ole float %165, %166
br i1 %167, label %168, label %170
168: ; preds = %161
%169 = load float, float* %8
store float %169, float* %4
br label %321
170: ; preds = %161
%171 = load i32, i32* %11
%172 = load i32, i32* %13
%173 = sub nsw i32 %171, %172
%174 = sub nsw i32 %173, 1
%175 = sitofp i32 %174 to float
%176 = load float, float* %7
%177 = fcmp ogt float %175, %176
br i1 %177, label %178, label %188
178: ; preds = %170
%179 = load i32, i32* %11
%180 = load i32, i32* %13
%181 = sub nsw i32 %179, %180
%182 = load float*, float** %6
%183 = load i32, i32* %13
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds float, float* %182, i64 %184
%186 = load float, float* %7
%187 = call float @nth(i32 %181, float* %185, float %186)
store float %187, float* %4
br label %321
188: ; preds = %170
%189 = load float, float* %7
%190 = load i32, i32* %11
%191 = load i32, i32* %13
%192 = sub nsw i32 %190, %191
%193 = sub nsw i32 %192, 1
%194 = sitofp i32 %193 to float
%195 = fsub float %189, %194
store float %195, float* %12
%196 = load i32, i32* %11
%197 = load i32, i32* %13
%198 = sub nsw i32 %196, %197
%199 = load float*, float** %6
%200 = load i32, i32* %13
%201 = sext i32 %200 to i64
%202 = getelementptr inbounds float, float* %199, i64 %201
%203 = call i32 @floatmax(i32 %198, float* %202)
%204 = sitofp i32 %203 to double
%205 = load float, float* %12
%206 = fpext float %205 to double
%207 = fsub double 1.000000e+00, %206
%208 = load float, float* %12
%209 = load float*, float** %6
%210 = getelementptr inbounds float, float* %209, i64 0
%211 = load float, float* %210
%212 = fmul float %208, %211
%213 = fpext float %212 to double
%214 = call double @llvm.fmuladd.f64(double %204, double %207, double %213)
%215 = fptrunc double %214 to float
store float %215, float* %4
br label %321
216: ; preds = %157
%217 = load float, float* %7
%218 = load i32, i32* %11
%219 = load i32, i32* %13
%220 = sub nsw i32 %218, %219
%221 = sub nsw i32 %220, 1
%222 = sitofp i32 %221 to float
%223 = fcmp olt float %217, %222
br i1 %223, label %224, label %234
224: ; preds = %216
%225 = load i32, i32* %11
%226 = load i32, i32* %13
%227 = sub nsw i32 %225, %226
%228 = load float*, float** %6
%229 = load i32, i32* %13
%230 = sext i32 %229 to i64
%231 = getelementptr inbounds float, float* %228, i64 %230
%232 = load float, float* %7
%233 = call float @nth(i32 %227, float* %231, float %232)
store float %233, float* %4
br label %321
234: ; preds = %216
%235 = load float, float* %7
%236 = load i32, i32* %11
%237 = load i32, i32* %13
%238 = sub nsw i32 %236, %237
%239 = sitofp i32 %238 to float
%240 = fcmp olt float %235, %239
br i1 %240, label %241, label %269
241: ; preds = %234
%242 = load float, float* %7
%243 = load i32, i32* %11
%244 = load i32, i32* %13
%245 = sub nsw i32 %243, %244
%246 = sub nsw i32 %245, 1
%247 = sitofp i32 %246 to float
%248 = fsub float %242, %247
store float %248, float* %12
%249 = load i32, i32* %11
%250 = load i32, i32* %13
%251 = sub nsw i32 %249, %250
%252 = load float*, float** %6
%253 = load i32, i32* %13
%254 = sext i32 %253 to i64
%255 = getelementptr inbounds float, float* %252, i64 %254
%256 = call i32 @floatmax(i32 %251, float* %255)
%257 = sitofp i32 %256 to double
%258 = load float, float* %12
%259 = fpext float %258 to double
%260 = fsub double 1.000000e+00, %259
%261 = load float, float* %12
%262 = load float*, float** %6
%263 = getelementptr inbounds float, float* %262, i64 0
%264 = load float, float* %263
%265 = fmul float %261, %264
%266 = fpext float %265 to double
%267 = call double @llvm.fmuladd.f64(double %257, double %260, double %266)
%268 = fptrunc double %267 to float
store float %268, float* %4
br label %321
269: ; preds = %234
%270 = load float, float* %7
%271 = load i32, i32* %11
%272 = sub nsw i32 %271, 1
%273 = sitofp i32 %272 to float
%274 = fcmp ole float %270, %273
br i1 %274, label %275, label %277
275: ; preds = %269
%276 = load float, float* %8
store float %276, float* %4
br label %321
277: ; preds = %269
%278 = load float, float* %7
%279 = load i32, i32* %11
%280 = sitofp i32 %279 to float
%281 = fcmp olt float %278, %280
br i1 %281, label %282, label %308
282: ; preds = %277
%283 = load float, float* %7
%284 = load i32, i32* %11
%285 = sub nsw i32 %284, 1
%286 = sitofp i32 %285 to float
%287 = fsub float %283, %286
store float %287, float* %12
%288 = load float*, float** %6
%289 = getelementptr inbounds float, float* %288, i64 0
%290 = load float, float* %289
%291 = fpext float %290 to double
%292 = load float, float* %12
%293 = fpext float %292 to double
%294 = fsub double 1.000000e+00, %293
%295 = load float, float* %12
%296 = load i32, i32* %5
%297 = load i32, i32* %11
%298 = sub nsw i32 %296, %297
%299 = load float*, float** %6
%300 = load i32, i32* %11
%301 = sext i32 %300 to i64
%302 = getelementptr inbounds float, float* %299, i64 %301
%303 = call float @floatmin(i32 %298, float* %302)
%304 = fmul float %295, %303
%305 = fpext float %304 to double
%306 = call double @llvm.fmuladd.f64(double %291, double %294, double %305)
%307 = fptrunc double %306 to float
store float %307, float* %4
br label %321
308: ; preds = %277
%309 = load i32, i32* %5
%310 = load i32, i32* %11
%311 = sub nsw i32 %309, %310
%312 = load float*, float** %6
%313 = load i32, i32* %11
%314 = sext i32 %313 to i64
%315 = getelementptr inbounds float, float* %312, i64 %314
%316 = load float, float* %7
%317 = load i32, i32* %11
%318 = sitofp i32 %317 to float
%319 = fsub float %316, %318
%320 = call float @nth(i32 %311, float* %315, float %319)
store float %320, float* %4
br label %321
321: ; preds = %308, %282, %275, %241, %224, %188, %178, %168, %63, %47, %32, %19
%322 = load float, float* %4
ret float %322
}

LLVM IR (-O2):
define float @nth(i32 %0, float* %1, float %2) {
%4 = add nsw i32 %0, -1
%5 = sitofp i32 %4 to float
%6 = fcmp ugt float %5, %2
br i1 %6, label %7, label %12
7: ; preds = %3, %147
%8 = phi float [ %151, %147 ], [ %2, %3 ]
%9 = phi float* [ %150, %147 ], [ %1, %3 ]
%10 = phi i32 [ %148, %147 ], [ %0, %3 ]
%11 = fcmp olt float %8, 0.000000e+00
br label %18
12: ; preds = %147, %85, %3
%13 = phi float* [ %1, %3 ], [ %90, %85 ], [ %150, %147 ]
%14 = phi i32 [ %4, %3 ], [ %87, %85 ], [ %152, %147 ]
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds float, float* %13, i64 %15
%17 = load float, float* %16
br label %155
18: ; preds = %7, %85
%19 = phi float* [ %9, %7 ], [ %90, %85 ]
%20 = phi i32 [ %10, %7 ], [ %88, %85 ]
%21 = icmp eq i32 %20, 1
%22 = or i1 %21, %11
br i1 %22, label %23, label %25
23: ; preds = %18
%24 = load float, float* %19
br label %155
25: ; preds = %18
%26 = icmp slt i32 %20, 3
%27 = load float, float* %19
br i1 %26, label %28, label %48
28: ; preds = %25
%29 = getelementptr inbounds float, float* %19, i64 1
%30 = load float, float* %29
%31 = fcmp olt float %27, %30
br i1 %31, label %32, label %40
32: ; preds = %28
%33 = fpext float %27 to double
%34 = fpext float %8 to double
%35 = fsub double 1.000000e+00, %34
%36 = fmul float %8, %30
%37 = fpext float %36 to double
%38 = tail call double @llvm.fmuladd.f64(double %33, double %35, double %37)
%39 = fptrunc double %38 to float
br label %155
40: ; preds = %28
%41 = fpext float %30 to double
%42 = fpext float %8 to double
%43 = fsub double 1.000000e+00, %42
%44 = fmul float %8, %27
%45 = fpext float %44 to double
%46 = tail call double @llvm.fmuladd.f64(double %41, double %43, double %45)
%47 = fptrunc double %46 to float
br label %155
48: ; preds = %25, %69
%49 = phi i32 [ %72, %69 ], [ 1, %25 ]
%50 = phi i32 [ %71, %69 ], [ %20, %25 ]
%51 = phi i32 [ %73, %69 ], [ 1, %25 ]
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds float, float* %19, i64 %52
%54 = load float, float* %53
%55 = fcmp ogt float %54, %27
br i1 %55, label %56, label %62
56: ; preds = %48
%57 = add nsw i32 %50, -1
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds float, float* %19, i64 %58
%60 = load float, float* %59
store float %60, float* %53
store float %54, float* %59
%61 = add nsw i32 %51, -1
br label %69
62: ; preds = %48
%63 = fcmp oeq float %54, %27
br i1 %63, label %64, label %69
64: ; preds = %62
%65 = sext i32 %49 to i64
%66 = getelementptr inbounds float, float* %19, i64 %65
%67 = load float, float* %66
store float %67, float* %53
store float %54, float* %66
%68 = add nsw i32 %49, 1
br label %69
69: ; preds = %56, %64, %62
%70 = phi i32 [ %61, %56 ], [ %51, %64 ], [ %51, %62 ]
%71 = phi i32 [ %57, %56 ], [ %50, %64 ], [ %50, %62 ]
%72 = phi i32 [ %49, %56 ], [ %68, %64 ], [ %49, %62 ]
%73 = add nsw i32 %70, 1
%74 = icmp slt i32 %73, %71
br i1 %74, label %48, label %75
75: ; preds = %69
%76 = icmp eq i32 %20, %71
br i1 %76, label %77, label %105
77: ; preds = %75
%78 = sub nsw i32 %20, %72
%79 = sitofp i32 %78 to float
%80 = fcmp ult float %8, %79
br i1 %80, label %81, label %155
81: ; preds = %77
%82 = add nsw i32 %78, -1
%83 = sitofp i32 %82 to float
%84 = fcmp olt float %8, %83
br i1 %84, label %85, label %92
85: ; preds = %105, %81
%86 = phi float [ %83, %81 ], [ %108, %105 ]
%87 = phi i32 [ %82, %81 ], [ %107, %105 ]
%88 = phi i32 [ %78, %81 ], [ %106, %105 ]
%89 = sext i32 %72 to i64
%90 = getelementptr inbounds float, float* %19, i64 %89
%91 = fcmp ult float %8, %86
br i1 %91, label %18, label %12
92: ; preds = %81
%93 = fsub float %8, %83
%94 = sext i32 %72 to i64
%95 = getelementptr inbounds float, float* %19, i64 %94
%96 = tail call i32 @floatmax(i32 %78, float* %95)
%97 = sitofp i32 %96 to double
%98 = fpext float %93 to double
%99 = fsub double 1.000000e+00, %98
%100 = load float, float* %19
%101 = fmul float %93, %100
%102 = fpext float %101 to double
%103 = tail call double @llvm.fmuladd.f64(double %97, double %99, double %102)
%104 = fptrunc double %103 to float
br label %155
105: ; preds = %75
%106 = sub nsw i32 %71, %72
%107 = add nsw i32 %106, -1
%108 = sitofp i32 %107 to float
%109 = fcmp olt float %8, %108
br i1 %109, label %85, label %110
110: ; preds = %105
%111 = sitofp i32 %106 to float
%112 = fcmp olt float %8, %111
br i1 %112, label %113, label %126
113: ; preds = %110
%114 = fsub float %8, %108
%115 = sext i32 %72 to i64
%116 = getelementptr inbounds float, float* %19, i64 %115
%117 = tail call i32 @floatmax(i32 %106, float* %116)
%118 = sitofp i32 %117 to double
%119 = fpext float %114 to double
%120 = fsub double 1.000000e+00, %119
%121 = load float, float* %19
%122 = fmul float %114, %121
%123 = fpext float %122 to double
%124 = tail call double @llvm.fmuladd.f64(double %118, double %120, double %123)
%125 = fptrunc double %124 to float
br label %155
126: ; preds = %110
%127 = add nsw i32 %71, -1
%128 = sitofp i32 %127 to float
%129 = fcmp ugt float %8, %128
br i1 %129, label %130, label %155
130: ; preds = %126
%131 = sitofp i32 %71 to float
%132 = fcmp olt float %8, %131
br i1 %132, label %133, label %147
133: ; preds = %130
%134 = fsub float %8, %128
%135 = load float, float* %19
%136 = fpext float %135 to double
%137 = fpext float %134 to double
%138 = fsub double 1.000000e+00, %137
%139 = sub nsw i32 %20, %71
%140 = sext i32 %71 to i64
%141 = getelementptr inbounds float, float* %19, i64 %140
%142 = tail call float @floatmin(i32 %139, float* %141)
%143 = fmul float %134, %142
%144 = fpext float %143 to double
%145 = tail call double @llvm.fmuladd.f64(double %136, double %138, double %144)
%146 = fptrunc double %145 to float
br label %155
147: ; preds = %130
%148 = sub nsw i32 %20, %71
%149 = sext i32 %71 to i64
%150 = getelementptr inbounds float, float* %19, i64 %149
%151 = fsub float %8, %131
%152 = add nsw i32 %148, -1
%153 = sitofp i32 %152 to float
%154 = fcmp ult float %151, %153
br i1 %154, label %7, label %12
155: ; preds = %126, %77, %133, %113, %92, %40, %32, %23, %12
%156 = phi float [ %17, %12 ], [ %24, %23 ], [ %39, %32 ], [ %47, %40 ], [ %104, %92 ], [ %125, %113 ], [ %146, %133 ], [ %27, %77 ], [ %27, %126 ]
ret float %156
}