#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 /*<<< orphan*/ assert(int);
double fabs(double const);
int ti_di_start(double const *);
int ti_di(int size, double const *const *inputs, double const *options,
          double *const *outputs) {
  const double *high = inputs[0];
  const double *low = inputs[1];
  const double *close = inputs[2];
  const int period = (int)options[0];
  double *plus_di = outputs[0];
  double *minus_di = outputs[1];
  if (period < 1)
    return 1;
  if (size <= ti_di_start(options))
    return 0;
  const double per = ((double)period - 1) / ((double)period);
  double atr = 0;
  double dmup = 0;
  double dmdown = 0;
  int i;
  for (i = 1; i < period; ++i) {
    double truerange;
    do {
      const double l = low[i];
      const double h = high[i];
      const double c = close[i - 1];
      const double ych = fabs(h - c);
      const double ycl = fabs(l - c);
      double v = h - l;
      if (ych > v)
        v = ych;
      if (ycl > v)
        v = ycl;
      truerange = v;
    } while (0);
    atr += truerange;
    double dp, dm;
    do {
      dp = high[i] - high[i - 1];
      dm = low[i - 1] - low[i];
      if (dp < 0)
        dp = 0;
      else if (dp > dm)
        dm = 0;
      if (dm < 0)
        dm = 0;
      else if (dm > dp)
        dp = 0;
    } while (0);
    dmup += dp;
    dmdown += dm;
  }
  *plus_di++ = 100.0 * dmup / atr;
  *minus_di++ = 100.0 * dmdown / atr;
  for (i = period; i < size; ++i) {
    double truerange;
    do {
      const double l = low[i];
      const double h = high[i];
      const double c = close[i - 1];
      const double ych = fabs(h - c);
      const double ycl = fabs(l - c);
      double v = h - l;
      if (ych > v)
        v = ych;
      if (ycl > v)
        v = ycl;
      truerange = v;
    } while (0);
    atr = atr * per + truerange;
    double dp, dm;
    do {
      dp = high[i] - high[i - 1];
      dm = low[i - 1] - low[i];
      if (dp < 0)
        dp = 0;
      else if (dp > dm)
        dm = 0;
      if (dm < 0)
        dm = 0;
      else if (dm > dp)
        dp = 0;
    } while (0);
    dmup = dmup * per + dp;
    dmdown = dmdown * per + dm;
    *plus_di++ = 100.0 * dmup / atr;
    *minus_di++ = 100.0 * dmdown / atr;
  }
  assert(plus_di - outputs[0] == size - ti_di_start(options));
  assert(minus_di - outputs[1] == size - ti_di_start(options));
  return 0;
}


x86 assembly (clang, -O0):
<ti_di>:
push   %rbp
mov    %rsp,%rbp
sub    $0x130,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x48(%rbp)
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x50(%rbp)
cmpl   $0x1,-0x3c(%rbp)
jge    1195 <ti_di+0x75>
movl   $0x1,-0x4(%rbp)
jmp    17ca <ti_di+0x6aa>
mov    -0x8(%rbp),%eax
mov    %eax,-0x10c(%rbp)
mov    -0x18(%rbp),%rdi
call   1040 <ti_di_start@plt>
mov    %eax,%ecx
mov    -0x10c(%rbp),%eax
cmp    %ecx,%eax
jg     11c3 <ti_di+0xa3>
movl   $0x0,-0x4(%rbp)
jmp    17ca <ti_di+0x6aa>
cvtsi2sdl -0x3c(%rbp),%xmm0
movsd  0xe30(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsi2sdl -0x3c(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x1,-0x74(%rbp)
mov    -0x74(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    142f <ti_di+0x30f>
jmp    1212 <ti_di+0xf2>
mov    -0x30(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x38(%rbp),%rax
mov    -0x74(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
subsd  -0x98(%rbp),%xmm0
ff
movaps 0xda3(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
subsd  -0x98(%rbp),%xmm0
ff
movaps 0xd80(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
subsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
ucomisd -0xb0(%rbp),%xmm0
ff
jbe    12da <ti_di+0x1ba>
movsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0xa8(%rbp),%xmm0
ff
ucomisd -0xb0(%rbp),%xmm0
ff
jbe    1300 <ti_di+0x1e0>
movsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x74(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    -0x74(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x74(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
xorps  %xmm0,%xmm0
ucomisd -0xb8(%rbp),%xmm0
ff
jbe    138b <ti_di+0x26b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
jmp    13b1 <ti_di+0x291>
movsd  -0xb8(%rbp),%xmm0
ff
ucomisd -0xc0(%rbp),%xmm0
ff
jbe    13ac <ti_di+0x28c>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
jmp    13b1 <ti_di+0x291>
xorps  %xmm0,%xmm0
ucomisd -0xc0(%rbp),%xmm0
ff
jbe    13d2 <ti_di+0x2b2>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
jmp    13f8 <ti_di+0x2d8>
movsd  -0xc0(%rbp),%xmm0
ff
ucomisd -0xb8(%rbp),%xmm0
ff
jbe    13f3 <ti_di+0x2d3>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
jmp    13f8 <ti_di+0x2d8>
jmp    13fd <ti_di+0x2dd>
movsd  -0xb8(%rbp),%xmm0
ff
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xc0(%rbp),%xmm0
ff
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    1201 <ti_di+0xe1>
movsd  0xbd1(%rip),%xmm0
mulsd  -0x68(%rbp),%xmm0
divsd  -0x60(%rbp),%xmm0
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x48(%rbp)
movsd  %xmm0,(%rax)
movsd  0xbac(%rip),%xmm0
mulsd  -0x70(%rbp),%xmm0
divsd  -0x60(%rbp),%xmm0
mov    -0x50(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x50(%rbp)
movsd  %xmm0,(%rax)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1724 <ti_di+0x604>
jmp    1490 <ti_di+0x370>
mov    -0x30(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x38(%rbp),%rax
mov    -0x74(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
subsd  -0xe0(%rbp),%xmm0
ff
movaps 0xb25(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0xd0(%rbp),%xmm0
ff
subsd  -0xe0(%rbp),%xmm0
ff
movaps 0xb02(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
subsd  -0xd0(%rbp),%xmm0
ff
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
ucomisd -0xf8(%rbp),%xmm0
ff
jbe    1558 <ti_di+0x438>
movsd  -0xe8(%rbp),%xmm0
ff
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  -0xf0(%rbp),%xmm0
ff
ucomisd -0xf8(%rbp),%xmm0
ff
jbe    157e <ti_di+0x45e>
movsd  -0xf0(%rbp),%xmm0
ff
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  -0xf8(%rbp),%xmm0
ff
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0x60(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0xc8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x74(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x100(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    -0x74(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x74(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x108(%rbp)
ff
xorps  %xmm0,%xmm0
ucomisd -0x100(%rbp),%xmm0
ff
jbe    161c <ti_di+0x4fc>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x100(%rbp)
ff
jmp    1642 <ti_di+0x522>
movsd  -0x100(%rbp),%xmm0
ff
ucomisd -0x108(%rbp),%xmm0
ff
jbe    163d <ti_di+0x51d>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x108(%rbp)
ff
jmp    1642 <ti_di+0x522>
xorps  %xmm0,%xmm0
ucomisd -0x108(%rbp),%xmm0
ff
jbe    1663 <ti_di+0x543>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x108(%rbp)
ff
jmp    1689 <ti_di+0x569>
movsd  -0x108(%rbp),%xmm0
ff
ucomisd -0x100(%rbp),%xmm0
ff
jbe    1684 <ti_di+0x564>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x100(%rbp)
ff
jmp    1689 <ti_di+0x569>
jmp    168e <ti_di+0x56e>
movsd  -0x68(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x100(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x108(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  0x934(%rip),%xmm0
mulsd  -0x68(%rbp),%xmm0
divsd  -0x60(%rbp),%xmm0
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x48(%rbp)
movsd  %xmm0,(%rax)
movsd  0x90f(%rip),%xmm0
mulsd  -0x70(%rbp),%xmm0
divsd  -0x60(%rbp),%xmm0
mov    -0x50(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x50(%rbp)
movsd  %xmm0,(%rax)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    147f <ti_di+0x35f>
mov    -0x48(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
sub    %rcx,%rax
sar    $0x3,%rax
mov    %rax,-0x128(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x12c(%rbp)
mov    -0x18(%rbp),%rdi
call   1040 <ti_di_start@plt>
mov    -0x12c(%rbp),%ecx
mov    %eax,%edx
mov    -0x128(%rbp),%rax
sub    %edx,%ecx
movslq %ecx,%rcx
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    -0x50(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    0x8(%rcx),%rcx
sub    %rcx,%rax
sar    $0x3,%rax
mov    %rax,-0x118(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x11c(%rbp)
mov    -0x18(%rbp),%rdi
call   1040 <ti_di_start@plt>
mov    -0x11c(%rbp),%ecx
mov    %eax,%edx
mov    -0x118(%rbp),%rax
sub    %edx,%ecx
movslq %ecx,%rcx
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x130,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ti_di>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %edi,%ebx
cvttsd2si (%rdx),%edi
test   %edi,%edi
jle    1285 <ti_di+0x165>
mov    %edi,0x4(%rsp)
mov    (%rsi),%r15
mov    0x8(%rsi),%r13
mov    0x10(%rsi),%r12
mov    (%rcx),%rsi
mov    %rsi,0x10(%rsp)
mov    0x8(%rcx),%rsi
mov    %rsi,0x8(%rsp)
mov    %rdx,%rdi
mov    %rdx,%r14
mov    %rcx,%rbp
call   1040 <ti_di_start@plt>
xor    %ecx,%ecx
cmp    %ebx,%eax
jge    1456 <ti_di+0x336>
mov    %ebx,%r8d
mov    %rbp,%rbx
mov    %r14,%r9
xorpd  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
xorpd  %xmm2,%xmm2
mov    0x4(%rsp),%edx
cmp    $0x2,%edx
mov    0x8(%rsp),%r14
mov    0x10(%rsp),%rbp
jb     128f <ti_di+0x16f>
mov    %edx,%eax
movsd  (%r15),%xmm11
movsd  0x0(%r13),%xmm10
add    $0xffffffffffffffff,%rax
xorpd  %xmm8,%xmm8
xor    %ecx,%ecx
movapd 0xe4f(%rip),%xmm9
xorpd  %xmm2,%xmm2
xorpd  %xmm1,%xmm1
xorpd  %xmm0,%xmm0
jmp    121d <ti_di+0xfd>
nop
movapd %xmm4,%xmm6
addsd  %xmm6,%xmm0
addsd  %xmm7,%xmm1
movsd  (%r12,%rcx,8),%xmm3
movapd %xmm11,%xmm4
subsd  %xmm3,%xmm4
andpd  %xmm9,%xmm4
movapd %xmm10,%xmm5
subsd  %xmm3,%xmm5
andpd  %xmm9,%xmm5
movapd %xmm11,%xmm3
subsd  %xmm10,%xmm3
maxsd  %xmm3,%xmm4
maxsd  %xmm4,%xmm5
addsd  %xmm5,%xmm2
add    $0x1,%rcx
cmp    %rcx,%rax
je     128f <ti_di+0x16f>
movapd %xmm11,%xmm4
movapd %xmm10,%xmm3
movsd  0x8(%r13,%rcx,8),%xmm10
movsd  0x8(%r15,%rcx,8),%xmm11
movapd %xmm11,%xmm7
subsd  %xmm4,%xmm7
subsd  %xmm10,%xmm3
ucomisd %xmm7,%xmm8
xorpd  %xmm5,%xmm5
ja     125c <ti_di+0x13c>
xorpd  %xmm4,%xmm4
ucomisd %xmm3,%xmm7
movapd %xmm7,%xmm5
ja     1272 <ti_di+0x152>
xorpd  %xmm6,%xmm6
ucomisd %xmm3,%xmm6
movapd %xmm3,%xmm4
movapd %xmm5,%xmm7
ja     11d4 <ti_di+0xb4>
ucomisd %xmm7,%xmm4
jbe    11d0 <ti_di+0xb0>
xorpd  %xmm7,%xmm7
jmp    11d0 <ti_di+0xb0>
mov    $0x1,%ecx
jmp    1456 <ti_di+0x336>
movsd  0xd70(%rip),%xmm8
movapd %xmm1,%xmm3
mulsd  %xmm8,%xmm3
divsd  %xmm2,%xmm3
movsd  %xmm3,0x0(%rbp)
movapd %xmm0,%xmm3
mulsd  %xmm8,%xmm3
divsd  %xmm2,%xmm3
movsd  %xmm3,(%r14)
add    $0x8,%r14
add    $0x8,%rbp
cmp    %r8d,%edx
jge    1403 <ti_di+0x2e3>
xorps  %xmm3,%xmm3
cvtsi2sd %edx,%xmm3
movsd  0xd23(%rip),%xmm10
addsd  %xmm3,%xmm10
divsd  %xmm3,%xmm10
movslq %edx,%rdx
movslq %r8d,%rax
lea    0x0(,%rdx,8),%rcx
add    %r13,%rcx
lea    (%r15,%rdx,8),%rsi
lea    (%r12,%rdx,8),%rdi
add    $0xfffffffffffffff8,%rdi
sub    %rdx,%rax
xor    %edx,%edx
movapd 0xcfe(%rip),%xmm9
jmp    1398 <ti_di+0x278>
nopw   0x0(%rax,%rax,1)
movapd %xmm11,%xmm12
movsd  (%rdi,%rdx,1),%xmm4
movapd %xmm3,%xmm5
subsd  %xmm4,%xmm5
andpd  %xmm9,%xmm5
subsd  %xmm6,%xmm3
subsd  %xmm4,%xmm6
andpd  %xmm9,%xmm6
maxsd  %xmm3,%xmm5
maxsd  %xmm5,%xmm6
mulsd  %xmm10,%xmm2
addsd  %xmm6,%xmm2
mulsd  %xmm10,%xmm1
addsd  %xmm7,%xmm1
mulsd  %xmm10,%xmm0
addsd  %xmm12,%xmm0
movapd %xmm1,%xmm3
mulsd  %xmm8,%xmm3
divsd  %xmm2,%xmm3
movsd  %xmm3,0x0(%rbp,%rdx,1)
movapd %xmm0,%xmm3
mulsd  %xmm8,%xmm3
divsd  %xmm2,%xmm3
movsd  %xmm3,(%r14,%rdx,1)
add    $0x8,%rdx
add    $0xffffffffffffffff,%rax
je     13fd <ti_di+0x2dd>
movsd  -0x8(%rcx,%rdx,1),%xmm4
movsd  (%rcx,%rdx,1),%xmm6
movsd  (%rsi,%rdx,1),%xmm3
movapd %xmm3,%xmm7
subsd  -0x8(%rsi,%rdx,1),%xmm7
subsd  %xmm6,%xmm4
xorpd  %xmm12,%xmm12
ucomisd %xmm7,%xmm12
xorpd  %xmm5,%xmm5
ja     13d5 <ti_di+0x2b5>
xorpd  %xmm11,%xmm11
ucomisd %xmm4,%xmm7
movapd %xmm7,%xmm5
ja     13e9 <ti_di+0x2c9>
ucomisd %xmm4,%xmm12
movapd %xmm4,%xmm11
movapd %xmm5,%xmm7
ja     1325 <ti_di+0x205>
ucomisd %xmm7,%xmm11
jbe    1320 <ti_di+0x200>
xorpd  %xmm7,%xmm7
jmp    1320 <ti_di+0x200>
add    %rdx,%rbp
add    %rdx,%r14
mov    %rbx,%r12
sub    (%rbx),%rbp
sar    $0x3,%rbp
mov    %r9,%r15
mov    %r9,%rdi
mov    %r8d,%ebx
call   1040 <ti_di_start@plt>
mov    %ebx,%ecx
sub    %eax,%ecx
movslq %ecx,%rax
xor    %edi,%edi
cmp    %rax,%rbp
sete   %dil
call   1030 <assert@plt>
sub    0x8(%r12),%r14
sar    $0x3,%r14
mov    %r15,%rdi
call   1040 <ti_di_start@plt>
sub    %eax,%ebx
movslq %ebx,%rax
xor    %edi,%edi
cmp    %rax,%r14
sete   %dil
call   1030 <assert@plt>
xor    %ecx,%ecx
mov    %ecx,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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