#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 */
scalar_t__ fabs(double);
int inout(float x1, float y1, float x2, float y2, float x, float y) {
  double dx = x2 - x1;
  double dy = y2 - y1;
  if (dx == 0.0) {
    if (dy > 0.0) {
      if (x < x1)
        return 0;
      else
        return 1;
    } else {
      if (x < x1)
        return 1;
      else
        return 0;
    }
  } else if (dy == 0.0) {
    if (dx > 0.0) {
      if (y < y1)
        return 1;
      else
        return 0;
    } else {
      if (y < y1)
        return 0;
      else
        return 1;
    }
  } else {
    if (fabs(dx) > fabs(dy)) {
      double y_inter = y1 + dy * (x - x1) / dx;
      if (dy > 0.0) {
        if (dx > 0.0) {
          if (y < y_inter)
            return 1;
          else
            return 0;
        } else {
          if (y < y_inter)
            return 0;
          else
            return 1;
        }
      } else {
        if (dx > 0.0) {
          if (y < y_inter)
            return 1;
          else
            return 0;
        } else {
          if (y < y_inter)
            return 0;
          else
            return 1;
        }
      }
    } else {
      double x_inter = x1 + dx * (y - y1) / dy;
      if (dy > 0.0) {
        if (dx > 0.0) {
          if (x < x_inter)
            return 0;
          else
            return 1;
        } else {
          if (x < x_inter)
            return 0;
          else
            return 1;
        }
      } else {
        if (dx > 0.0) {
          if (x < x_inter)
            return 1;
          else
            return 0;
        } else {
          if (x < x_inter)
            return 1;
          else
            return 0;
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<inout>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm2,-0x10(%rbp)
movss  %xmm3,-0x14(%rbp)
movss  %xmm4,-0x18(%rbp)
movss  %xmm5,-0x1c(%rbp)
movss  -0x10(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
movss  -0x14(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11dc <inout+0xcc>
jp     11dc <inout+0xcc>
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    11b1 <inout+0xa1>
movss  -0x18(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    11a5 <inout+0x95>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movss  -0x18(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    11d0 <inout+0xc0>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    125c <inout+0x14c>
jp     125c <inout+0x14c>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1231 <inout+0x121>
movss  -0x1c(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1225 <inout+0x115>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movss  -0x1c(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1250 <inout+0x140>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movsd  -0x28(%rbp),%xmm0
call   1030 <fabs@plt>
mov    %rax,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1030 <fabs@plt>
mov    %rax,%rcx
mov    -0x48(%rbp),%rax
cmp    %rcx,%rax
jle    13a8 <inout+0x298>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  -0x30(%rbp),%xmm1
movss  -0x18(%rbp),%xmm2
subss  -0x8(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1336 <inout+0x226>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1306 <inout+0x1f6>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    12fa <inout+0x1ea>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    132a <inout+0x21a>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1378 <inout+0x268>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    136c <inout+0x25c>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    139c <inout+0x28c>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  -0x28(%rbp),%xmm1
movss  -0x1c(%rbp),%xmm2
subss  -0xc(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
divsd  -0x30(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    145a <inout+0x34a>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    142a <inout+0x31a>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    141e <inout+0x30e>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    144e <inout+0x33e>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    149c <inout+0x38c>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1490 <inout+0x380>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x0,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    14c0 <inout+0x3b0>
movl   $0x1,-0x4(%rbp)
jmp    14c7 <inout+0x3b7>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<inout>:
push   %rbx
sub    $0x30,%rsp
subss  %xmm0,%xmm2
subss  %xmm1,%xmm3
xorps  %xmm6,%xmm6
ucomiss %xmm6,%xmm2
jne    1134 <inout+0x24>
jp     1134 <inout+0x24>
ucomiss %xmm6,%xmm3
jbe    114c <inout+0x3c>
ucomiss %xmm4,%xmm0
setbe  %al
jmp    1152 <inout+0x42>
ucomiss %xmm6,%xmm3
jne    115b <inout+0x4b>
jp     115b <inout+0x4b>
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm2
jbe    1209 <inout+0xf9>
ucomiss %xmm5,%xmm1
jmp    114f <inout+0x3f>
ucomiss %xmm4,%xmm0
seta   %al
movzbl %al,%eax
add    $0x30,%rsp
pop    %rbx
ret
movss  %xmm0,0x4(%rsp)
movss  %xmm1,0x8(%rsp)
movss  %xmm4,0xc(%rsp)
movss  %xmm5,0x14(%rsp)
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
movss  %xmm3,0x10(%rsp)
xorps  %xmm1,%xmm1
cvtss2sd %xmm3,%xmm1
movsd  %xmm1,0x18(%rsp)
movsd  %xmm0,0x28(%rsp)
movss  %xmm2,0x24(%rsp)
call   1030 <fabs@plt>
mov    %rax,%rbx
movsd  0x18(%rsp),%xmm0
call   1030 <fabs@plt>
cmp    %rax,%rbx
jle    1214 <inout+0x104>
movss  0x24(%rsp),%xmm2
movss  0x8(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  0xc(%rsp),%xmm1
subss  0x4(%rsp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0x18(%rsp),%xmm3
mulsd  %xmm1,%xmm3
divsd  0x28(%rsp),%xmm3
addsd  %xmm0,%xmm3
xorps  %xmm1,%xmm1
movss  0x10(%rsp),%xmm0
ucomiss %xmm1,%xmm0
movss  0x14(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
ucomiss %xmm1,%xmm2
jbe    1266 <inout+0x156>
ucomisd %xmm0,%xmm3
jmp    114f <inout+0x3f>
ucomiss %xmm5,%xmm1
setbe  %al
jmp    1152 <inout+0x42>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  0x14(%rsp),%xmm1
subss  0x8(%rsp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0x28(%rsp),%xmm2
mulsd  %xmm1,%xmm2
divsd  0x18(%rsp),%xmm2
addsd  %xmm0,%xmm2
xorps  %xmm0,%xmm0
movss  0x10(%rsp),%xmm1
ucomiss %xmm0,%xmm1
movss  0xc(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
jbe    1272 <inout+0x162>
ucomisd %xmm0,%xmm2
setbe  %al
jmp    1152 <inout+0x42>
ucomisd %xmm0,%xmm3
setbe  %al
jmp    1152 <inout+0x42>
ucomisd %xmm0,%xmm2
jmp    114f <inout+0x3f>

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

LLVM IR (-O2):
define i32 @inout(float %0, float %1, float %2, float %3, float %4, float %5) {
%7 = fsub float %2, %0
%8 = fpext float %7 to double
%9 = fsub float %3, %1
%10 = fpext float %9 to double
%11 = fcmp oeq float %7, 0.000000e+00
br i1 %11, label %12, label %18
12: ; preds = %6
%13 = fcmp ogt float %9, 0.000000e+00
br i1 %13, label %14, label %16
14: ; preds = %12
%15 = fcmp uge float %4, %0
br label %63
16: ; preds = %12
%17 = fcmp olt float %4, %0
br label %63
18: ; preds = %6
%19 = fcmp oeq float %9, 0.000000e+00
br i1 %19, label %20, label %26
20: ; preds = %18
%21 = fcmp ogt float %7, 0.000000e+00
br i1 %21, label %22, label %24
22: ; preds = %20
%23 = fcmp olt float %5, %1
br label %63
24: ; preds = %20
%25 = fcmp uge float %5, %1
br label %63
26: ; preds = %18
%27 = tail call i64 @fabs(double %8)
%28 = tail call i64 @fabs(double %10)
%29 = icmp sgt i64 %27, %28
br i1 %29, label %30, label %50
30: ; preds = %26
%31 = fpext float %1 to double
%32 = fsub float %4, %0
%33 = fpext float %32 to double
%34 = fmul double %10, %33
%35 = fdiv double %34, %8
%36 = fadd double %35, %31
%37 = fcmp ogt float %9, 0.000000e+00
%38 = fcmp ogt float %7, 0.000000e+00
%39 = fpext float %5 to double
br i1 %37, label %40, label %45
40: ; preds = %30
br i1 %38, label %41, label %43
41: ; preds = %40
%42 = fcmp ogt double %36, %39
br label %63
43: ; preds = %40
%44 = fcmp ule double %36, %39
br label %63
45: ; preds = %30
br i1 %38, label %46, label %48
46: ; preds = %45
%47 = fcmp ogt double %36, %39
br label %63
48: ; preds = %45
%49 = fcmp ule double %36, %39
br label %63
50: ; preds = %26
%51 = fpext float %0 to double
%52 = fsub float %5, %1
%53 = fpext float %52 to double
%54 = fmul double %8, %53
%55 = fdiv double %54, %10
%56 = fadd double %55, %51
%57 = fcmp ogt float %9, 0.000000e+00
%58 = fpext float %4 to double
br i1 %57, label %59, label %61
59: ; preds = %50
%60 = fcmp ule double %56, %58
br label %63
61: ; preds = %50
%62 = fcmp ogt double %56, %58
br label %63
63: ; preds = %61, %59, %41, %43, %46, %48, %24, %22, %16, %14
%64 = phi i1 [ %15, %14 ], [ %17, %16 ], [ %23, %22 ], [ %25, %24 ], [ %42, %41 ], [ %44, %43 ], [ %47, %46 ], [ %49, %48 ], [ %60, %59 ], [ %62, %61 ]
%65 = zext i1 %64 to i32
ret i32 %65
}