#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 fabs(double);
int /*<<< orphan*/ gslpolyfit(double *, double *, int, int, double *);
int indexxd(double, double *, int);
double interpxyd(double, double *, double *, int);
double interp_high_order_dx_1(double x0, double *x, double *y, int n, int order,
                              double dx, int ex) {
  int i0, i1, j, nlocal;
  double c[16];
  double xi, xx, y0;
  if (order > 15)
    order = 15;
  dx = fabs(dx) / 2.;
  xi = x0;
  if (x0 < x[0])
    x0 = x[0];
  else if (x0 > x[n - 1])
    x0 = x[n - 1];
  i0 = indexxd(x0, x, n);
  if (i0 < 0) {
    if (ex)
      i0 = 0;
    else
      return (y[0]);
  }
  if (i0 >= n - 1) {
    if (ex)
      i0 = n - 1;
    else
      return (y[n - 1]);
  }
  for (i1 = i0; i0 >= 0 && x[i0] + dx >= x0; i0--)
    ;
  i0++;
  for (; i1 < n && x[i1] - dx <= x0; i1++)
    ;
  i1--;
  nlocal = (i1 - i0) + 1;
  if (nlocal < 2)
    return (interpxyd(x0, x, y, n));
  if (nlocal < order + 1)
    order = nlocal - 1;
  gslpolyfit(&x[i0], &y[i0], nlocal, order, c);
  if (ex)
    x0 = xi;
  for (y0 = 0., xx = 1., j = 0; j <= order; y0 += xx * c[j], xx *= x0, j++)
    ;
  return (y0);
}


x86 assembly (clang, -O0):
<interp_high_order_dx_1>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
movsd  %xmm0,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %edx,-0x24(%rbp)
mov    %ecx,-0x28(%rbp)
movsd  %xmm1,-0x30(%rbp)
mov    %r8d,-0x34(%rbp)
cmpl   $0xf,-0x28(%rbp)
jle    1178 <interp_high_order_dx_1+0x38>
movl   $0xf,-0x28(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1060 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xe72(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0x10(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    11cd <interp_high_order_dx_1+0x8d>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1206 <interp_high_order_dx_1+0xc6>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    1201 <interp_high_order_dx_1+0xc1>
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1206 <interp_high_order_dx_1+0xc6>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rdi
mov    -0x24(%rbp),%esi
call   1050 <indexxd@plt>
mov    %eax,-0x38(%rbp)
cmpl   $0x0,-0x38(%rbp)
jge    1251 <interp_high_order_dx_1+0x111>
cmpl   $0x0,-0x34(%rbp)
je     123a <interp_high_order_dx_1+0xfa>
movl   $0x0,-0x38(%rbp)
jmp    124c <interp_high_order_dx_1+0x10c>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    148f <interp_high_order_dx_1+0x34f>
jmp    1251 <interp_high_order_dx_1+0x111>
mov    -0x38(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jl     129b <interp_high_order_dx_1+0x15b>
cmpl   $0x0,-0x34(%rbp)
je     127a <interp_high_order_dx_1+0x13a>
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1296 <interp_high_order_dx_1+0x156>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    148f <interp_high_order_dx_1+0x34f>
jmp    129b <interp_high_order_dx_1+0x15b>
mov    -0x38(%rbp),%eax
mov    %eax,-0x3c(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x38(%rbp)
mov    %al,-0xe9(%rbp)
jl     12d3 <interp_high_order_dx_1+0x193>
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x30(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
setae  %al
mov    %al,-0xe9(%rbp)
mov    -0xe9(%rbp),%al
test   $0x1,%al
jne    12e6 <interp_high_order_dx_1+0x1a6>
jmp    12f9 <interp_high_order_dx_1+0x1b9>
jmp    12eb <interp_high_order_dx_1+0x1ab>
mov    -0x38(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x38(%rbp)
jmp    12a1 <interp_high_order_dx_1+0x161>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x3c(%rbp),%ecx
xor    %eax,%eax
cmp    -0x24(%rbp),%ecx
mov    %al,-0xea(%rbp)
jge    133a <interp_high_order_dx_1+0x1fa>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
subsd  -0x30(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
setae  %al
mov    %al,-0xea(%rbp)
mov    -0xea(%rbp),%al
test   $0x1,%al
jne    134d <interp_high_order_dx_1+0x20d>
jmp    1360 <interp_high_order_dx_1+0x220>
jmp    1352 <interp_high_order_dx_1+0x212>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1302 <interp_high_order_dx_1+0x1c2>
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
sub    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
cmpl   $0x2,-0x44(%rbp)
jge    139e <interp_high_order_dx_1+0x25e>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x24(%rbp),%edx
call   1040 <interpxyd@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    148f <interp_high_order_dx_1+0x34f>
mov    -0x44(%rbp),%eax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    13b8 <interp_high_order_dx_1+0x278>
mov    -0x44(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rdi
movslq -0x38(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdi
mov    -0x20(%rbp),%rsi
movslq -0x38(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rsi
mov    -0x44(%rbp),%edx
mov    -0x28(%rbp),%ecx
lea    -0xd0(%rbp),%r8
call   1030 <gslpolyfit@plt>
cmpl   $0x0,-0x34(%rbp)
je     13ff <interp_high_order_dx_1+0x2bf>
movsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  0xbf6(%rip),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x28(%rbp),%eax
jg     1482 <interp_high_order_dx_1+0x342>
jmp    1432 <interp_high_order_dx_1+0x2f2>
movsd  -0xe0(%rbp),%xmm0
ff
movslq -0x40(%rbp),%rax
movsd  -0xd0(%rbp,%rax,8),%xmm2
ff ff
movsd  -0xe8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0x10(%rbp),%xmm0
mulsd  -0xe0(%rbp),%xmm0
ff
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1421 <interp_high_order_dx_1+0x2e1>
movsd  -0xe8(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<interp_high_order_dx_1>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x98,%rsp
mov    %r8d,%r15d
mov    %edx,%ebx
mov    %rsi,%r14
mov    %rdi,%rbp
movsd  %xmm0,(%rsp)
cmp    $0xf,%ecx
mov    $0xf,%r12d
cmovl  %ecx,%r12d
movapd %xmm1,%xmm0
call   1060 <fabs@plt>
mov    %eax,%r13d
movsd  0x0(%rbp),%xmm0
ucomisd (%rsp),%xmm0
ja     119e <interp_high_order_dx_1+0x5e>
movslq %ebx,%rax
movsd  -0x8(%rbp,%rax,8),%xmm1
movsd  (%rsp),%xmm0
ucomisd %xmm1,%xmm0
jbe    119e <interp_high_order_dx_1+0x5e>
movapd %xmm1,%xmm0
movsd  %xmm0,0x8(%rsp)
mov    %rbp,%rdi
mov    %ebx,%esi
call   1050 <indexxd@plt>
test   %eax,%eax
jns    11bd <interp_high_order_dx_1+0x7d>
xor    %eax,%eax
test   %r15d,%r15d
je     12e6 <interp_high_order_dx_1+0x1a6>
cvtsi2sd %r13d,%xmm2
mulsd  0xe36(%rip),%xmm2
lea    -0x1(%rbx),%ecx
cmp    %ecx,%eax
movsd  0x8(%rsp),%xmm0
jl     11e8 <interp_high_order_dx_1+0xa8>
test   %r15d,%r15d
je     12cf <interp_high_order_dx_1+0x18f>
mov    %ecx,%eax
mov    %ebx,%esi
test   %ebx,%ebx
jle    1218 <interp_high_order_dx_1+0xd8>
mov    %eax,%ecx
nopw   0x0(%rax,%rax,1)
movsd  0x0(%rbp,%rcx,8),%xmm1
addsd  %xmm2,%xmm1
ucomisd %xmm0,%xmm1
jb     1211 <interp_high_order_dx_1+0xd1>
lea    -0x1(%rcx),%rdx
test   %rcx,%rcx
mov    %rdx,%rcx
jg     11f0 <interp_high_order_dx_1+0xb0>
mov    $0xffffffff,%ecx
lea    0x1(%rcx),%esi
cmp    %ebx,%eax
jge    124b <interp_high_order_dx_1+0x10b>
movslq %eax,%rdx
lea    0x0(,%rdx,8),%rdx
add    %rbp,%rdx
cs nopw 0x0(%rax,%rax,1)
movsd  (%rdx),%xmm1
subsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jb     124b <interp_high_order_dx_1+0x10b>
add    $0x1,%eax
add    $0x8,%rdx
cmp    %eax,%ebx
jne    1230 <interp_high_order_dx_1+0xf0>
mov    %ebx,%eax
sub    %ecx,%eax
add    $0xfffffffe,%eax
test   %eax,%eax
jle    12b1 <interp_high_order_dx_1+0x171>
cmp    %r12d,%eax
cmovl  %eax,%r12d
lea    0x1(%rax),%edx
movslq %esi,%rax
lea    0x0(%rbp,%rax,8),%rdi
lea    (%r14,%rax,8),%rsi
lea    0x10(%rsp),%r8
mov    %r12d,%ecx
call   1030 <gslpolyfit@plt>
movsd  0x8(%rsp),%xmm4
test   %r15d,%r15d
je     1287 <interp_high_order_dx_1+0x147>
movsd  (%rsp),%xmm4
test   %r12d,%r12d
js     12dd <interp_high_order_dx_1+0x19d>
mov    %r12d,%ecx
add    $0x1,%rcx
mov    %ecx,%eax
and    $0x3,%eax
cmp    $0x3,%r12d
jae    12f0 <interp_high_order_dx_1+0x1b0>
movsd  0xd62(%rip),%xmm1
xorpd  %xmm0,%xmm0
xor    %edx,%edx
jmp    1361 <interp_high_order_dx_1+0x221>
mov    %rbp,%rdi
mov    %r14,%rsi
mov    %ebx,%edx
add    $0x98,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1040 <interpxyd@plt>
movslq %ecx,%rax
movsd  (%r14,%rax,8),%xmm0
jmp    138e <interp_high_order_dx_1+0x24e>
xorpd  %xmm0,%xmm0
jmp    138e <interp_high_order_dx_1+0x24e>
movsd  (%r14),%xmm0
jmp    138e <interp_high_order_dx_1+0x24e>
and    $0xfffffffc,%ecx
movsd  0xd0d(%rip),%xmm1
xorpd  %xmm0,%xmm0
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movapd %xmm4,%xmm2
mulsd  %xmm1,%xmm2
mulsd  0x10(%rsp,%rdx,8),%xmm1
movapd %xmm4,%xmm3
mulsd  %xmm2,%xmm3
mulsd  0x18(%rsp,%rdx,8),%xmm2
addsd  %xmm0,%xmm1
movapd %xmm4,%xmm0
mulsd  %xmm3,%xmm0
mulsd  0x20(%rsp,%rdx,8),%xmm3
addsd  %xmm1,%xmm2
movapd %xmm4,%xmm1
mulsd  %xmm0,%xmm1
mulsd  0x28(%rsp,%rdx,8),%xmm0
addsd  %xmm2,%xmm3
addsd  %xmm3,%xmm0
add    $0x4,%rdx
cmp    %rdx,%rcx
jne    1310 <interp_high_order_dx_1+0x1d0>
test   %rax,%rax
je     138e <interp_high_order_dx_1+0x24e>
lea    (%rsp,%rdx,8),%rcx
add    $0x10,%rcx
xor    %edx,%edx
movapd %xmm4,%xmm2
mulsd  %xmm1,%xmm2
mulsd  (%rcx,%rdx,8),%xmm1
addsd  %xmm1,%xmm0
add    $0x1,%rdx
movapd %xmm2,%xmm1
cmp    %rdx,%rax
jne    1370 <interp_high_order_dx_1+0x230>
add    $0x98,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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