int interpshc(double date, double dte1, int nmax1, double *gh1, double dte2,
              double nmax2, double *gh2, int *nmax, double *gh) {
  int i, k, l;
  double factor;
  --gh;
  --gh2;
  --gh1;
  factor = (date - dte1) / (dte2 - dte1);
  if (nmax1 == nmax2) {
    k = nmax1 * (nmax1 + 2);
    *nmax = nmax1;
  } else if (nmax1 > nmax2) {
    k = nmax2 * (nmax2 + 2);
    l = nmax1 * (nmax1 + 2);
    for (i = k + 1; i <= l; ++i) {
      gh[i] = gh1[i] + factor * (-gh1[i]);
    }
    *nmax = nmax1;
  } else {
    k = nmax1 * (nmax1 + 2);
    l = nmax2 * (nmax2 + 2);
    for (i = k + 1; i <= l; ++i) {
      gh[i] = factor * gh2[i];
    }
    *nmax = nmax2;
  }
  for (i = 1; i <= k; ++i) {
    gh[i] = gh1[i] + factor * (gh2[i] - gh1[i]);
  }
  return 0;
}


x86 assembly (clang, -O0):
<interpshc>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
movsd  %xmm2,-0x28(%rbp)
movsd  %xmm3,-0x30(%rbp)
mov    %rdx,-0x38(%rbp)
mov    %rcx,-0x40(%rbp)
mov    %r8,-0x48(%rbp)
mov    -0x48(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x38(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x20(%rbp)
movsd  -0x8(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
cvtsi2sdl -0x14(%rbp),%xmm0
ucomisd -0x30(%rbp),%xmm0
jne    119f <interpshc+0x9f>
jp     119f <interpshc+0x9f>
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
imul   %ecx,%eax
mov    %eax,-0x50(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x40(%rbp),%rax
mov    %ecx,(%rax)
jmp    12d5 <interpshc+0x1d5>
cvtsi2sdl -0x14(%rbp),%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    1257 <interpshc+0x157>
movsd  -0x30(%rbp),%xmm0
movsd  0xe44(%rip),%xmm1
addsd  -0x30(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x50(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
imul   %ecx,%eax
mov    %eax,-0x54(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x54(%rbp),%eax
jg     1249 <interpshc+0x149>
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x60(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x48(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    11e4 <interpshc+0xe4>
mov    -0x14(%rbp),%ecx
mov    -0x40(%rbp),%rax
mov    %ecx,(%rax)
jmp    12d0 <interpshc+0x1d0>
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
imul   %ecx,%eax
mov    %eax,-0x50(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  0xd8d(%rip),%xmm1
addsd  -0x30(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x54(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x54(%rbp),%eax
jg     12c5 <interpshc+0x1c5>
movsd  -0x60(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    128c <interpshc+0x18c>
cvttsd2si -0x30(%rbp),%ecx
mov    -0x40(%rbp),%rax
mov    %ecx,(%rax)
jmp    12d5 <interpshc+0x1d5>
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x50(%rbp),%eax
jg     1337 <interpshc+0x237>
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x60(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x48(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12dc <interpshc+0x1dc>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<interpshc>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
subsd  %xmm1,%xmm0
subsd  %xmm1,%xmm2
divsd  %xmm2,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %edi,%xmm1
ucomisd %xmm3,%xmm1
jne    1132 <interpshc+0x32>
jp     1132 <interpshc+0x32>
lea    0x2(%rdi),%r10d
imul   %edi,%r10d
jmp    14e2 <interpshc+0x3e2>
jbe    1252 <interpshc+0x152>
movsd  0xec0(%rip),%xmm1
addsd  %xmm3,%xmm1
mulsd  %xmm3,%xmm1
cvttsd2si %xmm1,%r10d
lea    0x2(%rdi),%r11d
imul   %edi,%r11d
cmp    %r10d,%r11d
jle    14e2 <interpshc+0x3e2>
movslq %r10d,%r12
movslq %r11d,%r9
mov    %r9,%r15
sub    %r12,%r15
cmp    $0x4,%r15
jb     1389 <interpshc+0x289>
lea    (%r8,%r12,8),%rbx
lea    (%rsi,%r9,8),%rbp
cmp    %rbp,%rbx
jae    1192 <interpshc+0x92>
lea    (%r8,%r9,8),%rbx
lea    (%rsi,%r12,8),%rbp
cmp    %rbx,%rbp
jb     1389 <interpshc+0x289>
mov    %r15,%rax
and    $0xfffffffffffffffc,%rax
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
mov    %rax,-0x8(%rsp)
lea    -0x4(%rax),%rbx
mov    %rbx,%rax
shr    $0x2,%rax
add    $0x1,%rax
test   %rbx,%rbx
je     1343 <interpshc+0x243>
mov    %rax,%r13
and    $0xfffffffffffffffe,%r13
lea    (%r8,%r12,8),%rbp
add    $0x30,%rbp
lea    (%rsi,%r12,8),%r14
add    $0x30,%r14
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movupd -0x30(%r14,%rbx,8),%xmm2
movupd -0x20(%r14,%rbx,8),%xmm3
movapd %xmm1,%xmm4
mulpd  %xmm2,%xmm4
subpd  %xmm4,%xmm2
movapd %xmm1,%xmm4
mulpd  %xmm3,%xmm4
subpd  %xmm4,%xmm3
movupd %xmm2,-0x30(%rbp,%rbx,8)
movupd %xmm3,-0x20(%rbp,%rbx,8)
movupd -0x10(%r14,%rbx,8),%xmm2
movupd (%r14,%rbx,8),%xmm3
movapd %xmm1,%xmm4
mulpd  %xmm2,%xmm4
subpd  %xmm4,%xmm2
movapd %xmm1,%xmm4
mulpd  %xmm3,%xmm4
subpd  %xmm4,%xmm3
movupd %xmm2,-0x10(%rbp,%rbx,8)
movupd %xmm3,0x0(%rbp,%rbx,8)
add    $0x8,%rbx
add    $0xfffffffffffffffe,%r13
jne    11e0 <interpshc+0xe0>
jmp    1345 <interpshc+0x245>
lea    0x2(%rdi),%r10d
imul   %edi,%r10d
movsd  0xd9e(%rip),%xmm1
addsd  %xmm3,%xmm1
mulsd  %xmm3,%xmm1
cvttsd2si %xmm1,%r12d
cmp    %r12d,%r10d
jge    14de <interpshc+0x3de>
movslq %r10d,%rax
movslq %r12d,%r9
mov    %r9,%r14
sub    %rax,%r14
cmp    $0x4,%r14
jb     143b <interpshc+0x33b>
lea    (%r8,%rax,8),%rdi
lea    (%rdx,%r9,8),%rbp
cmp    %rbp,%rdi
jae    12ac <interpshc+0x1ac>
lea    (%r8,%r9,8),%rdi
lea    (%rdx,%rax,8),%rbp
cmp    %rdi,%rbp
jb     143b <interpshc+0x33b>
mov    %r14,%r11
and    $0xfffffffffffffffc,%r11
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x4(%r11),%rdi
mov    %rdi,%r15
shr    $0x2,%r15
add    $0x1,%r15
test   %rdi,%rdi
je     1404 <interpshc+0x304>
mov    %r15,%rdi
and    $0xfffffffffffffffe,%rdi
lea    (%r8,%rax,8),%r13
add    $0x30,%r13
lea    (%rdx,%rax,8),%rbp
add    $0x30,%rbp
xor    %ebx,%ebx
nopl   0x0(%rax)
movupd -0x30(%rbp,%rbx,8),%xmm2
movupd -0x20(%rbp,%rbx,8),%xmm4
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm4
movupd %xmm2,-0x30(%r13,%rbx,8)
movupd %xmm4,-0x20(%r13,%rbx,8)
movupd -0x10(%rbp,%rbx,8),%xmm2
movupd 0x0(%rbp,%rbx,8),%xmm4
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm4
movupd %xmm2,-0x10(%r13,%rbx,8)
movupd %xmm4,0x0(%r13,%rbx,8)
add    $0x8,%rbx
add    $0xfffffffffffffffe,%rdi
jne    12f0 <interpshc+0x1f0>
jmp    1406 <interpshc+0x306>
xor    %ebx,%ebx
test   $0x1,%al
je     1378 <interpshc+0x278>
add    %r12,%rbx
movupd (%rsi,%rbx,8),%xmm2
movupd 0x10(%rsi,%rbx,8),%xmm3
movapd %xmm1,%xmm4
mulpd  %xmm2,%xmm4
subpd  %xmm4,%xmm2
mulpd  %xmm3,%xmm1
subpd  %xmm1,%xmm3
movupd %xmm2,(%r8,%rbx,8)
movupd %xmm3,0x10(%r8,%rbx,8)
mov    -0x8(%rsp),%rax
cmp    %rax,%r15
je     14e2 <interpshc+0x3e2>
add    %rax,%r12
sub    %r12d,%r11d
mov    %r12,%rbx
not    %rbx
test   $0x1,%r11b
je     13b4 <interpshc+0x2b4>
movsd  (%rsi,%r12,8),%xmm1
movapd %xmm0,%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm1
movsd  %xmm1,(%r8,%r12,8)
add    $0x1,%r12
add    %r9,%rbx
je     14e2 <interpshc+0x3e2>
nopl   (%rax)
movsd  (%rsi,%r12,8),%xmm1
movapd %xmm0,%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm1
movsd  %xmm1,(%r8,%r12,8)
movsd  0x8(%rsi,%r12,8),%xmm1
movapd %xmm0,%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm1
movsd  %xmm1,0x8(%r8,%r12,8)
lea    0x2(%r12),%rax
mov    %rax,%r12
cmp    %rax,%r9
jne    13c0 <interpshc+0x2c0>
jmp    14e2 <interpshc+0x3e2>
xor    %ebx,%ebx
test   $0x1,%r15b
je     142f <interpshc+0x32f>
add    %rax,%rbx
movupd (%rdx,%rbx,8),%xmm2
movupd 0x10(%rdx,%rbx,8),%xmm4
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm4
movupd %xmm2,(%r8,%rbx,8)
movupd %xmm4,0x10(%r8,%rbx,8)
cmp    %r11,%r14
je     14de <interpshc+0x3de>
add    %r11,%rax
sub    %eax,%r12d
mov    %rax,%rbp
not    %rbp
add    %r9,%rbp
and    $0x3,%r12
je     1631 <interpshc+0x531>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    0x1(%rax),%rdi
movsd  (%rdx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%r8,%rax,8)
mov    %rdi,%rax
add    $0xffffffffffffffff,%r12
jne    1460 <interpshc+0x360>
cmp    $0x3,%rbp
jb     14de <interpshc+0x3de>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  (%rdx,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%r8,%rdi,8)
movsd  0x8(%rdx,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%r8,%rdi,8)
movsd  0x10(%rdx,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%r8,%rdi,8)
movsd  0x18(%rdx,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x18(%r8,%rdi,8)
lea    0x4(%rdi),%rax
mov    %rax,%rdi
cmp    %rax,%r9
jne    1490 <interpshc+0x390>
cvttsd2si %xmm3,%edi
mov    %edi,(%rcx)
test   %r10d,%r10d
jle    1624 <interpshc+0x524>
mov    %r10d,%ebp
lea    0x1(%rbp),%rax
mov    $0x1,%ecx
cmp    $0x4,%r10d
jb     15a9 <interpshc+0x4a9>
lea    (%rsi,%rax,8),%rdi
add    $0xfffffffffffffff8,%rdi
cmp    %r8,%rdi
seta   %r9b
lea    (%r8,%rax,8),%rdi
add    $0xfffffffffffffff8,%rdi
cmp    %rsi,%rdi
seta   %r10b
lea    (%rdx,%rax,8),%rbx
add    $0xfffffffffffffff8,%rbx
cmp    %r8,%rbx
seta   %bl
cmp    %rdx,%rdi
seta   %dil
test   %r10b,%r9b
jne    15a9 <interpshc+0x4a9>
and    %dil,%bl
jne    15a9 <interpshc+0x4a9>
mov    %ebp,%edi
and    $0xfffffffc,%edi
lea    0x1(%rdi),%rcx
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movupd (%rsi,%rbx,8),%xmm2
movupd 0x10(%rsi,%rbx,8),%xmm3
movupd (%rdx,%rbx,8),%xmm4
movupd 0x10(%rdx,%rbx,8),%xmm5
subpd  %xmm2,%xmm4
subpd  %xmm3,%xmm5
mulpd  %xmm1,%xmm4
addpd  %xmm2,%xmm4
mulpd  %xmm1,%xmm5
addpd  %xmm3,%xmm5
movupd %xmm4,(%r8,%rbx,8)
movupd %xmm5,0x10(%r8,%rbx,8)
add    $0x4,%rbx
cmp    %rbx,%rdi
jne    1560 <interpshc+0x460>
cmp    %rdi,%rbp
je     1624 <interpshc+0x524>
mov    %rcx,%rdi
not    %rdi
test   $0x1,%al
jne    15d6 <interpshc+0x4d6>
movsd  -0x8(%rsi,%rcx,8),%xmm1
movsd  -0x8(%rdx,%rcx,8),%xmm2
subsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm1,%xmm2
movsd  %xmm2,-0x8(%r8,%rcx,8)
add    $0x1,%rcx
add    %rax,%rdi
je     1624 <interpshc+0x524>
nopl   0x0(%rax,%rax,1)
movsd  -0x8(%rsi,%rcx,8),%xmm1
movsd  -0x8(%rdx,%rcx,8),%xmm2
subsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm1,%xmm2
movsd  %xmm2,-0x8(%r8,%rcx,8)
movsd  (%rsi,%rcx,8),%xmm1
movsd  (%rdx,%rcx,8),%xmm2
subsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm1,%xmm2
movsd  %xmm2,(%r8,%rcx,8)
add    $0x2,%rcx
cmp    %rcx,%rax
jne    15e0 <interpshc+0x4e0>
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rax,%rdi
cmp    $0x3,%rbp
jae    1490 <interpshc+0x390>
jmp    14de <interpshc+0x3de>

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

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