int indexx(n, arrin, indx)
long int *n;
double *arrin;
long int *indx;
{
  long int i__1;
  static long int i, j, l;
  static double q;
  static long int ir, indxt;
  --indx;
  --arrin;
  i__1 = *n;
  for (j = 1; j <= i__1; ++j) {
    indx[j] = j;
  }
  if (*n == 1) {
    indx[1] = indx[1] - 1;
    return 0;
  }
  l = *n / 2 + 1;
  ir = *n;
  while (1) {
    if (l > 1) {
      --l;
      indxt = indx[l];
      q = arrin[indxt];
    } else {
      indxt = indx[ir];
      q = arrin[indxt];
      indx[ir] = indx[1];
      --ir;
      if (ir == 1) {
        indx[1] = indxt;
        for (j = 1; j <= i__1; j++)
          indx[j]--;
        return 0;
      }
    }
    i = l;
    j = l + l;
    while (j <= ir) {
      if (j < ir) {
        if (arrin[indx[j]] < arrin[indx[j + 1]]) {
          ++j;
        }
      }
      if (q < arrin[indx[j]]) {
        indx[i] = indx[j];
        i = j;
        j += j;
      } else {
        j = ir + 1;
      }
    }
    indx[i] = indxt;
  }
}


x86 assembly (clang, -O0):
<indexx>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x28(%rbp)
movq   $0x1,0x2ef2(%rip)
mov    0x2eeb(%rip),%rax
cmp    -0x28(%rbp),%rax
jg     117c <indexx+0x7c>
mov    0x2eda(%rip),%rdx
mov    -0x20(%rbp),%rax
mov    0x2ecf(%rip),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    0x2ec4(%rip),%rax
add    $0x1,%rax
mov    %rax,0x2eb9(%rip)
jmp    113e <indexx+0x3e>
mov    -0x10(%rbp),%rax
cmpq   $0x1,(%rax)
jne    11aa <indexx+0xaa>
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rcx
sub    $0x1,%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,0x8(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1435 <indexx+0x335>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
add    $0x1,%rax
mov    %rax,0x2e72(%rip)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,0x2e74(%rip)
cmpq   $0x1,0x2e5c(%rip)
01
jle    1227 <indexx+0x127>
mov    0x2e4f(%rip),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,0x2e44(%rip)
mov    -0x20(%rbp),%rax
mov    0x2e39(%rip),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,0x2e46(%rip)
mov    -0x18(%rbp),%rax
mov    0x2e3b(%rip),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,0x2e1e(%rip)
jmp    12f6 <indexx+0x1f6>
mov    -0x20(%rbp),%rax
mov    0x2e16(%rip),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,0x2e13(%rip)
mov    -0x18(%rbp),%rax
mov    0x2e08(%rip),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,0x2deb(%rip)
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rdx
mov    -0x20(%rbp),%rax
mov    0x2de0(%rip),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    0x2dd5(%rip),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,0x2dca(%rip)
cmpq   $0x1,0x2dc2(%rip)
01
jne    12f1 <indexx+0x1f1>
mov    0x2dbd(%rip),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,0x8(%rax)
movq   $0x1,0x2d8a(%rip)
mov    0x2d83(%rip),%rax
cmp    -0x28(%rbp),%rax
jg     12e5 <indexx+0x1e5>
mov    -0x20(%rbp),%rax
mov    0x2d6e(%rip),%rcx
mov    (%rax,%rcx,8),%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,(%rax,%rcx,8)
mov    0x2d5b(%rip),%rax
add    $0x1,%rax
mov    %rax,0x2d50(%rip)
jmp    12a6 <indexx+0x1a6>
movl   $0x0,-0x4(%rbp)
jmp    1435 <indexx+0x335>
jmp    12f6 <indexx+0x1f6>
mov    0x2d3b(%rip),%rax
mov    %rax,0x2d24(%rip)
mov    0x2d2d(%rip),%rax
add    0x2d26(%rip),%rax
mov    %rax,0x2d17(%rip)
mov    0x2d10(%rip),%rax
cmp    0x2d21(%rip),%rax
jg     141a <indexx+0x31a>
mov    0x2cfc(%rip),%rax
cmp    0x2d0d(%rip),%rax
jge    1393 <indexx+0x293>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    0x2ce0(%rip),%rdx
mov    (%rcx,%rdx,8),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    0x2cc8(%rip),%rdx
mov    0x8(%rcx,%rdx,8),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    138e <indexx+0x28e>
mov    0x2cad(%rip),%rax
add    $0x1,%rax
mov    %rax,0x2ca2(%rip)
jmp    1393 <indexx+0x293>
movsd  0x2ca5(%rip),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    0x2c86(%rip),%rdx
mov    (%rcx,%rdx,8),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    1403 <indexx+0x303>
mov    -0x20(%rbp),%rax
mov    0x2c68(%rip),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x20(%rbp),%rax
mov    0x2c51(%rip),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    0x2c4e(%rip),%rax
mov    %rax,0x2c3f(%rip)
mov    0x2c40(%rip),%rax
add    0x2c39(%rip),%rax
mov    %rax,0x2c32(%rip)
jmp    1415 <indexx+0x315>
mov    0x2c3e(%rip),%rax
add    $0x1,%rax
mov    %rax,0x2c1b(%rip)
jmp    1319 <indexx+0x219>
mov    0x2c2f(%rip),%rdx
mov    -0x20(%rbp),%rax
mov    0x2bfc(%rip),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    11d4 <indexx+0xd4>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<indexx>:
push   %rbx
mov    (%rdi),%r8
mov    %r8,%r11
test   %r8,%r8
jle    12a0 <indexx+0x1a0>
mov    $0x1,%r11d
cmp    $0x4,%r8
jb     1277 <indexx+0x177>
mov    %r8,%r11
and    $0xfffffffffffffffc,%r11
lea    -0x4(%r11),%rax
mov    %rax,%r10
shr    $0x2,%r10
add    $0x1,%r10
mov    %r10d,%r9d
and    $0x3,%r9d
cmp    $0xc,%rax
jae    1152 <indexx+0x52>
movdqa 0xeb5(%rip),%xmm0
xor    %eax,%eax
jmp    1228 <indexx+0x128>
and    $0xfffffffffffffffc,%r10
movdqa 0xea2(%rip),%xmm0
xor    %eax,%eax
movdqa 0xea7(%rip),%xmm8
movdqa 0xeae(%rip),%xmm9
movdqa 0xeb5(%rip),%xmm10
movdqa 0xebd(%rip),%xmm4
movdqa 0xec5(%rip),%xmm5
movdqa 0xecd(%rip),%xmm6
movdqa 0xed5(%rip),%xmm7
movdqa 0xedd(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqa %xmm0,%xmm2
paddq  %xmm8,%xmm2
movdqu %xmm0,(%rdx,%rax,8)
movdqu %xmm2,0x10(%rdx,%rax,8)
movdqa %xmm0,%xmm2
paddq  %xmm9,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm10,%xmm3
movdqu %xmm2,0x20(%rdx,%rax,8)
movdqu %xmm3,0x30(%rdx,%rax,8)
movdqa %xmm0,%xmm2
paddq  %xmm4,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm5,%xmm3
movdqu %xmm2,0x40(%rdx,%rax,8)
movdqu %xmm3,0x50(%rdx,%rax,8)
movdqa %xmm0,%xmm2
paddq  %xmm6,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm7,%xmm3
movdqu %xmm2,0x60(%rdx,%rax,8)
movdqu %xmm3,0x70(%rdx,%rax,8)
add    $0x10,%rax
paddq  %xmm1,%xmm0
add    $0xfffffffffffffffc,%r10
jne    11b0 <indexx+0xb0>
test   %r9,%r9
je     126e <indexx+0x16e>
movdqa 0xddb(%rip),%xmm1
movdqa 0xde3(%rip),%xmm2
nopl   (%rax)
movdqa %xmm0,%xmm3
paddq  %xmm1,%xmm3
lea    0x0(,%rax,8),%rcx
or     $0x8,%rcx
movdqu %xmm0,-0x8(%rdx,%rcx,1)
movdqu %xmm3,0x8(%rdx,%rcx,1)
add    $0x4,%rax
paddq  %xmm2,%xmm0
add    $0xffffffffffffffff,%r9
jne    1240 <indexx+0x140>
cmp    %r11,%r8
je     128e <indexx+0x18e>
or     $0x1,%r11
lea    0x1(%r8),%rax
nopl   0x0(%rax,%rax,1)
mov    %r11,-0x8(%rdx,%r11,8)
add    $0x1,%r11
cmp    %r11,%rax
jne    1280 <indexx+0x180>
mov    (%rdi),%r11
cmp    $0x1,%r11
jne    12a0 <indexx+0x1a0>
addq   $0xffffffffffffffff,(%rdx)
jmp    146e <indexx+0x36e>
mov    %r11,%r10
shr    $0x3f,%r10
add    %r11,%r10
sar    %r10
add    $0x1,%r10
cmp    $0x2,%r10
jl     1352 <indexx+0x252>
jmp    12cf <indexx+0x1cf>
nopl   (%rax)
mov    %r9,-0x8(%rdx,%rax,8)
cmp    $0x2,%r10
jl     1352 <indexx+0x252>
mov    -0x10(%rdx,%r10,8),%r9
add    $0xffffffffffffffff,%r10
movsd  -0x8(%rsi,%r9,8),%xmm0
lea    (%r10,%r10,1),%rdi
mov    %r10,%rax
cmp    %r11,%rdi
jg     12c0 <indexx+0x1c0>
mov    %r10,%rcx
xchg   %ax,%ax
cmp    %r11,%rdi
jge    1310 <indexx+0x210>
mov    -0x8(%rdx,%rdi,8),%rax
mov    (%rdx,%rdi,8),%rbx
movsd  -0x8(%rsi,%rbx,8),%xmm1
ucomisd -0x8(%rsi,%rax,8),%xmm1
jbe    1310 <indexx+0x210>
or     $0x1,%rdi
mov    %rdi,%rax
mov    -0x8(%rdx,%rdi,8),%rdi
movsd  -0x8(%rsi,%rdi,8),%xmm1
ucomisd %xmm0,%xmm1
jbe    1340 <indexx+0x240>
mov    %rdi,-0x8(%rdx,%rcx,8)
lea    (%rax,%rax,1),%rdi
mov    %rax,%rcx
cmp    %r11,%rdi
jle    12f0 <indexx+0x1f0>
jmp    12c0 <indexx+0x1c0>
nopw   0x0(%rax,%rax,1)
mov    %rcx,%rax
mov    %r9,-0x8(%rdx,%rcx,8)
cmp    $0x2,%r10
jge    12cf <indexx+0x1cf>
mov    -0x8(%rdx,%r11,8),%r9
movq   -0x8(%rsi,%r9,8),%xmm0
mov    (%rdx),%rax
mov    %rax,-0x8(%rdx,%r11,8)
add    $0xffffffffffffffff,%r11
cmp    $0x1,%r11
jne    12df <indexx+0x1df>
mov    %r9,(%rdx)
test   %r8,%r8
jle    146e <indexx+0x36e>
mov    $0x1,%eax
cmp    $0x4,%r8
jb     144e <indexx+0x34e>
mov    %r8,%rax
and    $0xfffffffffffffffc,%rax
lea    -0x4(%rax),%rsi
mov    %rsi,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
test   %rsi,%rsi
je     1472 <indexx+0x372>
movabs $0x7ffffffffffffffc,%rdi
ff ff 7f
or     $0x2,%rdi
and    %rcx,%rdi
mov    $0x6,%esi
pcmpeqd %xmm0,%xmm0
nopl   0x0(%rax,%rax,1)
movdqu -0x30(%rdx,%rsi,8),%xmm1
movdqu -0x20(%rdx,%rsi,8),%xmm2
movdqu -0x10(%rdx,%rsi,8),%xmm3
movdqu (%rdx,%rsi,8),%xmm4
paddq  %xmm0,%xmm1
paddq  %xmm0,%xmm2
movdqu %xmm1,-0x30(%rdx,%rsi,8)
movdqu %xmm2,-0x20(%rdx,%rsi,8)
paddq  %xmm0,%xmm3
paddq  %xmm0,%xmm4
movdqu %xmm3,-0x10(%rdx,%rsi,8)
movdqu %xmm4,(%rdx,%rsi,8)
add    $0x8,%rsi
add    $0xfffffffffffffffe,%rdi
jne    13d0 <indexx+0x2d0>
add    $0xfffffffffffffffb,%rsi
test   $0x1,%cl
je     1445 <indexx+0x345>
movdqu -0x8(%rdx,%rsi,8),%xmm0
movdqu 0x8(%rdx,%rsi,8),%xmm1
pcmpeqd %xmm2,%xmm2
paddq  %xmm2,%xmm0
paddq  %xmm2,%xmm1
movdqu %xmm0,-0x8(%rdx,%rsi,8)
movdqu %xmm1,0x8(%rdx,%rsi,8)
cmp    %rax,%r8
je     146e <indexx+0x36e>
or     $0x1,%rax
add    $0xffffffffffffffff,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
addq   $0xffffffffffffffff,(%rdx,%rax,8)
add    $0x1,%rax
cmp    %rax,%r8
jne    1460 <indexx+0x360>
xor    %eax,%eax
pop    %rbx
ret
mov    $0x1,%esi
test   $0x1,%cl
jne    1421 <indexx+0x321>
jmp    1445 <indexx+0x345>

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

LLVM IR (-O2):
define i32 @indexx(i64* nocapture %0, double* nocapture %1, i64* nocapture %2) {
%4 = getelementptr inbounds i64, i64* %2, i64 -1
%5 = getelementptr inbounds double, double* %1, i64 -1
%6 = load i64, i64* %0
%7 = icmp slt i64 %6, 1
br i1 %7, label %88, label %8
8: ; preds = %3
%9 = icmp ult i64 %6, 4
br i1 %9, label %75, label %10
10: ; preds = %8
%11 = and i64 %6, -4
%12 = or i64 %11, 1
%13 = add i64 %11, -4
%14 = lshr exact i64 %13, 2
%15 = add nuw nsw i64 %14, 1
%16 = and i64 %15, 3
%17 = icmp ult i64 %13, 12
br i1 %17, label %55, label %18
18: ; preds = %10
%19 = and i64 %15, 9223372036854775804
br label %20
20: ; preds = %20, %18
%21 = phi i64 [ 0, %18 ], [ %51, %20 ]
%22 = phi <2 x i64> [ <i64 1, i64 2>, %18 ], [ %52, %20 ]
%23 = phi i64 [ 0, %18 ], [ %53, %20 ]
%24 = add <2 x i64> %22, <i64 2, i64 2>
%25 = or i64 %21, 1
%26 = getelementptr inbounds i64, i64* %4, i64 %25
%27 = bitcast i64* %26 to <2 x i64>*
store <2 x i64> %22, <2 x i64>* %27
%28 = getelementptr inbounds i64, i64* %26, i64 2
%29 = bitcast i64* %28 to <2 x i64>*
store <2 x i64> %24, <2 x i64>* %29
%30 = add <2 x i64> %22, <i64 4, i64 4>
%31 = add <2 x i64> %22, <i64 6, i64 6>
%32 = or i64 %21, 5
%33 = getelementptr inbounds i64, i64* %4, i64 %32
%34 = bitcast i64* %33 to <2 x i64>*
store <2 x i64> %30, <2 x i64>* %34
%35 = getelementptr inbounds i64, i64* %33, i64 2
%36 = bitcast i64* %35 to <2 x i64>*
store <2 x i64> %31, <2 x i64>* %36
%37 = add <2 x i64> %22, <i64 8, i64 8>
%38 = add <2 x i64> %22, <i64 10, i64 10>
%39 = or i64 %21, 9
%40 = getelementptr inbounds i64, i64* %4, i64 %39
%41 = bitcast i64* %40 to <2 x i64>*
store <2 x i64> %37, <2 x i64>* %41
%42 = getelementptr inbounds i64, i64* %40, i64 2
%43 = bitcast i64* %42 to <2 x i64>*
store <2 x i64> %38, <2 x i64>* %43
%44 = add <2 x i64> %22, <i64 12, i64 12>
%45 = add <2 x i64> %22, <i64 14, i64 14>
%46 = or i64 %21, 13
%47 = getelementptr inbounds i64, i64* %4, i64 %46
%48 = bitcast i64* %47 to <2 x i64>*
store <2 x i64> %44, <2 x i64>* %48
%49 = getelementptr inbounds i64, i64* %47, i64 2
%50 = bitcast i64* %49 to <2 x i64>*
store <2 x i64> %45, <2 x i64>* %50
%51 = add nuw i64 %21, 16
%52 = add <2 x i64> %22, <i64 16, i64 16>
%53 = add nuw i64 %23, 4
%54 = icmp eq i64 %53, %19
br i1 %54, label %55, label %20
55: ; preds = %20, %10
%56 = phi i64 [ 0, %10 ], [ %51, %20 ]
%57 = phi <2 x i64> [ <i64 1, i64 2>, %10 ], [ %52, %20 ]
%58 = icmp eq i64 %16, 0
br i1 %58, label %73, label %59
59: ; preds = %55, %59
%60 = phi i64 [ %69, %59 ], [ %56, %55 ]
%61 = phi <2 x i64> [ %70, %59 ], [ %57, %55 ]
%62 = phi i64 [ %71, %59 ], [ 0, %55 ]
%63 = add <2 x i64> %61, <i64 2, i64 2>
%64 = or i64 %60, 1
%65 = getelementptr inbounds i64, i64* %4, i64 %64
%66 = bitcast i64* %65 to <2 x i64>*
store <2 x i64> %61, <2 x i64>* %66
%67 = getelementptr inbounds i64, i64* %65, i64 2
%68 = bitcast i64* %67 to <2 x i64>*
store <2 x i64> %63, <2 x i64>* %68
%69 = add nuw i64 %60, 4
%70 = add <2 x i64> %61, <i64 4, i64 4>
%71 = add i64 %62, 1
%72 = icmp eq i64 %71, %16
br i1 %72, label %73, label %59
73: ; preds = %59, %55
%74 = icmp eq i64 %6, %11
br i1 %74, label %82, label %75
75: ; preds = %8, %73
%76 = phi i64 [ 1, %8 ], [ %12, %73 ]
br label %77
77: ; preds = %75, %77
%78 = phi i64 [ %80, %77 ], [ %76, %75 ]
%79 = getelementptr inbounds i64, i64* %4, i64 %78
store i64 %78, i64* %79
%80 = add nuw i64 %78, 1
%81 = icmp eq i64 %78, %6
br i1 %81, label %82, label %77
82: ; preds = %77, %73
%83 = load i64, i64* %0
%84 = icmp eq i64 %83, 1
br i1 %84, label %85, label %88
85: ; preds = %82
%86 = load i64, i64* %2
%87 = add nsw i64 %86, -1
store i64 %87, i64* %2
br label %215
88: ; preds = %3, %82
%89 = phi i64 [ %83, %82 ], [ %6, %3 ]
%90 = sdiv i64 %89, 2
%91 = add nsw i64 %90, 1
br label %92
92: ; preds = %212, %88
%93 = phi i64 [ %182, %212 ], [ %89, %88 ]
%94 = phi i64 [ %179, %212 ], [ %91, %88 ]
%95 = icmp sgt i64 %94, 1
br i1 %95, label %96, label %102
96: ; preds = %92
%97 = add nsw i64 %94, -1
%98 = getelementptr inbounds i64, i64* %4, i64 %97
%99 = load i64, i64* %98
%100 = getelementptr inbounds double, double* %5, i64 %99
%101 = load double, double* %100
br label %178
102: ; preds = %92
%103 = getelementptr inbounds i64, i64* %4, i64 %93
%104 = load i64, i64* %103
%105 = getelementptr inbounds double, double* %5, i64 %104
%106 = load double, double* %105
%107 = load i64, i64* %2
store i64 %107, i64* %103
%108 = add nsw i64 %93, -1
%109 = icmp eq i64 %108, 1
br i1 %109, label %110, label %178
110: ; preds = %102
store i64 %104, i64* %2
br i1 %7, label %215, label %111
111: ; preds = %110
%112 = icmp ult i64 %6, 4
br i1 %112, label %169, label %113
113: ; preds = %111
%114 = and i64 %6, -4
%115 = or i64 %114, 1
%116 = add i64 %114, -4
%117 = lshr exact i64 %116, 2
%118 = add nuw nsw i64 %117, 1
%119 = and i64 %118, 1
%120 = icmp eq i64 %116, 0
br i1 %120, label %153, label %121
121: ; preds = %113
%122 = and i64 %118, 9223372036854775806
br label %123
123: ; preds = %123, %121
%124 = phi i64 [ 0, %121 ], [ %148, %123 ]
%125 = phi i64 [ 0, %121 ], [ %149, %123 ]
%126 = or i64 %124, 1
%127 = getelementptr inbounds i64, i64* %4, i64 %126
%128 = bitcast i64* %127 to <2 x i64>*
%129 = load <2 x i64>, <2 x i64>* %128
%130 = getelementptr inbounds i64, i64* %127, i64 2
%131 = bitcast i64* %130 to <2 x i64>*
%132 = load <2 x i64>, <2 x i64>* %131
%133 = add nsw <2 x i64> %129, <i64 -1, i64 -1>
%134 = add nsw <2 x i64> %132, <i64 -1, i64 -1>
%135 = bitcast i64* %127 to <2 x i64>*
store <2 x i64> %133, <2 x i64>* %135
%136 = bitcast i64* %130 to <2 x i64>*
store <2 x i64> %134, <2 x i64>* %136
%137 = or i64 %124, 5
%138 = getelementptr inbounds i64, i64* %4, i64 %137
%139 = bitcast i64* %138 to <2 x i64>*
%140 = load <2 x i64>, <2 x i64>* %139
%141 = getelementptr inbounds i64, i64* %138, i64 2
%142 = bitcast i64* %141 to <2 x i64>*
%143 = load <2 x i64>, <2 x i64>* %142
%144 = add nsw <2 x i64> %140, <i64 -1, i64 -1>
%145 = add nsw <2 x i64> %143, <i64 -1, i64 -1>
%146 = bitcast i64* %138 to <2 x i64>*
store <2 x i64> %144, <2 x i64>* %146
%147 = bitcast i64* %141 to <2 x i64>*
store <2 x i64> %145, <2 x i64>* %147
%148 = add nuw i64 %124, 8
%149 = add i64 %125, 2
%150 = icmp eq i64 %149, %122
br i1 %150, label %151, label %123
151: ; preds = %123
%152 = or i64 %148, 1
br label %153
153: ; preds = %151, %113
%154 = phi i64 [ 1, %113 ], [ %152, %151 ]
%155 = icmp eq i64 %119, 0
br i1 %155, label %167, label %156
156: ; preds = %153
%157 = getelementptr inbounds i64, i64* %4, i64 %154
%158 = bitcast i64* %157 to <2 x i64>*
%159 = load <2 x i64>, <2 x i64>* %158
%160 = getelementptr inbounds i64, i64* %157, i64 2
%161 = bitcast i64* %160 to <2 x i64>*
%162 = load <2 x i64>, <2 x i64>* %161
%163 = add nsw <2 x i64> %159, <i64 -1, i64 -1>
%164 = add nsw <2 x i64> %162, <i64 -1, i64 -1>
%165 = bitcast i64* %157 to <2 x i64>*
store <2 x i64> %163, <2 x i64>* %165
%166 = bitcast i64* %160 to <2 x i64>*
store <2 x i64> %164, <2 x i64>* %166
br label %167
167: ; preds = %153, %156
%168 = icmp eq i64 %6, %114
br i1 %168, label %215, label %169
169: ; preds = %111, %167
%170 = phi i64 [ 1, %111 ], [ %115, %167 ]
br label %171
171: ; preds = %169, %171
%172 = phi i64 [ %176, %171 ], [ %170, %169 ]
%173 = getelementptr inbounds i64, i64* %4, i64 %172
%174 = load i64, i64* %173
%175 = add nsw i64 %174, -1
store i64 %175, i64* %173
%176 = add nuw i64 %172, 1
%177 = icmp eq i64 %172, %6
br i1 %177, label %215, label %171
178: ; preds = %102, %96
%179 = phi i64 [ %94, %102 ], [ %97, %96 ]
%180 = phi double [ %106, %102 ], [ %101, %96 ]
%181 = phi i64 [ %104, %102 ], [ %99, %96 ]
%182 = phi i64 [ %108, %102 ], [ %93, %96 ]
%183 = shl nsw i64 %179, 1
%184 = icmp sgt i64 %183, %182
br i1 %184, label %212, label %185
185: ; preds = %178, %208
%186 = phi i64 [ %210, %208 ], [ %183, %178 ]
%187 = phi i64 [ %202, %208 ], [ %179, %178 ]
%188 = icmp slt i64 %186, %182
br i1 %188, label %189, label %201
189: ; preds = %185
%190 = getelementptr inbounds i64, i64* %4, i64 %186
%191 = load i64, i64* %190
%192 = getelementptr inbounds double, double* %5, i64 %191
%193 = load double, double* %192
%194 = getelementptr inbounds i64, i64* %2, i64 %186
%195 = load i64, i64* %194
%196 = getelementptr inbounds double, double* %5, i64 %195
%197 = load double, double* %196
%198 = fcmp olt double %193, %197
br i1 %198, label %199, label %201
199: ; preds = %189
%200 = or i64 %186, 1
br label %201
201: ; preds = %189, %199, %185
%202 = phi i64 [ %186, %189 ], [ %200, %199 ], [ %186, %185 ]
%203 = getelementptr inbounds i64, i64* %4, i64 %202
%204 = load i64, i64* %203
%205 = getelementptr inbounds double, double* %5, i64 %204
%206 = load double, double* %205
%207 = fcmp olt double %180, %206
br i1 %207, label %208, label %212
208: ; preds = %201
%209 = getelementptr inbounds i64, i64* %4, i64 %187
store i64 %204, i64* %209
%210 = shl nsw i64 %202, 1
%211 = icmp sgt i64 %210, %182
br i1 %211, label %212, label %185
212: ; preds = %201, %208, %178
%213 = phi i64 [ %179, %178 ], [ %187, %201 ], [ %202, %208 ]
%214 = getelementptr inbounds i64, i64* %4, i64 %213
store i64 %181, i64* %214
br label %92
215: ; preds = %171, %110, %167, %85
ret i32 0
}