#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 bilinear(int, int, int, int, double, double, double, double, double,
                double);
scalar_t__ floor(int);
double wgs84_separation(double lat, double lon) {
  const char geoid_delta[37 * 19] = {
      -30, -30, -30, -30, -30, -30, -30, -30, -30, -30,  -30, -30, -30, -30,
      -30, -30, -30, -30, -30, -30, -30, -30, -30, -30,  -30, -30, -30, -30,
      -30, -30, -30, -30, -30, -30, -30, -30, -30, -53,  -54, -55, -52, -48,
      -42, -38, -38, -29, -26, -26, -24, -23, -21, -19,  -16, -12, -8,  -4,
      -1,  1,   4,   4,   6,   5,   4,   2,   -6,  -15,  -24, -33, -40, -48,
      -50, -53, -52, -53, -61, -60, -61, -55, -49, -44,  -38, -31, -25, -16,
      -6,  1,   4,   5,   4,   2,   6,   12,  16,  16,   17,  21,  20,  26,
      26,  22,  16,  10,  -1,  -16, -29, -36, -46, -55,  -54, -59, -61, -45,
      -43, -37, -32, -30, -26, -23, -22, -16, -10, -2,   10,  20,  20,  21,
      24,  22,  17,  16,  19,  25,  30,  35,  35,  33,   30,  27,  10,  -2,
      -14, -23, -30, -33, -29, -35, -43, -45, -15, -18,  -18, -16, -17, -15,
      -10, -10, -8,  -2,  6,   14,  13,  3,   3,   10,   20,  27,  25,  26,
      34,  39,  45,  45,  38,  39,  28,  13,  -1,  -15,  -22, -22, -18, -15,
      -14, -10, -15, 21,  6,   1,   -7,  -12, -12, -12,  -10, -7,  -1,  8,
      23,  15,  -2,  -6,  6,   21,  24,  18,  26,  31,   33,  39,  41,  30,
      24,  13,  -2,  -20, -32, -33, -27, -14, -2,  5,    20,  21,  46,  22,
      5,   -2,  -8,  -13, -10, -7,  -4,  1,   9,   32,   16,  4,   -8,  4,
      12,  15,  22,  27,  34,  29,  14,  15,  15,  7,    -9,  -25, -37, -39,
      -23, -14, 15,  33,  34,  45,  46,  51,  27,  10,   0,   -9,  -11, -5,
      -2,  -3,  -1,  9,   35,  20,  -5,  -6,  -5,  0,    13,  17,  23,  21,
      8,   -9,  -10, -11, -20, -40, -47, -45, -25, 5,    23,  45,  58,  57,
      63,  51,  36,  22,  11,  6,   -1,  -8,  -10, -8,   -11, -9,  1,   32,
      4,   -18, -13, -9,  4,   14,  12,  13,  -2,  -14,  -25, -32, -38, -60,
      -75, -63, -26, 0,   35,  52,  68,  76,  64,  52,   36,  22,  16,  17,
      13,  1,   -12, -23, -20, -14, -3,  14,  10,  -15,  -27, -18, 3,   12,
      20,  18,  12,  -13, -9,  -28, -49, -62, -89, -102, -63, -9,  33,  58,
      73,  74,  63,  50,  32,  22,  13,  12,  11,  2,    -11, -28, -38, -29,
      -10, 3,   1,   -11, -41, -42, -16, 3,   17,  33,   22,  23,  2,   -3,
      -7,  -36, -59, -90, -95, -63, -24, 12,  53,  60,   58,  46,  36,  26,
      13,  5,   10,  7,   -7,  -23, -39, -47, -34, -9,   -10, -20, -45, -48,
      -32, -9,  17,  25,  31,  31,  26,  15,  6,   1,    -29, -44, -61, -67,
      -59, -36, -11, 21,  39,  49,  39,  22,  10,  5,    -7,  -5,  -8,  -15,
      -28, -40, -42, -29, -22, -26, -32, -51, -40, -17,  17,  31,  34,  44,
      36,  28,  29,  17,  12,  -20, -15, -40, -33, -34,  -34, -28, 7,   29,
      43,  20,  4,   -6,  -7,  -12, -10, -13, -20, -31,  -34, -21, -16, -26,
      -34, -33, -35, -26, 2,   33,  59,  52,  51,  52,   48,  35,  40,  33,
      -9,  -28, -39, -48, -59, -50, -28, 3,   23,  37,   18,  -1,  -11, -12,
      -8,  8,   8,   1,   -11, -19, -16, -18, -22, -35,  -40, -26, -12, 24,
      45,  63,  62,  59,  47,  48,  42,  28,  12,  -10,  -19, -33, -43, -42,
      -43, -29, -2,  17,  23,  22,  6,   2,   -8,  2,    9,   17,  10,  13,
      1,   -14, -30, -39, -46, -42, -21, 6,   29,  49,   65,  60,  57,  47,
      41,  21,  18,  14,  7,   -3,  -22, -29, -32, -32,  -26, -15, -2,  13,
      17,  19,  6,   2,   2,   2,   1,   -1,  -3,  -7,   -14, -24, -27, -25,
      -19, 3,   24,  37,  47,  60,  61,  58,  51,  43,   29,  20,  12,  5,
      -2,  -10, -14, -12, -10, -14, -12, -6,  -2,  3,    6,   4,   2,   3,
      1,   -2,  -3,  -3,  -3,  -1,  3,   1,   5,   9,    11,  19,  27,  31,
      34,  33,  34,  33,  34,  28,  23,  17,  13,  9,    4,   4,   1,   -2,
      -2,  0,   2,   3,   2,   1,   1,   3,   13,  13,   13,  13,  13,  13,
      13,  13,  13,  13,  13,  13,  13,  13,  13,  13,   13,  13,  13,  13,
      13,  13,  13,  13,  13,  13,  13,  13,  13,  13,   13,  13,  13,  13,
      13,  13,  13};
  int ilat, ilon;
  int ilat1, ilat2, ilon1, ilon2;
  ilat = (int)floor((90. + lat) / 10);
  ilon = (int)floor((180. + lon) / 10);
  if ((ilat > 90) || (ilat < -90)) {
    return 0.0;
  }
  if ((ilon > 180) || (ilon < -180)) {
    return 0.0;
  }
  ilat1 = ilat;
  ilon1 = ilon;
  ilat2 = (ilat < 19 - 1) ? ilat + 1 : ilat;
  ilon2 = (ilon < 37 - 1) ? ilon + 1 : ilon;
  return bilinear(ilon1 * 10. - 180., ilat1 * 10. - 90., ilon2 * 10. - 180.,
                  ilat2 * 10. - 90., lon, lat,
                  (double)geoid_delta[ilon1 + ilat1 * 37],
                  (double)geoid_delta[ilon2 + ilat1 * 37],
                  (double)geoid_delta[ilon1 + ilat2 * 37],
                  (double)geoid_delta[ilon2 + ilat2 * 37]);
}


x86 assembly (clang, -O0):
<wgs84_separation>:
push   %rbp
mov    %rsp,%rbp
push   %rbx
sub    $0x2f8,%rsp
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
lea    -0x2e0(%rbp),%rdi
lea    0xedc(%rip),%rsi
mov    $0x2bf,%edx
call   1030 <memcpy@plt>
movsd  0xeaa(%rip),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  0xe8d(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
call   1040 <floor@plt>
mov    %eax,-0x2e4(%rbp)
movsd  0xe7a(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  0xe65(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
call   1040 <floor@plt>
mov    %eax,-0x2e8(%rbp)
cmpl   $0x5a,-0x2e4(%rbp)
jg     11c8 <wgs84_separation+0x98>
cmpl   $0xffffffa6,-0x2e4(%rbp)
jge    11d5 <wgs84_separation+0xa5>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1385 <wgs84_separation+0x255>
cmpl   $0xb4,-0x2e8(%rbp)
jg     11f5 <wgs84_separation+0xc5>
cmpl   $0xffffff4c,-0x2e8(%rbp)
ff ff ff
jge    1202 <wgs84_separation+0xd2>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1385 <wgs84_separation+0x255>
mov    -0x2e4(%rbp),%eax
mov    %eax,-0x2ec(%rbp)
mov    -0x2e8(%rbp),%eax
mov    %eax,-0x2f4(%rbp)
cmpl   $0x12,-0x2e4(%rbp)
jge    123b <wgs84_separation+0x10b>
mov    -0x2e4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2fc(%rbp)
jmp    1247 <wgs84_separation+0x117>
mov    -0x2e4(%rbp),%eax
mov    %eax,-0x2fc(%rbp)
mov    -0x2fc(%rbp),%eax
mov    %eax,-0x2f0(%rbp)
cmpl   $0x24,-0x2e8(%rbp)
jge    1274 <wgs84_separation+0x144>
mov    -0x2e8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x300(%rbp)
jmp    1280 <wgs84_separation+0x150>
mov    -0x2e8(%rbp),%eax
mov    %eax,-0x300(%rbp)
mov    -0x300(%rbp),%eax
mov    %eax,-0x2f8(%rbp)
mov    -0x2f4(%rbp),%r9d
cvtsi2sd %r9d,%xmm0
movsd  0xd60(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xd6c(%rip),%xmm3
addsd  %xmm3,%xmm0
cvttsd2si %xmm0,%edi
mov    -0x2ec(%rbp),%r11d
cvtsi2sd %r11d,%xmm0
mulsd  %xmm2,%xmm0
movsd  0xd54(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%esi
mov    -0x2f8(%rbp),%eax
cvtsi2sd %eax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
cvttsd2si %xmm0,%edx
mov    -0x2f0(%rbp),%r10d
cvtsi2sd %r10d,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
movsd  -0x20(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
mov    %r11d,%r8d
lea    (%r8,%r8,8),%ebx
mov    %ebx,%r11d
lea    (%r8,%r11,4),%r11d
mov    %r9d,%r8d
add    %r11d,%r8d
movslq %r8d,%r8
movsbl -0x2e0(%rbp,%r8,1),%r8d
ff ff
cvtsi2sd %r8d,%xmm2
mov    %eax,%r8d
add    %r11d,%r8d
movslq %r8d,%r8
movsbl -0x2e0(%rbp,%r8,1),%r8d
ff ff
cvtsi2sd %r8d,%xmm3
mov    %r10d,%r8d
lea    (%r8,%r8,8),%r11d
mov    %r11d,%r10d
lea    (%r8,%r10,4),%r8d
add    %r8d,%r9d
movslq %r9d,%r9
movsbl -0x2e0(%rbp,%r9,1),%r9d
ff ff
cvtsi2sd %r9d,%xmm4
add    %r8d,%eax
cltq
movsbl -0x2e0(%rbp,%rax,1),%eax
ff
cvtsi2sd %eax,%xmm5
call   1050 <bilinear@plt>
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
add    $0x2f8,%rsp
pop    %rbx
pop    %rbp
ret

x86 assembly (clang, -O2):
<wgs84_separation>:
push   %r14
push   %rbx
sub    $0x18,%rsp
movsd  %xmm1,0x8(%rsp)
movsd  0xecb(%rip),%xmm1
movsd  %xmm0,0x10(%rsp)
addsd  %xmm0,%xmm1
divsd  0xec1(%rip),%xmm1
cvttsd2si %xmm1,%edi
call   1030 <floor@plt>
mov    %rax,%r14
movsd  0xeb5(%rip),%xmm0
addsd  0x8(%rsp),%xmm0
divsd  0xe9f(%rip),%xmm0
cvttsd2si %xmm0,%edi
call   1030 <floor@plt>
lea    -0x5b(%r14),%ecx
cmp    $0xffffff4b,%ecx
jb     1288 <wgs84_separation+0x168>
lea    -0xb5(%rax),%ecx
cmp    $0xfffffe97,%ecx
jb     1288 <wgs84_separation+0x168>
xor    %r8d,%r8d
cmp    $0x12,%r14d
setl   %r8b
add    %r14d,%r8d
xor    %r9d,%r9d
cmp    $0x24,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
setl   %r9b
movsd  0xe4d(%rip),%xmm3
mulsd  %xmm3,%xmm0
movsd  0xe51(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
xorps  %xmm0,%xmm0
cvtsi2sd %r14d,%xmm0
add    %eax,%r9d
mulsd  %xmm3,%xmm0
movsd  0xe3a(%rip),%xmm2
addsd  %xmm2,%xmm0
cvttsd2si %xmm0,%esi
xorps  %xmm0,%xmm0
cvtsi2sd %r9d,%xmm0
mulsd  %xmm3,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edx
xorps  %xmm0,%xmm0
cvtsi2sd %r8d,%xmm0
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
cvttsd2si %xmm0,%ecx
movslq %r14d,%r10
lea    (%r10,%r10,8),%rbx
lea    (%r10,%rbx,4),%rbx
movslq %eax,%r14
lea    (%rbx,%r14,1),%r10
lea    0xe01(%rip),%r11
movsbl (%r11,%r10,1),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
movslq %r9d,%rax
add    %rax,%rbx
movsbl (%r11,%rbx,1),%ebx
xorps  %xmm3,%xmm3
cvtsi2sd %ebx,%xmm3
movslq %r8d,%r8
lea    (%r8,%r8,8),%rbx
lea    (%r8,%rbx,4),%r8
add    %r8,%r14
movsbl (%r11,%r14,1),%ebx
cvtsi2sd %ebx,%xmm4
add    %r8,%rax
movsbl (%r11,%rax,1),%eax
cvtsi2sd %eax,%xmm5
movsd  0x8(%rsp),%xmm0
movsd  0x10(%rsp),%xmm1
add    $0x18,%rsp
pop    %rbx
pop    %r14
jmp    1040 <bilinear@plt>
xorpd  %xmm0,%xmm0
add    $0x18,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@__const.wgs84_separation.geoid_delta = [703 x i8] c"\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\CB\CA\C9\CC\D0\D6\DA\DA\E3\E6\E6\E8\E9\EB\ED\F0\F4\F8\FC\FF\01\04\04\06\05\04\02\FA\F1\E8\DF\D8\D0\CE\CB\CC\CB\C3\C4\C3\C9\CF\D4\DA\E1\E7\F0\FA\01\04\05\04\02\06\0C\10\10\11\15\14\1A\1A\16\10\0A\FF\F0\E3\DC\D2\C9\CA\C5\C3\D3\D5\DB\E0\E2\E6\E9\EA\F0\F6\FE\0A\14\14\15\18\16\11\10\13\19\1E##!\1E\1B\0A\FE\F2\E9\E2\DF\E3\DD\D5\D3\F1\EE\EE\F0\EF\F1\F6\F6\F8\FE\06\0E\0D\03\03\0A\14\1B\19\1A\22'--&'\1C\0D\FF\F1\EA\EA\EE\F1\F2\F6\F1\15\06\01\F9\F4\F4\F4\F6\F9\FF\08\17\0F\FE\FA\06\15\18\12\1A\1F!')\1E\18\0D\FE\EC\E0\DF\E5\F2\FE\05\14\15.\16\05\FE\F8\F3\F6\F9\FC\01\09 \10\04\F8\04\0C\0F\16\1B\22\1D\0E\0F\0F\07\F7\E7\DB\D9\E9\F2\0F!\22-.3\1B\0A\00\F7\F5\FB\FE\FD\FF\09#\14\FB\FA\FB\00\0D\11\17\15\08\F7\F6\F5\EC\D8\D1\D3\E7\05\17-:9?3$\16\0B\06\FF\F8\F6\F8\F5\F7\01 \04\EE\F3\F7\04\0E\0C\0D\FE\F2\E7\E0\DA\C4\B5\C1\E6\00DL@4$\16\10\11\0D\01\F4\E9\EC\F2\FD\0E\0A\F1\E5\EE\03\0C\14\12\0C\F3\F7\E4\CF\C2\A7\9A\C1\F7!:IJ?2 \16\0D\0C\0B\02\F5\E4\DA\E3\F6\03\01\F5\D7\D6\F0\03\11!\16\17\02\FD\F9\DC\C5\A6\A1\C1\E8\0C5<:.$\1A\0D\05\0A\07\F9\E9\D9\D1\DE\F7\F6\EC\D3\D0\E0\F7\11\19\1F\1F\1A\0F\06\01\E3\D4\C3\BD\C5\DC\F5\15'1'\16\0A\05\F9\FB\F8\F1\E4\D8\D6\E3\EA\E6\E0\CD\D8\EF\11\1F\22,$\1C\1D\11\0C\EC\F1\D8\DF\DE\DE\E4\07\1D+\14\04\FA\F9\F4\F6\F3\EC\E1\DE\EB\F0\E6\DE\DF\DD\E6\02!;4340#(!\F7\E4\D9\D0\C5\CE\E4\03\17%\12\FF\F5\F4\F8\08\08\01\F5\ED\F0\EE\EA\DD\D8\E6\F4\18-?>;/0*\1C\0C\F6\ED\DF\D5\D6\D5\E3\FE\11\17\16\06\02\F8\02\09\11\0A\0D\01\F2\E2\D9\D2\D6\EB\06\1D1A<9/)\15\12\0E\07\FD\EA\E3\E0\E0\E6\F1\FE\0D\11\13\06\02\02\02\01\FF\FD\F9\F2\E8\E5\E7\ED\03\18%/<=:3+\1D\14\0C\05\FE\F6\F2\F4\F6\F2\F4\FA\FE\03\06\04\02\03\01\FE\FD\FD\FD\FF\03\01\05\09\0B\13\1B\1F\22!\22!\22\1C\17\11\0D\09\04\04\01\FE\FE\00\02\03\02\01\01\03\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D"
define double @wgs84_separation(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca [703 x i8]
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store double %0, double* %4
store double %1, double* %5
%13 = bitcast [703 x i8]* %6 to i8*
%14 = load double, double* %4
%15 = fadd double 9.000000e+01, %14
%16 = fdiv double %15, 1.000000e+01
%17 = fptosi double %16 to i32
%18 = call i64 @floor(i32 %17)
%19 = trunc i64 %18 to i32
store i32 %19, i32* %7
%20 = load double, double* %5
%21 = fadd double 1.800000e+02, %20
%22 = fdiv double %21, 1.000000e+01
%23 = fptosi double %22 to i32
%24 = call i64 @floor(i32 %23)
%25 = trunc i64 %24 to i32
store i32 %25, i32* %8
%26 = load i32, i32* %7
%27 = icmp sgt i32 %26, 90
br i1 %27, label %31, label %28
28: ; preds = %2
%29 = load i32, i32* %7
%30 = icmp slt i32 %29, -90
br i1 %30, label %31, label %32
31: ; preds = %28, %2
store double 0.000000e+00, double* %3
br label %111
32: ; preds = %28
%33 = load i32, i32* %8
%34 = icmp sgt i32 %33, 180
br i1 %34, label %38, label %35
35: ; preds = %32
%36 = load i32, i32* %8
%37 = icmp slt i32 %36, -180
br i1 %37, label %38, label %39
38: ; preds = %35, %32
store double 0.000000e+00, double* %3
br label %111
39: ; preds = %35
%40 = load i32, i32* %7
store i32 %40, i32* %9
%41 = load i32, i32* %8
store i32 %41, i32* %11
%42 = load i32, i32* %7
%43 = icmp slt i32 %42, 18
br i1 %43, label %44, label %47
44: ; preds = %39
%45 = load i32, i32* %7
%46 = add nsw i32 %45, 1
br label %49
47: ; preds = %39
%48 = load i32, i32* %7
br label %49
49: ; preds = %47, %44
%50 = phi i32 [ %46, %44 ], [ %48, %47 ]
store i32 %50, i32* %10
%51 = load i32, i32* %8
%52 = icmp slt i32 %51, 36
br i1 %52, label %53, label %56
53: ; preds = %49
%54 = load i32, i32* %8
%55 = add nsw i32 %54, 1
br label %58
56: ; preds = %49
%57 = load i32, i32* %8
br label %58
58: ; preds = %56, %53
%59 = phi i32 [ %55, %53 ], [ %57, %56 ]
store i32 %59, i32* %12
%60 = load i32, i32* %11
%61 = sitofp i32 %60 to double
%62 = call double @llvm.fmuladd.f64(double %61, double 1.000000e+01, double -1.800000e+02)
%63 = fptosi double %62 to i32
%64 = load i32, i32* %9
%65 = sitofp i32 %64 to double
%66 = call double @llvm.fmuladd.f64(double %65, double 1.000000e+01, double -9.000000e+01)
%67 = fptosi double %66 to i32
%68 = load i32, i32* %12
%69 = sitofp i32 %68 to double
%70 = call double @llvm.fmuladd.f64(double %69, double 1.000000e+01, double -1.800000e+02)
%71 = fptosi double %70 to i32
%72 = load i32, i32* %10
%73 = sitofp i32 %72 to double
%74 = call double @llvm.fmuladd.f64(double %73, double 1.000000e+01, double -9.000000e+01)
%75 = fptosi double %74 to i32
%76 = load double, double* %5
%77 = load double, double* %4
%78 = load i32, i32* %11
%79 = load i32, i32* %9
%80 = mul nsw i32 %79, 37
%81 = add nsw i32 %78, %80
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds [703 x i8], [703 x i8]* %6, i64 0, i64 %82
%84 = load i8, i8* %83
%85 = sitofp i8 %84 to double
%86 = load i32, i32* %12
%87 = load i32, i32* %9
%88 = mul nsw i32 %87, 37
%89 = add nsw i32 %86, %88
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds [703 x i8], [703 x i8]* %6, i64 0, i64 %90
%92 = load i8, i8* %91
%93 = sitofp i8 %92 to double
%94 = load i32, i32* %11
%95 = load i32, i32* %10
%96 = mul nsw i32 %95, 37
%97 = add nsw i32 %94, %96
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds [703 x i8], [703 x i8]* %6, i64 0, i64 %98
%100 = load i8, i8* %99
%101 = sitofp i8 %100 to double
%102 = load i32, i32* %12
%103 = load i32, i32* %10
%104 = mul nsw i32 %103, 37
%105 = add nsw i32 %102, %104
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds [703 x i8], [703 x i8]* %6, i64 0, i64 %106
%108 = load i8, i8* %107
%109 = sitofp i8 %108 to double
%110 = call double @bilinear(i32 %63, i32 %67, i32 %71, i32 %75, double %76, double %77, double %85, double %93, double %101, double %109)
store double %110, double* %3
br label %111
111: ; preds = %58, %38, %31
%112 = load double, double* %3
ret double %112
}

LLVM IR (-O2):
@__const.wgs84_separation.geoid_delta = [703 x i8] c"\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\E2\CB\CA\C9\CC\D0\D6\DA\DA\E3\E6\E6\E8\E9\EB\ED\F0\F4\F8\FC\FF\01\04\04\06\05\04\02\FA\F1\E8\DF\D8\D0\CE\CB\CC\CB\C3\C4\C3\C9\CF\D4\DA\E1\E7\F0\FA\01\04\05\04\02\06\0C\10\10\11\15\14\1A\1A\16\10\0A\FF\F0\E3\DC\D2\C9\CA\C5\C3\D3\D5\DB\E0\E2\E6\E9\EA\F0\F6\FE\0A\14\14\15\18\16\11\10\13\19\1E##!\1E\1B\0A\FE\F2\E9\E2\DF\E3\DD\D5\D3\F1\EE\EE\F0\EF\F1\F6\F6\F8\FE\06\0E\0D\03\03\0A\14\1B\19\1A\22'--&'\1C\0D\FF\F1\EA\EA\EE\F1\F2\F6\F1\15\06\01\F9\F4\F4\F4\F6\F9\FF\08\17\0F\FE\FA\06\15\18\12\1A\1F!')\1E\18\0D\FE\EC\E0\DF\E5\F2\FE\05\14\15.\16\05\FE\F8\F3\F6\F9\FC\01\09 \10\04\F8\04\0C\0F\16\1B\22\1D\0E\0F\0F\07\F7\E7\DB\D9\E9\F2\0F!\22-.3\1B\0A\00\F7\F5\FB\FE\FD\FF\09#\14\FB\FA\FB\00\0D\11\17\15\08\F7\F6\F5\EC\D8\D1\D3\E7\05\17-:9?3$\16\0B\06\FF\F8\F6\F8\F5\F7\01 \04\EE\F3\F7\04\0E\0C\0D\FE\F2\E7\E0\DA\C4\B5\C1\E6\00DL@4$\16\10\11\0D\01\F4\E9\EC\F2\FD\0E\0A\F1\E5\EE\03\0C\14\12\0C\F3\F7\E4\CF\C2\A7\9A\C1\F7!:IJ?2 \16\0D\0C\0B\02\F5\E4\DA\E3\F6\03\01\F5\D7\D6\F0\03\11!\16\17\02\FD\F9\DC\C5\A6\A1\C1\E8\0C5<:.$\1A\0D\05\0A\07\F9\E9\D9\D1\DE\F7\F6\EC\D3\D0\E0\F7\11\19\1F\1F\1A\0F\06\01\E3\D4\C3\BD\C5\DC\F5\15'1'\16\0A\05\F9\FB\F8\F1\E4\D8\D6\E3\EA\E6\E0\CD\D8\EF\11\1F\22,$\1C\1D\11\0C\EC\F1\D8\DF\DE\DE\E4\07\1D+\14\04\FA\F9\F4\F6\F3\EC\E1\DE\EB\F0\E6\DE\DF\DD\E6\02!;4340#(!\F7\E4\D9\D0\C5\CE\E4\03\17%\12\FF\F5\F4\F8\08\08\01\F5\ED\F0\EE\EA\DD\D8\E6\F4\18-?>;/0*\1C\0C\F6\ED\DF\D5\D6\D5\E3\FE\11\17\16\06\02\F8\02\09\11\0A\0D\01\F2\E2\D9\D2\D6\EB\06\1D1A<9/)\15\12\0E\07\FD\EA\E3\E0\E0\E6\F1\FE\0D\11\13\06\02\02\02\01\FF\FD\F9\F2\E8\E5\E7\ED\03\18%/<=:3+\1D\14\0C\05\FE\F6\F2\F4\F6\F2\F4\FA\FE\03\06\04\02\03\01\FE\FD\FD\FD\FF\03\01\05\09\0B\13\1B\1F\22!\22!\22\1C\17\11\0D\09\04\04\01\FE\FE\00\02\03\02\01\01\03\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D\0D"
define double @wgs84_separation(double %0, double %1) {
%3 = fadd double %0, 9.000000e+01
%4 = fdiv double %3, 1.000000e+01
%5 = fptosi double %4 to i32
%6 = tail call i64 @floor(i32 %5)
%7 = trunc i64 %6 to i32
%8 = fadd double %1, 1.800000e+02
%9 = fdiv double %8, 1.000000e+01
%10 = fptosi double %9 to i32
%11 = tail call i64 @floor(i32 %10)
%12 = trunc i64 %11 to i32
%13 = add i32 %7, -91
%14 = icmp ult i32 %13, -181
%15 = add i32 %12, -181
%16 = icmp ult i32 %15, -361
%17 = select i1 %14, i1 true, i1 %16
br i1 %17, label %60, label %18
18: ; preds = %2
%19 = icmp slt i32 %7, 18
%20 = zext i1 %19 to i32
%21 = add nsw i32 %20, %7
%22 = icmp slt i32 %12, 36
%23 = zext i1 %22 to i32
%24 = add nsw i32 %23, %12
%25 = sitofp i32 %12 to double
%26 = tail call double @llvm.fmuladd.f64(double %25, double 1.000000e+01, double -1.800000e+02)
%27 = fptosi double %26 to i32
%28 = sitofp i32 %7 to double
%29 = tail call double @llvm.fmuladd.f64(double %28, double 1.000000e+01, double -9.000000e+01)
%30 = fptosi double %29 to i32
%31 = sitofp i32 %24 to double
%32 = tail call double @llvm.fmuladd.f64(double %31, double 1.000000e+01, double -1.800000e+02)
%33 = fptosi double %32 to i32
%34 = sitofp i32 %21 to double
%35 = tail call double @llvm.fmuladd.f64(double %34, double 1.000000e+01, double -9.000000e+01)
%36 = fptosi double %35 to i32
%37 = mul nsw i32 %7, 37
%38 = add nsw i32 %37, %12
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds [703 x i8], [703 x i8]* @__const.wgs84_separation.geoid_delta, i64 0, i64 %39
%41 = load i8, i8* %40
%42 = sitofp i8 %41 to double
%43 = add nsw i32 %24, %37
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds [703 x i8], [703 x i8]* @__const.wgs84_separation.geoid_delta, i64 0, i64 %44
%46 = load i8, i8* %45
%47 = sitofp i8 %46 to double
%48 = mul nsw i32 %21, 37
%49 = add nsw i32 %48, %12
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds [703 x i8], [703 x i8]* @__const.wgs84_separation.geoid_delta, i64 0, i64 %50
%52 = load i8, i8* %51
%53 = sitofp i8 %52 to double
%54 = add nsw i32 %24, %48
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [703 x i8], [703 x i8]* @__const.wgs84_separation.geoid_delta, i64 0, i64 %55
%57 = load i8, i8* %56
%58 = sitofp i8 %57 to double
%59 = tail call double @bilinear(i32 %27, i32 %30, i32 %33, i32 %36, double %1, double %0, double %42, double %47, double %53, double %58)
br label %60
60: ; preds = %2, %18
%61 = phi double [ %59, %18 ], [ 0.000000e+00, %2 ]
ret double %61
}