#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 M_PI;
int /*<<< orphan*/ assert(int);
double cos(double const);
int pow(double const, int);
double sin(double const);
double sqrt(int);
double tan(double const);
void utm(double lat, double lon, double *x, double *y) {
  assert(x && y);
  const int cm = (lon >= 0.0) ? ((int)lon - ((int)lon) % 6 + 3)
                              : ((int)lon - ((int)lon) % 6 - 3);
  const double rlat = lat * M_PI / 180;
  const double rlon = lon * M_PI / 180;
  const double rlon0 = cm * M_PI / 180;
  const double slat = sin(rlat);
  const double clat = cos(rlat);
  const double tlat = tan(rlat);
  const double fn = (lat > 0) ? 0.0 : 10000000.0;
  const double T = tlat * tlat;
  const double C =
      ((0.0818191908 * 0.0818191908) / (1 - (0.0818191908 * 0.0818191908))) *
      clat * clat;
  const double A = (rlon - rlon0) * clat;
  const double M =
      6378137.0 *
      (((double)(1 - (0.0818191908 * 0.0818191908) / 4 -
                 3 *
                     ((0.0818191908 * 0.0818191908) *
                      (0.0818191908 * 0.0818191908)) /
                     64 -
                 5 *
                     (((0.0818191908 * 0.0818191908) *
                       (0.0818191908 * 0.0818191908)) *
                      (0.0818191908 * 0.0818191908)) /
                     256)) *
           rlat +
       ((double)(-(
           3 * (0.0818191908 * 0.0818191908) / 8 +
           3 * ((0.0818191908 * 0.0818191908) * (0.0818191908 * 0.0818191908)) /
               32 +
           45 *
               (((0.0818191908 * 0.0818191908) *
                 (0.0818191908 * 0.0818191908)) *
                (0.0818191908 * 0.0818191908)) /
               1024))) *
           sin(2 * rlat) +
       ((double)(15 *
                     ((0.0818191908 * 0.0818191908) *
                      (0.0818191908 * 0.0818191908)) /
                     256 +
                 45 *
                     (((0.0818191908 * 0.0818191908) *
                       (0.0818191908 * 0.0818191908)) *
                      (0.0818191908 * 0.0818191908)) /
                     1024)) *
           sin(4 * rlat) +
       ((double)(-(
           35 *
           (((0.0818191908 * 0.0818191908) * (0.0818191908 * 0.0818191908)) *
            (0.0818191908 * 0.0818191908)) /
           3072))) *
           sin(6 * rlat));
  const double V =
      6378137.0 / sqrt(1 - (0.0818191908 * 0.0818191908) * slat * slat);
  *x = 500000.0 + 0.9996 * V *
                      (A + (1 - T + C) * pow(A, 3) / 6 +
                       (5 - 18 * T + T * T + 72 * C -
                        58 * ((0.0818191908 * 0.0818191908) /
                              (1 - (0.0818191908 * 0.0818191908)))) *
                           pow(A, 5) / 120);
  *y = fn + 0.9996 * (M + V * tlat *
                              (A * A / 2 +
                               (5 - T + 9 * C + 4 * C * C) * pow(A, 4) / 24 +
                               (61 - 58 * T + T * T + 600 * C -
                                330 * ((0.0818191908 * 0.0818191908) /
                                       (1 - (0.0818191908 * 0.0818191908)))) *
                                   pow(A, 6) / 720));
}


x86 assembly (clang, -O0):
<utm>:
push   %rbp
mov    %rsp,%rbp
sub    $0x110,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x18(%rbp)
mov    %al,-0x89(%rbp)
je     119e <utm+0x3e>
cmpq   $0x0,-0x20(%rbp)
setne  %al
mov    %al,-0x89(%rbp)
mov    -0x89(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     11ee <utm+0x8e>
cvttsd2si -0x10(%rbp),%eax
mov    %eax,-0x94(%rbp)
cvttsd2si -0x10(%rbp),%eax
mov    $0x6,%ecx
cltd
idiv   %ecx
mov    -0x94(%rbp),%eax
sub    %edx,%eax
add    $0x3,%eax
mov    %eax,-0x90(%rbp)
jmp    1217 <utm+0xb7>
cvttsd2si -0x10(%rbp),%eax
mov    %eax,-0x98(%rbp)
cvttsd2si -0x10(%rbp),%eax
mov    $0x6,%ecx
cltd
idiv   %ecx
mov    -0x98(%rbp),%eax
sub    %edx,%eax
sub    $0x3,%eax
mov    %eax,-0x90(%rbp)
mov    -0x90(%rbp),%eax
mov    %eax,-0x24(%rbp)
movsd  -0x8(%rbp),%xmm0
mov    0x2dbc(%rip),%rax
mulsd  (%rax),%xmm0
movsd  0xe98(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x10(%rbp),%xmm0
mov    0x2d9b(%rip),%rax
mulsd  (%rax),%xmm0
movsd  0xe77(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
cvtsi2sdl -0x24(%rbp),%xmm0
mov    0x2d7a(%rip),%rax
mulsd  (%rax),%xmm0
movsd  0xe56(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1040 <sin@plt>
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1060 <cos@plt>
movsd  %xmm0,-0x50(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1050 <tan@plt>
movsd  %xmm0,-0x58(%rbp)
movsd  -0x8(%rbp),%xmm1
xorps  %xmm3,%xmm3
movsd  0xe08(%rip),%xmm2
movaps %xmm3,%xmm0
cmpltsd %xmm1,%xmm0
movaps %xmm0,%xmm1
andpd  %xmm3,%xmm1
andnpd %xmm2,%xmm0
orpd   %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x58(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  0xdcd(%rip),%xmm0
mulsd  -0x50(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x38(%rbp),%xmm0
subsd  -0x40(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x110(%rbp)
ff
movsd  0xd25(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
call   1040 <sin@plt>
movaps %xmm0,%xmm2
movsd  -0x110(%rbp),%xmm0
ff
movsd  0xd70(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  0xd5c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x108(%rbp)
ff
movsd  0xccc(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
call   1040 <sin@plt>
movsd  -0x108(%rbp),%xmm1
ff
movsd  0xd22(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x100(%rbp)
ff
movsd  0xce2(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
call   1040 <sin@plt>
movaps %xmm0,%xmm1
movsd  -0x100(%rbp),%xmm0
ff
movsd  0xce5(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xcc5(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  0xcbc(%rip),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xc7f(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
call   1080 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  0xc6f(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  0xbcb(%rip),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  0xc2e(%rip),%xmm0
subsd  -0x68(%rbp),%xmm0
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
mov    $0x3,%edi
call   1070 <pow@plt>
movsd  -0xf8(%rbp),%xmm1
ff
movsd  -0xf0(%rbp),%xmm0
ff
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xbe5(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0x68(%rbp),%xmm0
movsd  0xbc0(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xb84(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x68(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x70(%rbp),%xmm0
movsd  0xb89(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xb71(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
mov    $0x5,%edi
call   1070 <pow@plt>
movsd  -0xe8(%rbp),%xmm2
ff
movsd  -0xe0(%rbp),%xmm1
ff
movsd  -0xd8(%rbp),%xmm0
ff
cvtsi2sd %eax,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xb26(%rip),%xmm3
divsd  %xmm3,%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xb0a(%rip),%xmm1
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  0xab5(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  0xa99(%rip),%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm1
movsd  0xa7f(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xa67(%rip),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
mov    $0x4,%edi
call   1070 <pow@plt>
movsd  -0xd0(%rbp),%xmm1
ff
movsd  -0xc8(%rbp),%xmm0
ff
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xa16(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0x68(%rbp),%xmm0
movsd  0x9e9(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0x9e5(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x68(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x70(%rbp),%xmm0
movsd  0x9b2(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x99a(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
mov    $0x6,%edi
call   1070 <pow@plt>
movsd  -0xc0(%rbp),%xmm4
ff
movsd  -0xb8(%rbp),%xmm3
ff
movsd  -0xb0(%rbp),%xmm0
ff
movsd  -0xa8(%rbp),%xmm2
ff
movsd  -0xa0(%rbp),%xmm1
ff
cvtsi2sd %eax,%xmm5
mulsd  %xmm5,%xmm4
movsd  0x93f(%rip),%xmm5
divsd  %xmm5,%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
movsd  0x91f(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
add    $0x110,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<utm>:
push   %r14
push   %rbx
sub    $0x68,%rsp
mov    %rsi,%r14
mov    %rdi,%rbx
movsd  %xmm1,0x10(%rsp)
movsd  %xmm0,0x8(%rsp)
test   %rdi,%rdi
setne  %al
test   %rsi,%rsi
setne  %cl
and    %al,%cl
movzbl %cl,%edi
call   1030 <assert@plt>
movsd  0x10(%rsp),%xmm2
cvttsd2si %xmm2,%eax
cltq
imul   $0x2aaaaaab,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
shr    $0x20,%rcx
add    %edx,%ecx
add    %ecx,%ecx
lea    0x3(%rax),%edx
lea    -0x3(%rax),%esi
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
lea    (%rcx,%rcx,2),%ecx
cmovae %edx,%esi
sub    %eax,%ecx
add    %esi,%ecx
mov    0x2e18(%rip),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm1
mulsd  0x8(%rsp),%xmm0
movsd  0xe0f(%rip),%xmm3
divsd  %xmm3,%xmm0
movsd  %xmm0,(%rsp)
divsd  %xmm3,%xmm2
divsd  %xmm3,%xmm1
subsd  %xmm1,%xmm2
movsd  %xmm2,0x10(%rsp)
call   1040 <sin@plt>
movsd  %xmm0,0x20(%rsp)
movsd  (%rsp),%xmm0
call   1060 <cos@plt>
movsd  %xmm0,0x18(%rsp)
movsd  (%rsp),%xmm0
call   1050 <tan@plt>
movsd  %xmm0,0x28(%rsp)
xorpd  %xmm1,%xmm1
cmpltsd 0x8(%rsp),%xmm1
movsd  0xdbe(%rip),%xmm2
andnpd %xmm2,%xmm1
movapd %xmm1,0x50(%rsp)
mulsd  %xmm0,%xmm0
movsd  %xmm0,0x30(%rsp)
movsd  0xdaa(%rip),%xmm0
movsd  0x18(%rsp),%xmm1
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rsp)
movsd  0x10(%rsp),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rsp)
movsd  (%rsp),%xmm0
addsd  %xmm0,%xmm0
call   1040 <sin@plt>
mulsd  0xd78(%rip),%xmm0
movsd  0xd78(%rip),%xmm2
movsd  (%rsp),%xmm1
mulsd  %xmm1,%xmm2
addsd  %xmm0,%xmm2
movsd  %xmm2,0x18(%rsp)
movapd %xmm1,%xmm0
mulsd  0xd61(%rip),%xmm0
call   1040 <sin@plt>
mulsd  0xd5c(%rip),%xmm0
addsd  0x18(%rsp),%xmm0
movsd  %xmm0,0x18(%rsp)
movsd  (%rsp),%xmm0
mulsd  0xd4b(%rip),%xmm0
call   1040 <sin@plt>
mulsd  0xd46(%rip),%xmm0
addsd  0x18(%rsp),%xmm0
mulsd  0xd40(%rip),%xmm0
movsd  %xmm0,0x18(%rsp)
movsd  0xd3a(%rip),%xmm0
movsd  0x20(%rsp),%xmm1
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
addsd  0xd2c(%rip),%xmm0
cvttsd2si %xmm0,%edi
call   1080 <sqrt@plt>
movsd  0xd0b(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rsp)
mulsd  0xd12(%rip),%xmm1
movsd  %xmm1,0x38(%rsp)
movsd  0xcfc(%rip),%xmm0
subsd  0x30(%rsp),%xmm0
addsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x20(%rsp)
movsd  0x10(%rsp),%xmm0
mov    $0x3,%edi
call   1070 <pow@plt>
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  0x20(%rsp),%xmm1
divsd  0xca5(%rip),%xmm1
movsd  0x10(%rsp),%xmm0
addsd  %xmm0,%xmm1
movsd  %xmm1,0x48(%rsp)
movsd  0xcbd(%rip),%xmm2
movsd  0x30(%rsp),%xmm1
mulsd  %xmm1,%xmm2
addsd  0xcb3(%rip),%xmm2
movapd %xmm1,%xmm3
mulsd  %xmm1,%xmm3
movsd  %xmm3,0x20(%rsp)
addsd  %xmm3,%xmm2
movsd  0xca1(%rip),%xmm1
mulsd  0x8(%rsp),%xmm1
addsd  %xmm2,%xmm1
addsd  0xc97(%rip),%xmm1
movsd  %xmm1,0x40(%rsp)
mov    $0x5,%edi
call   1070 <pow@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x40(%rsp),%xmm0
divsd  0xc7a(%rip),%xmm0
addsd  0x48(%rsp),%xmm0
mulsd  0x38(%rsp),%xmm0
addsd  0xc6e(%rip),%xmm0
movsd  %xmm0,(%rbx)
movsd  0x10(%rsp),%xmm0
movapd %xmm0,%xmm1
mulsd  %xmm0,%xmm1
mulsd  0xc5c(%rip),%xmm1
movsd  %xmm1,0x38(%rsp)
movsd  (%rsp),%xmm1
mulsd  0x28(%rsp),%xmm1
movsd  %xmm1,(%rsp)
movsd  0xc16(%rip),%xmm3
subsd  0x30(%rsp),%xmm3
movsd  0xc38(%rip),%xmm1
movsd  0x8(%rsp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm3,%xmm1
movsd  0xbaa(%rip),%xmm3
mulsd  %xmm2,%xmm3
mulsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
movsd  %xmm3,0x28(%rsp)
mov    $0x4,%edi
call   1070 <pow@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x28(%rsp),%xmm0
divsd  0xbf9(%rip),%xmm0
addsd  0x38(%rsp),%xmm0
movsd  %xmm0,0x28(%rsp)
movsd  0x30(%rsp),%xmm1
mulsd  0xbe7(%rip),%xmm1
addsd  0xbe7(%rip),%xmm1
movsd  0x8(%rsp),%xmm0
mulsd  0xbe1(%rip),%xmm0
addsd  0x20(%rsp),%xmm1
addsd  %xmm1,%xmm0
addsd  0xbd7(%rip),%xmm0
movsd  %xmm0,0x8(%rsp)
movsd  0x10(%rsp),%xmm0
mov    $0x6,%edi
call   1070 <pow@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x8(%rsp),%xmm0
divsd  0xbb4(%rip),%xmm0
addsd  0x28(%rsp),%xmm0
mulsd  (%rsp),%xmm0
addsd  0x18(%rsp),%xmm0
mulsd  0xb2b(%rip),%xmm0
addsd  0x50(%rsp),%xmm0
movsd  %xmm0,(%r14)
add    $0x68,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@M_PI = global double 0.000000e+00
define void @utm(double %0, double %1, double* %2, double* %3) {
%5 = alloca double
%6 = alloca double
%7 = alloca double*
%8 = alloca double*
%9 = alloca i32
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
store double %0, double* %5
store double %1, double* %6
store double* %2, double** %7
store double* %3, double** %8
%22 = load double*, double** %7
%23 = icmp ne double* %22, null
br i1 %23, label %24, label %27
24: ; preds = %4
%25 = load double*, double** %8
%26 = icmp ne double* %25, null
br label %27
27: ; preds = %24, %4
%28 = phi i1 [ false, %4 ], [ %26, %24 ]
%29 = zext i1 %28 to i32
%30 = call i32 @assert(i32 %29)
%31 = load double, double* %6
%32 = fcmp oge double %31, 0.000000e+00
br i1 %32, label %33, label %41
33: ; preds = %27
%34 = load double, double* %6
%35 = fptosi double %34 to i32
%36 = load double, double* %6
%37 = fptosi double %36 to i32
%38 = srem i32 %37, 6
%39 = sub nsw i32 %35, %38
%40 = add nsw i32 %39, 3
br label %49
41: ; preds = %27
%42 = load double, double* %6
%43 = fptosi double %42 to i32
%44 = load double, double* %6
%45 = fptosi double %44 to i32
%46 = srem i32 %45, 6
%47 = sub nsw i32 %43, %46
%48 = sub nsw i32 %47, 3
br label %49
49: ; preds = %41, %33
%50 = phi i32 [ %40, %33 ], [ %48, %41 ]
store i32 %50, i32* %9
%51 = load double, double* %5
%52 = load double, double* @M_PI
%53 = fmul double %51, %52
%54 = fdiv double %53, 1.800000e+02
store double %54, double* %10
%55 = load double, double* %6
%56 = load double, double* @M_PI
%57 = fmul double %55, %56
%58 = fdiv double %57, 1.800000e+02
store double %58, double* %11
%59 = load i32, i32* %9
%60 = sitofp i32 %59 to double
%61 = load double, double* @M_PI
%62 = fmul double %60, %61
%63 = fdiv double %62, 1.800000e+02
store double %63, double* %12
%64 = load double, double* %10
%65 = call double @sin(double %64)
store double %65, double* %13
%66 = load double, double* %10
%67 = call double @cos(double %66)
store double %67, double* %14
%68 = load double, double* %10
%69 = call double @tan(double %68)
store double %69, double* %15
%70 = load double, double* %5
%71 = fcmp ogt double %70, 0.000000e+00
%72 = zext i1 %71 to i64
%73 = select i1 %71, double 0.000000e+00, double 1.000000e+07
store double %73, double* %16
%74 = load double, double* %15
%75 = load double, double* %15
%76 = fmul double %74, %75
store double %76, double* %17
%77 = load double, double* %14
%78 = fmul double 0x3F7B9ADFE11B819B, %77
%79 = load double, double* %14
%80 = fmul double %78, %79
store double %80, double* %18
%81 = load double, double* %11
%82 = load double, double* %12
%83 = fsub double %81, %82
%84 = load double, double* %14
%85 = fmul double %83, %84
store double %85, double* %19
%86 = load double, double* %10
%87 = load double, double* %10
%88 = fmul double 2.000000e+00, %87
%89 = call double @sin(double %88)
%90 = fmul double 0xBF649983626E297C, %89
%91 = call double @llvm.fmuladd.f64(double 0x3FEFF245CC9542D2, double %86, double %90)
%92 = load double, double* %10
%93 = fmul double 4.000000e+00, %92
%94 = call double @sin(double %93)
%95 = call double @llvm.fmuladd.f64(double 0x3EC6234F34905CCE, double %94, double %91)
%96 = load double, double* %10
%97 = fmul double 6.000000e+00, %96
%98 = call double @sin(double %97)
%99 = call double @llvm.fmuladd.f64(double 0xBE2D5C5CE1150324, double %98, double %95)
%100 = fmul double 0x415854A640000000, %99
store double %100, double* %20
%101 = load double, double* %13
%102 = fmul double 0x3F7B6B90F183E287, %101
%103 = load double, double* %13
%104 = fneg double %102
%105 = call double @llvm.fmuladd.f64(double %104, double %103, double 1.000000e+00)
%106 = fptosi double %105 to i32
%107 = call double @sqrt(i32 %106)
%108 = fdiv double 0x415854A640000000, %107
store double %108, double* %21
%109 = load double, double* %21
%110 = fmul double 9.996000e-01, %109
%111 = load double, double* %19
%112 = load double, double* %17
%113 = fsub double 1.000000e+00, %112
%114 = load double, double* %18
%115 = fadd double %113, %114
%116 = load double, double* %19
%117 = call i32 @pow(double %116, i32 3)
%118 = sitofp i32 %117 to double
%119 = fmul double %115, %118
%120 = fdiv double %119, 6.000000e+00
%121 = fadd double %111, %120
%122 = load double, double* %17
%123 = call double @llvm.fmuladd.f64(double -1.800000e+01, double %122, double 5.000000e+00)
%124 = load double, double* %17
%125 = load double, double* %17
%126 = call double @llvm.fmuladd.f64(double %124, double %125, double %123)
%127 = load double, double* %18
%128 = call double @llvm.fmuladd.f64(double 7.200000e+01, double %127, double %126)
%129 = fsub double %128, 0x3FD9045AE400ED74
%130 = load double, double* %19
%131 = call i32 @pow(double %130, i32 5)
%132 = sitofp i32 %131 to double
%133 = fmul double %129, %132
%134 = fdiv double %133, 1.200000e+02
%135 = fadd double %121, %134
%136 = call double @llvm.fmuladd.f64(double %110, double %135, double 5.000000e+05)
%137 = load double*, double** %7
store double %136, double* %137
%138 = load double, double* %16
%139 = load double, double* %20
%140 = load double, double* %21
%141 = load double, double* %15
%142 = fmul double %140, %141
%143 = load double, double* %19
%144 = load double, double* %19
%145 = fmul double %143, %144
%146 = fdiv double %145, 2.000000e+00
%147 = load double, double* %17
%148 = fsub double 5.000000e+00, %147
%149 = load double, double* %18
%150 = call double @llvm.fmuladd.f64(double 9.000000e+00, double %149, double %148)
%151 = load double, double* %18
%152 = fmul double 4.000000e+00, %151
%153 = load double, double* %18
%154 = call double @llvm.fmuladd.f64(double %152, double %153, double %150)
%155 = load double, double* %19
%156 = call i32 @pow(double %155, i32 4)
%157 = sitofp i32 %156 to double
%158 = fmul double %154, %157
%159 = fdiv double %158, 2.400000e+01
%160 = fadd double %146, %159
%161 = load double, double* %17
%162 = call double @llvm.fmuladd.f64(double -5.800000e+01, double %161, double 6.100000e+01)
%163 = load double, double* %17
%164 = load double, double* %17
%165 = call double @llvm.fmuladd.f64(double %163, double %164, double %162)
%166 = load double, double* %18
%167 = call double @llvm.fmuladd.f64(double 6.000000e+02, double %166, double %165)
%168 = fsub double %167, 0x4001CAD24C16BA89
%169 = load double, double* %19
%170 = call i32 @pow(double %169, i32 6)
%171 = sitofp i32 %170 to double
%172 = fmul double %168, %171
%173 = fdiv double %172, 7.200000e+02
%174 = fadd double %160, %173
%175 = call double @llvm.fmuladd.f64(double %142, double %174, double %139)
%176 = call double @llvm.fmuladd.f64(double 9.996000e-01, double %175, double %138)
%177 = load double*, double** %8
store double %176, double* %177
ret void
}

LLVM IR (-O2):
@M_PI = global double 0.000000e+00
define void @utm(double %0, double %1, double* writeonly %2, double* writeonly %3) {
%5 = icmp ne double* %2, null
%6 = icmp ne double* %3, null
%7 = and i1 %5, %6
%8 = zext i1 %7 to i32
%9 = tail call i32 @assert(i32 %8)
%10 = fcmp ult double %1, 0.000000e+00
%11 = fptosi double %1 to i32
%12 = srem i32 %11, 6
%13 = select i1 %10, i32 -3, i32 3
%14 = add i32 %13, %11
%15 = sub i32 %14, %12
%16 = load double, double* @M_PI
%17 = fmul double %16, %0
%18 = fdiv double %17, 1.800000e+02
%19 = fmul double %16, %1
%20 = fdiv double %19, 1.800000e+02
%21 = sitofp i32 %15 to double
%22 = fmul double %16, %21
%23 = fdiv double %22, 1.800000e+02
%24 = tail call double @sin(double %18)
%25 = tail call double @cos(double %18)
%26 = tail call double @tan(double %18)
%27 = fcmp ogt double %0, 0.000000e+00
%28 = select i1 %27, double 0.000000e+00, double 1.000000e+07
%29 = fmul double %26, %26
%30 = fmul double %25, 0x3F7B9ADFE11B819B
%31 = fmul double %25, %30
%32 = fsub double %20, %23
%33 = fmul double %25, %32
%34 = fmul double %18, 2.000000e+00
%35 = tail call double @sin(double %34)
%36 = fmul double %35, 0xBF649983626E297C
%37 = tail call double @llvm.fmuladd.f64(double %18, double 0x3FEFF245CC9542D2, double %36)
%38 = fmul double %18, 4.000000e+00
%39 = tail call double @sin(double %38)
%40 = tail call double @llvm.fmuladd.f64(double %39, double 0x3EC6234F34905CCE, double %37)
%41 = fmul double %18, 6.000000e+00
%42 = tail call double @sin(double %41)
%43 = tail call double @llvm.fmuladd.f64(double %42, double 0xBE2D5C5CE1150324, double %40)
%44 = fmul double %43, 0x415854A640000000
%45 = fmul double %24, 0xBF7B6B90F183E287
%46 = tail call double @llvm.fmuladd.f64(double %45, double %24, double 1.000000e+00)
%47 = fptosi double %46 to i32
%48 = tail call double @sqrt(i32 %47)
%49 = fdiv double 0x415854A640000000, %48
%50 = fmul double %49, 9.996000e-01
%51 = fsub double 1.000000e+00, %29
%52 = fadd double %31, %51
%53 = tail call i32 @pow(double %33, i32 3)
%54 = sitofp i32 %53 to double
%55 = fmul double %52, %54
%56 = fdiv double %55, 6.000000e+00
%57 = fadd double %33, %56
%58 = tail call double @llvm.fmuladd.f64(double %29, double -1.800000e+01, double 5.000000e+00)
%59 = tail call double @llvm.fmuladd.f64(double %29, double %29, double %58)
%60 = tail call double @llvm.fmuladd.f64(double %31, double 7.200000e+01, double %59)
%61 = fadd double %60, 0xBFD9045AE400ED74
%62 = tail call i32 @pow(double %33, i32 5)
%63 = sitofp i32 %62 to double
%64 = fmul double %61, %63
%65 = fdiv double %64, 1.200000e+02
%66 = fadd double %57, %65
%67 = tail call double @llvm.fmuladd.f64(double %50, double %66, double 5.000000e+05)
store double %67, double* %2
%68 = fmul double %26, %49
%69 = fmul double %33, %33
%70 = fmul double %69, 5.000000e-01
%71 = fsub double 5.000000e+00, %29
%72 = tail call double @llvm.fmuladd.f64(double %31, double 9.000000e+00, double %71)
%73 = fmul double %31, 4.000000e+00
%74 = tail call double @llvm.fmuladd.f64(double %73, double %31, double %72)
%75 = tail call i32 @pow(double %33, i32 4)
%76 = sitofp i32 %75 to double
%77 = fmul double %74, %76
%78 = fdiv double %77, 2.400000e+01
%79 = fadd double %70, %78
%80 = tail call double @llvm.fmuladd.f64(double %29, double -5.800000e+01, double 6.100000e+01)
%81 = tail call double @llvm.fmuladd.f64(double %29, double %29, double %80)
%82 = tail call double @llvm.fmuladd.f64(double %31, double 6.000000e+02, double %81)
%83 = fadd double %82, 0xC001CAD24C16BA89
%84 = tail call i32 @pow(double %33, i32 6)
%85 = sitofp i32 %84 to double
%86 = fmul double %83, %85
%87 = fdiv double %86, 7.200000e+02
%88 = fadd double %79, %87
%89 = tail call double @llvm.fmuladd.f64(double %68, double %88, double %44)
%90 = tail call double @llvm.fmuladd.f64(double %89, double 9.996000e-01, double %28)
store double %90, double* %3
ret void
}