#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 fabs(double);
scalar_t__ fmod(double, double);
int polypt(double x, double y, double *poly, int count,
           double UNUSED_xstart __attribute__((__unused__)), double ystart,
           int flag) {
  int crossings = 0;
  int sign = ((poly[1] - y) >= 0) ? 1 : -1;
  int i;
  if (flag && (x == poly[0]) && (y == poly[1]))
    return 1;
  for (i = 0; i < count; i++) {
    int j = (i != (count - 1)) ? i + 1 : 0;
    double x1 = poly[i * 2] - x;
    double y1 = poly[i * 2 + 1] - y;
    double x2 = poly[j * 2] - x;
    double y2 = poly[j * 2 + 1] - y;
    int nextSign = (y2 >= 0) ? 1 : -1;
    if ((y1 == 0) && (y2 == 0)) {
      if (((x2 >= 0) && (x1 <= 0)) || ((x1 >= 0) && (x2 <= 0))) {
        if (y == ystart)
          return 1;
        else
          return fmod((double)crossings + 1, 2.0) ? 1 : 0;
      }
    } else if ((x1 == 0) && (x2 == 0)) {
      if (((y2 >= 0) && (y1 <= 0)) || ((y1 >= 0) && (y2 <= 0))) {
        return fmod((double)crossings + 1, 2.0) ? 1 : 0;
      }
    } else if ((fabs((double)(y1 * (x2 - x1)) - (double)(x1 * (y2 - y1))) <=
                (double)1.0E-15)) {
      if ((((x2 >= 0) && (x1 <= 0)) || ((x1 >= 0) && (x2 <= 0))) &&
          (((y2 >= 0) && (y1 <= 0)) || ((y1 >= 0) && (y2 <= 0)))) {
        return fmod((double)crossings + 1, 2.0) ? 1 : 0;
      }
    }
    if (sign != nextSign) {
      if (x1 > 0 && x2 > 0)
        crossings++;
      else if (x1 > 0 || x2 > 0) {
        if (x1 - (y1 * (x2 - x1) / (y2 - y1)) > 0)
          crossings++;
      }
      sign = nextSign;
    }
  }
  return crossings % 2 ? 1 : 0;
}


x86 assembly (clang, -O0):
<polypt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
mov    %rdi,-0x20(%rbp)
mov    %esi,-0x24(%rbp)
movsd  %xmm2,-0x30(%rbp)
movsd  %xmm3,-0x38(%rbp)
mov    %edx,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
mov    $0xffffffff,%eax
mov    $0x1,%ecx
ucomisd %xmm1,%xmm0
cmovae %ecx,%eax
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x3c(%rbp)
je     11ae <polypt+0x9e>
movsd  -0x10(%rbp),%xmm0
mov    -0x20(%rbp),%rax
ucomisd (%rax),%xmm0
jne    11ae <polypt+0x9e>
jp     11ae <polypt+0x9e>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rax
ucomisd 0x8(%rax),%xmm0
jne    11ae <polypt+0x9e>
jp     11ae <polypt+0x9e>
movl   $0x1,-0x4(%rbp)
jmp    1600 <polypt+0x4f0>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    15e5 <polypt+0x4d5>
mov    -0x48(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
je     11e0 <polypt+0xd0>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x78(%rbp)
jmp    11ea <polypt+0xda>
xor    %eax,%eax
mov    %eax,-0x78(%rbp)
jmp    11ea <polypt+0xda>
mov    -0x78(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
xorps  %xmm1,%xmm1
mov    $0xffffffff,%eax
mov    $0x1,%ecx
ucomisd %xmm1,%xmm0
cmovae %ecx,%eax
mov    %eax,-0x74(%rbp)
movsd  -0x60(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1350 <polypt+0x240>
jp     1350 <polypt+0x240>
movsd  -0x70(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1350 <polypt+0x240>
jp     1350 <polypt+0x240>
movsd  -0x68(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     12d2 <polypt+0x1c2>
xorps  %xmm0,%xmm0
ucomisd -0x58(%rbp),%xmm0
jae    12f2 <polypt+0x1e2>
movsd  -0x58(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     134b <polypt+0x23b>
xorps  %xmm0,%xmm0
ucomisd -0x68(%rbp),%xmm0
jb     134b <polypt+0x23b>
movsd  -0x18(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jne    1314 <polypt+0x204>
jp     1314 <polypt+0x204>
movl   $0x1,-0x4(%rbp)
jmp    1600 <polypt+0x4f0>
cvtsi2sdl -0x40(%rbp),%xmm0
movsd  0xcef(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  0xcdb(%rip),%xmm1
call   1030 <fmod@plt>
mov    %rax,%rdx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%rdx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1600 <polypt+0x4f0>
jmp    1520 <polypt+0x410>
movsd  -0x58(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13fc <polypt+0x2ec>
jp     13fc <polypt+0x2ec>
movsd  -0x68(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13fc <polypt+0x2ec>
jp     13fc <polypt+0x2ec>
movsd  -0x70(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     13a0 <polypt+0x290>
xorps  %xmm0,%xmm0
ucomisd -0x60(%rbp),%xmm0
jae    13c0 <polypt+0x2b0>
movsd  -0x60(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     13f7 <polypt+0x2e7>
xorps  %xmm0,%xmm0
ucomisd -0x70(%rbp),%xmm0
jb     13f7 <polypt+0x2e7>
cvtsi2sdl -0x40(%rbp),%xmm0
movsd  0xc43(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  0xc2f(%rip),%xmm1
call   1030 <fmod@plt>
mov    %rax,%rdx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%rdx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1600 <polypt+0x4f0>
jmp    151b <polypt+0x40b>
movsd  -0x60(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm2
subsd  -0x58(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm3
subsd  -0x60(%rbp),%xmm3
mulsd  %xmm3,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movaps 0xbdc(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  0xbb0(%rip),%xmm0
ucomisd %xmm1,%xmm0
jb     1516 <polypt+0x406>
movsd  -0x68(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     147a <polypt+0x36a>
xorps  %xmm0,%xmm0
ucomisd -0x58(%rbp),%xmm0
jae    149a <polypt+0x38a>
movsd  -0x58(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1511 <polypt+0x401>
xorps  %xmm0,%xmm0
ucomisd -0x68(%rbp),%xmm0
jb     1511 <polypt+0x401>
movsd  -0x70(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     14ba <polypt+0x3aa>
xorps  %xmm0,%xmm0
ucomisd -0x60(%rbp),%xmm0
jae    14da <polypt+0x3ca>
movsd  -0x60(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1511 <polypt+0x401>
xorps  %xmm0,%xmm0
ucomisd -0x70(%rbp),%xmm0
jb     1511 <polypt+0x401>
cvtsi2sdl -0x40(%rbp),%xmm0
movsd  0xb29(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  0xb15(%rip),%xmm1
call   1030 <fmod@plt>
mov    %rax,%rdx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%rdx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1600 <polypt+0x4f0>
jmp    1516 <polypt+0x406>
jmp    151b <polypt+0x40b>
jmp    1520 <polypt+0x410>
mov    -0x44(%rbp),%eax
cmp    -0x74(%rbp),%eax
je     15d2 <polypt+0x4c2>
movsd  -0x58(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    155e <polypt+0x44e>
movsd  -0x68(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    155e <polypt+0x44e>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    15cc <polypt+0x4bc>
movsd  -0x58(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
ja     1582 <polypt+0x472>
movsd  -0x68(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    15c7 <polypt+0x4b7>
movsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm2
subsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm1
movsd  -0x70(%rbp),%xmm2
subsd  -0x60(%rbp),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    15c2 <polypt+0x4b2>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    15c7 <polypt+0x4b7>
jmp    15cc <polypt+0x4bc>
mov    -0x74(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    15d7 <polypt+0x4c7>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    11b5 <polypt+0xa5>
mov    -0x40(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<polypt>:
push   %rax
movsd  0x8(%rdi),%xmm2
movapd %xmm2,%xmm4
subsd  %xmm1,%xmm4
xorpd  %xmm5,%xmm5
xor    %ecx,%ecx
ucomisd %xmm5,%xmm4
setae  %r8b
test   %edx,%edx
je     114b <polypt+0x3b>
movsd  (%rdi),%xmm4
ucomisd %xmm0,%xmm4
jne    114b <polypt+0x3b>
jp     114b <polypt+0x3b>
mov    $0x1,%eax
ucomisd %xmm1,%xmm2
jne    114b <polypt+0x3b>
jp     114b <polypt+0x3b>
pop    %rcx
ret
test   %esi,%esi
jle    131f <polypt+0x20f>
mov    %r8b,%cl
add    %ecx,%ecx
add    $0xffffffff,%ecx
lea    -0x1(%rsi),%r10d
mov    %esi,%r9d
unpcklpd %xmm1,%xmm0
add    %r10,%r10
add    %r9,%r9
xor    %esi,%esi
xorpd  %xmm10,%xmm10
movapd 0xe84(%rip),%xmm8
movsd  0xe8b(%rip),%xmm9
xor    %r8d,%r8d
jmp    119d <polypt+0x8d>
nopw   0x0(%rax,%rax,1)
mov    %ecx,%eax
mov    %eax,%ecx
cmp    %rsi,%r9
je     1322 <polypt+0x212>
cmp    %rsi,%r10
movupd (%rdi,%rsi,8),%xmm6
lea    0x2(%rsi),%rsi
subpd  %xmm0,%xmm6
mov    $0x0,%eax
cmovne %rsi,%rax
movupd (%rdi,%rax,8),%xmm2
subpd  %xmm0,%xmm2
movapd %xmm2,%xmm7
unpckhpd %xmm2,%xmm7
xor    %edx,%edx
ucomisd %xmm10,%xmm7
setae  %al
movapd %xmm6,%xmm11
unpckhpd %xmm6,%xmm11
ucomisd %xmm10,%xmm11
jne    1220 <polypt+0x110>
jp     1220 <polypt+0x110>
ucomisd %xmm10,%xmm7
jne    1220 <polypt+0x110>
jp     1220 <polypt+0x110>
ucomisd %xmm10,%xmm2
jb     11ff <polypt+0xef>
ucomisd %xmm6,%xmm10
jae    132b <polypt+0x21b>
ucomisd %xmm10,%xmm6
jb     1290 <polypt+0x180>
ucomisd %xmm2,%xmm10
jb     1290 <polypt+0x180>
jmp    132b <polypt+0x21b>
nopw   0x0(%rax,%rax,1)
ucomisd %xmm10,%xmm6
jne    1260 <polypt+0x150>
jp     1260 <polypt+0x150>
ucomisd %xmm10,%xmm2
jne    1260 <polypt+0x150>
jp     1260 <polypt+0x150>
ucomisd %xmm10,%xmm7
jb     1244 <polypt+0x134>
ucomisd %xmm11,%xmm10
jae    133c <polypt+0x22c>
ucomisd %xmm10,%xmm11
jb     1290 <polypt+0x180>
ucomisd %xmm7,%xmm10
jb     1290 <polypt+0x180>
jmp    133c <polypt+0x22c>
nopw   0x0(%rax,%rax,1)
movapd %xmm2,%xmm5
subsd  %xmm6,%xmm5
movapd %xmm7,%xmm4
subsd  %xmm11,%xmm4
mulsd  %xmm6,%xmm4
mulsd  %xmm11,%xmm5
subsd  %xmm4,%xmm5
andpd  %xmm8,%xmm5
ucomisd %xmm5,%xmm9
jae    12f6 <polypt+0x1e6>
nopw   0x0(%rax,%rax,1)
mov    %al,%dl
lea    (%rdx,%rdx,1),%eax
add    $0xffffffff,%eax
cmp    %eax,%ecx
je     1190 <polypt+0x80>
ucomisd %xmm10,%xmm6
jbe    12c0 <polypt+0x1b0>
ucomisd %xmm10,%xmm2
jbe    12c0 <polypt+0x1b0>
add    $0x1,%r8d
jmp    1192 <polypt+0x82>
nopw   0x0(%rax,%rax,1)
ucomisd %xmm10,%xmm6
ja     12d2 <polypt+0x1c2>
ucomisd %xmm10,%xmm2
jbe    1192 <polypt+0x82>
subpd  %xmm6,%xmm2
mulsd  %xmm2,%xmm11
unpckhpd %xmm2,%xmm2
divsd  %xmm2,%xmm11
subsd  %xmm11,%xmm6
ucomisd %xmm10,%xmm6
jbe    1192 <polypt+0x82>
jmp    12ae <polypt+0x19e>
ucomisd %xmm10,%xmm2
jb     1308 <polypt+0x1f8>
ucomisd %xmm6,%xmm10
jae    1232 <polypt+0x122>
ucomisd %xmm10,%xmm6
jb     1290 <polypt+0x180>
ucomisd %xmm2,%xmm10
jae    1232 <polypt+0x122>
jmp    1290 <polypt+0x180>
xor    %r8d,%r8d
and    $0x1,%r8d
mov    %r8d,%eax
pop    %rcx
ret
mov    $0x1,%eax
ucomisd %xmm3,%xmm1
jne    133c <polypt+0x22c>
jnp    1149 <polypt+0x39>
xorps  %xmm0,%xmm0
cvtsi2sd %r8d,%xmm0
addsd  0xccc(%rip),%xmm0
movsd  0xccc(%rip),%xmm1
call   1030 <fmod@plt>
mov    %rax,%rcx
xor    %eax,%eax
test   %rcx,%rcx
setne  %al
pop    %rcx
ret

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

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