#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 */
double exp(double);
void oi_t_fast(int *ng, int *no, double *xg, double *yg, double *zg, double *lg,
               double *xo, double *yo, double *zo, double *lo, double *Dh,
               double *Dz, double *lafmin, double *xb, double *vec,
               double *vec1, double *xa, double *xidi) {
  int ngv = ng[0];
  int nov = no[0];
  double Dhv = Dh[0];
  double Dzv = Dz[0];
  double lafmin0 = lafmin[0];
  int i, j;
  double g, Dh2, Dz2, hd2, vd2, ld;
  Dh2 = Dhv * Dhv;
  Dz2 = Dzv * Dzv;
  for (i = 0; i < ngv; i++) {
    xa[i] = xb[i];
    xidi[i] = 0;
  }
  for (j = 0; j < nov; j++) {
    for (i = 0; i < ngv; i++) {
      hd2 = ((xg[i] - xo[j]) * (xg[i] - xo[j]) +
             (yg[i] - yo[j]) * (yg[i] - yo[j])) /
            (1000. * 1000.);
      vd2 = (zg[i] - zo[j]) * (zg[i] - zo[j]);
      ld = 1 - (1 - lafmin0) * (lg[i] - lo[j]) * (lg[i] - lo[j]);
      g = exp(-0.5 * (hd2 / Dh2 + vd2 / Dz2)) * ld;
      xa[i] = xa[i] + g * vec[j];
      xidi[i] = xidi[i] + g * vec1[j];
    }
  }
  return;
}


x86 assembly (clang, -O0):
<oi_t_fast>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    0x68(%rbp),%rax
mov    0x60(%rbp),%rax
mov    0x58(%rbp),%rax
mov    0x50(%rbp),%rax
mov    0x48(%rbp),%rax
mov    0x40(%rbp),%rax
mov    0x38(%rbp),%rax
mov    0x30(%rbp),%rax
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x38(%rbp)
mov    0x30(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    1205 <oi_t_fast+0xf5>
mov    0x48(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    0x60(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x68(%rbp),%rax
movslq -0x54(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    11c1 <oi_t_fast+0xb1>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x38(%rbp),%eax
jge    1420 <oi_t_fast+0x310>
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    140d <oi_t_fast+0x2fd>
mov    -0x18(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    0x10(%rbp),%rax
movslq -0x58(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    0x10(%rbp),%rax
movslq -0x58(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    0x18(%rbp),%rax
movslq -0x58(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mov    -0x20(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm3
mov    0x18(%rbp),%rax
movslq -0x58(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd69(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    0x20(%rbp),%rax
movslq -0x58(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    0x20(%rbp),%rax
movslq -0x58(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  0xd13(%rip),%xmm0
subsd  -0x50(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    0x28(%rbp),%rax
movslq -0x58(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    0x28(%rbp),%rax
movslq -0x58(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xcb3(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x78(%rbp),%xmm1
divsd  -0x68(%rbp),%xmm1
movsd  -0x80(%rbp),%xmm0
divsd  -0x70(%rbp),%xmm0
addsd  %xmm0,%xmm1
movsd  0xc7f(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1030 <exp@plt>
mulsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x60(%rbp)
mov    0x60(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x60(%rbp),%xmm0
mov    0x50(%rbp),%rax
movslq -0x58(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    0x60(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x68(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x60(%rbp),%xmm0
mov    0x58(%rbp),%rax
movslq -0x58(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    0x68(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    121f <oi_t_fast+0x10f>
jmp    1412 <oi_t_fast+0x302>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    120c <oi_t_fast+0xfc>
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<oi_t_fast>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    0xe8(%rsp),%r15
mov    0xe0(%rsp),%rax
mov    0xc0(%rsp),%r10
mov    0xb8(%rsp),%r11
mov    0xb0(%rsp),%rbp
mov    (%rdi),%r14d
mov    (%rsi),%esi
mov    %rsi,0x10(%rsp)
movsd  0x0(%rbp),%xmm4
movsd  (%r11),%xmm5
movsd  (%r10),%xmm0
test   %r14d,%r14d
mov    %r14,0x8(%rsp)
jle    134f <oi_t_fast+0x23f>
mov    0xc8(%rsp),%r13
cmp    $0x4,%r14d
jae    1182 <oi_t_fast+0x72>
xor    %ebp,%ebp
jmp    12a3 <oi_t_fast+0x193>
lea    (%r15,%r14,8),%rbp
cmp    %rax,%rbp
seta   %r11b
lea    (%rax,%r14,8),%rsi
cmp    %r15,%rsi
seta   %r10b
lea    0x0(,%r14,8),%rdi
add    %r13,%rdi
cmp    %rax,%rdi
seta   %r12b
cmp    %r13,%rsi
seta   %sil
cmp    %r15,%rdi
seta   %bl
cmp    %r13,%rbp
seta   %r14b
xor    %ebp,%ebp
test   %r10b,%r11b
jne    129e <oi_t_fast+0x18e>
and    %sil,%r12b
jne    129e <oi_t_fast+0x18e>
and    %r14b,%bl
mov    0x8(%rsp),%r14
jne    12a3 <oi_t_fast+0x193>
mov    %r14d,%ebp
and    $0xfffffffc,%ebp
lea    -0x4(%rbp),%rsi
mov    %rsi,%r10
shr    $0x2,%r10
add    $0x1,%r10
test   %rsi,%rsi
je     152b <oi_t_fast+0x41b>
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
xor    %esi,%esi
xorpd  %xmm1,%xmm1
nopl   0x0(%rax,%rax,1)
movups 0x0(%r13,%rsi,8),%xmm2
movups 0x10(%r13,%rsi,8),%xmm3
movups %xmm2,(%rax,%rsi,8)
movups %xmm3,0x10(%rax,%rsi,8)
movupd %xmm1,(%r15,%rsi,8)
movupd %xmm1,0x10(%r15,%rsi,8)
movupd 0x20(%r13,%rsi,8),%xmm2
movupd 0x30(%r13,%rsi,8),%xmm3
movupd %xmm2,0x20(%rax,%rsi,8)
movupd %xmm3,0x30(%rax,%rsi,8)
movupd %xmm1,0x20(%r15,%rsi,8)
movupd %xmm1,0x30(%r15,%rsi,8)
add    $0x8,%rsi
add    $0xfffffffffffffffe,%r11
jne    1210 <oi_t_fast+0x100>
test   $0x1,%r10b
je     1294 <oi_t_fast+0x184>
movupd 0x0(%r13,%rsi,8),%xmm1
movupd 0x10(%r13,%rsi,8),%xmm2
movupd %xmm1,(%rax,%rsi,8)
movupd %xmm2,0x10(%rax,%rsi,8)
xorpd  %xmm1,%xmm1
movupd %xmm1,(%r15,%rsi,8)
movupd %xmm1,0x10(%r15,%rsi,8)
cmp    %r14,%rbp
jne    12a3 <oi_t_fast+0x193>
jmp    134f <oi_t_fast+0x23f>
mov    0x8(%rsp),%r14
mov    %rbp,%r10
not    %r10
add    %r14,%r10
mov    %r14,%rsi
and    $0x3,%rsi
je     12de <oi_t_fast+0x1ce>
cs nopw 0x0(%rax,%rax,1)
nop
movsd  0x0(%r13,%rbp,8),%xmm1
movsd  %xmm1,(%rax,%rbp,8)
movq   $0x0,(%r15,%rbp,8)
add    $0x1,%rbp
add    $0xffffffffffffffff,%rsi
jne    12c0 <oi_t_fast+0x1b0>
cmp    $0x3,%r10
jb     134f <oi_t_fast+0x23f>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  0x0(%r13,%rbp,8),%xmm1
movsd  %xmm1,(%rax,%rbp,8)
movq   $0x0,(%r15,%rbp,8)
movsd  0x8(%r13,%rbp,8),%xmm1
movsd  %xmm1,0x8(%rax,%rbp,8)
movq   $0x0,0x8(%r15,%rbp,8)
movsd  0x10(%r13,%rbp,8),%xmm1
movsd  %xmm1,0x10(%rax,%rbp,8)
movq   $0x0,0x10(%r15,%rbp,8)
movsd  0x18(%r13,%rbp,8),%xmm1
movsd  %xmm1,0x18(%rax,%rbp,8)
movq   $0x0,0x18(%r15,%rbp,8)
add    $0x4,%rbp
cmp    %rbp,%r14
jne    12f0 <oi_t_fast+0x1e0>
cmpl   $0x0,0x10(%rsp)
jle    151c <oi_t_fast+0x40c>
mov    0xd0(%rsp),%r10
mov    0xa8(%rsp),%rax
mov    0xa0(%rsp),%rdi
mov    0x98(%rsp),%rsi
mov    0x90(%rsp),%r11
mulsd  %xmm4,%xmm4
movsd  0xc72(%rip),%xmm2
movapd %xmm2,%xmm3
subsd  %xmm0,%xmm3
xorpd  0xc82(%rip),%xmm3
mulsd  %xmm5,%xmm5
xor    %ebx,%ebx
movsd  0xc5c(%rip),%xmm6
movsd  0xc5c(%rip),%xmm7
movsd  %xmm4,0x28(%rsp)
movsd  %xmm5,0x20(%rsp)
mov    %rdx,0x18(%rsp)
movapd %xmm3,0x40(%rsp)
jmp    13df <oi_t_fast+0x2cf>
nopl   (%rax)
add    $0x1,%rbx
cmp    0x10(%rsp),%rbx
je     151c <oi_t_fast+0x40c>
test   %r14d,%r14d
jle    13d0 <oi_t_fast+0x2c0>
xor    %r12d,%r12d
mov    %rbx,0x30(%rsp)
nopl   0x0(%rax)
movsd  (%rdx,%r12,8),%xmm1
subsd  (%r11,%rbx,8),%xmm1
movsd  (%rcx,%r12,8),%xmm0
subsd  (%rsi,%rbx,8),%xmm0
mulsd  %xmm0,%xmm0
mulsd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
divsd  %xmm6,%xmm1
divsd  %xmm4,%xmm1
movsd  (%r8,%r12,8),%xmm0
subsd  (%rdi,%rbx,8),%xmm0
mulsd  %xmm0,%xmm0
divsd  %xmm5,%xmm0
addsd  %xmm1,%xmm0
movsd  (%r9,%r12,8),%xmm1
subsd  (%rax,%rbx,8),%xmm1
movapd %xmm1,%xmm4
mulsd  %xmm3,%xmm4
mulsd  %xmm1,%xmm4
addsd  %xmm2,%xmm4
movsd  %xmm4,0x38(%rsp)
mulsd  %xmm7,%xmm0
mov    %rcx,%rbp
mov    %r9,%r13
mov    %r8,%rbx
mov    %r10,%r14
call   1030 <exp@plt>
movsd  0xba0(%rip),%xmm7
movsd  0xb90(%rip),%xmm6
movapd 0x40(%rsp),%xmm3
movsd  0xb7a(%rip),%xmm2
mov    0x90(%rsp),%r11
mov    0x98(%rsp),%rsi
mov    0xa0(%rsp),%rdi
mov    %r14,%r10
movsd  0x20(%rsp),%xmm5
movsd  0x28(%rsp),%xmm4
mov    %rbx,%r8
mov    %r13,%r9
mov    0xe0(%rsp),%rax
mov    0x30(%rsp),%rbx
mov    0x18(%rsp),%rdx
mov    0x8(%rsp),%r14
mov    %rbp,%rcx
mulsd  0x38(%rsp),%xmm0
movsd  (%r10,%rbx,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  (%rax,%r12,8),%xmm1
movsd  %xmm1,(%rax,%r12,8)
mov    0xd8(%rsp),%rax
mulsd  (%rax,%rbx,8),%xmm0
mov    0xa8(%rsp),%rax
addsd  (%r15,%r12,8),%xmm0
movsd  %xmm0,(%r15,%r12,8)
add    $0x1,%r12
cmp    %r12,%r14
jne    13f0 <oi_t_fast+0x2e0>
jmp    13d0 <oi_t_fast+0x2c0>
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %esi,%esi
test   $0x1,%r10b
jne    126a <oi_t_fast+0x15a>
jmp    1294 <oi_t_fast+0x184>

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

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