#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;
double atan(double);
scalar_t__ fabs(double);
void tilt_angle(double lon_1, double lon_0, double lat_1, double lat_0,
                double *tilt) {
  double g;
  if ((lat_1 == -1000) || (lat_0 == -1000) || (lon_1 == -1000) ||
      (lon_0 == -1000)) {
    *tilt = 0.0;
  } else {
    g = (double)fabs((lat_1 - lat_0) / (lon_1 - lon_0));
    *tilt = 180.0 / M_PI * atan(g);
    if ((lat_0 > 0) && (lat_1 > 0)) {
      if (lon_1 > lon_0) {
        if (lat_1 > lat_0) {
          *tilt *= -1.0;
        }
      } else {
        if (lat_0 > lat_1) {
          *tilt *= -1.0;
        }
      }
    }
    if ((lat_0 < 0) && (lat_1 < 0)) {
      if (lon_1 > lon_0) {
        if (lat_1 < lat_0) {
          *tilt *= -1.0;
        }
      } else {
        if (lat_0 < lat_1) {
          *tilt *= -1.0;
        }
      }
    }
  }
  return;
}


x86 assembly (clang, -O0):
<tilt_angle>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
mov    %rdi,-0x28(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xeb3(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1162 <tilt_angle+0x42>
jp     1162 <tilt_angle+0x42>
jmp    11c3 <tilt_angle+0xa3>
movsd  -0x20(%rbp),%xmm0
movsd  0xe91(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1184 <tilt_angle+0x64>
jp     1184 <tilt_angle+0x64>
jmp    11c3 <tilt_angle+0xa3>
movsd  -0x8(%rbp),%xmm0
movsd  0xe6f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11a6 <tilt_angle+0x86>
jp     11a6 <tilt_angle+0x86>
jmp    11c3 <tilt_angle+0xa3>
movsd  -0x10(%rbp),%xmm0
movsd  0xe4d(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11d3 <tilt_angle+0xb3>
jp     11d3 <tilt_angle+0xb3>
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    134b <tilt_angle+0x22b>
movsd  -0x18(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm0
call   1030 <fabs@plt>
cvtsi2sd %rax,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xe06(%rip),%xmm0
mov    0x2ddf(%rip),%rax
divsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1040 <atan@plt>
movaps %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    12bb <tilt_angle+0x19b>
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    12bb <tilt_angle+0x19b>
movsd  -0x8(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    128d <tilt_angle+0x16d>
movsd  -0x18(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    1288 <tilt_angle+0x168>
mov    -0x28(%rbp),%rax
movsd  0xd90(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
jmp    12b6 <tilt_angle+0x196>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    12b1 <tilt_angle+0x191>
mov    -0x28(%rbp),%rax
movsd  0xd67(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
jmp    12b6 <tilt_angle+0x196>
jmp    12bb <tilt_angle+0x19b>
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    1346 <tilt_angle+0x226>
xorps  %xmm0,%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    1346 <tilt_angle+0x226>
movsd  -0x8(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    1314 <tilt_angle+0x1f4>
movsd  -0x18(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    130f <tilt_angle+0x1ef>
mov    -0x28(%rbp),%rax
movsd  0xd09(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
jmp    1341 <tilt_angle+0x221>
movsd  -0x20(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    133c <tilt_angle+0x21c>
mov    -0x28(%rbp),%rax
movsd  0xcdc(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
jmp    1341 <tilt_angle+0x221>
jmp    1346 <tilt_angle+0x226>
jmp    134b <tilt_angle+0x22b>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<tilt_angle>:
push   %rbx
sub    $0x30,%rsp
mov    %rdi,%rbx
movapd %xmm0,%xmm4
ucomisd 0xecc(%rip),%xmm1
xorpd  %xmm0,%xmm0
jne    1140 <tilt_angle+0x20>
jnp    1255 <tilt_angle+0x135>
ucomisd 0xeb8(%rip),%xmm4
jne    1150 <tilt_angle+0x30>
jnp    1255 <tilt_angle+0x135>
ucomisd 0xea8(%rip),%xmm2
jne    1160 <tilt_angle+0x40>
jnp    1255 <tilt_angle+0x135>
ucomisd 0xe98(%rip),%xmm3
jne    1170 <tilt_angle+0x50>
jnp    1255 <tilt_angle+0x135>
movapd %xmm2,%xmm0
subsd  %xmm3,%xmm0
movsd  %xmm4,0x8(%rsp)
movsd  %xmm1,0x10(%rsp)
subsd  %xmm1,%xmm4
divsd  %xmm4,%xmm0
movsd  %xmm3,0x18(%rsp)
movsd  %xmm2,0x28(%rsp)
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mov    0x2e3c(%rip),%rax
movsd  0xe54(%rip),%xmm1
divsd  (%rax),%xmm1
movsd  %xmm1,0x20(%rsp)
call   1040 <atan@plt>
movsd  0x28(%rsp),%xmm3
mulsd  0x20(%rsp),%xmm0
movsd  %xmm0,(%rbx)
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm3
jbe    1203 <tilt_angle+0xe3>
movsd  0x18(%rsp),%xmm2
ucomisd %xmm1,%xmm2
jbe    1209 <tilt_angle+0xe9>
movsd  0x10(%rsp),%xmm4
movsd  0x8(%rsp),%xmm5
ucomisd %xmm4,%xmm5
jbe    1217 <tilt_angle+0xf7>
ucomisd %xmm2,%xmm3
ja     121d <tilt_angle+0xfd>
jmp    1229 <tilt_angle+0x109>
movsd  0x18(%rsp),%xmm2
movsd  0x10(%rsp),%xmm4
movsd  0x8(%rsp),%xmm5
jmp    1229 <tilt_angle+0x109>
ucomisd %xmm3,%xmm2
jbe    1229 <tilt_angle+0x109>
xorpd  0xdeb(%rip),%xmm0
movlpd %xmm0,(%rbx)
ucomisd %xmm3,%xmm1
jbe    1259 <tilt_angle+0x139>
xorpd  %xmm1,%xmm1
ucomisd %xmm2,%xmm1
jbe    1259 <tilt_angle+0x139>
ucomisd %xmm4,%xmm5
jbe    1247 <tilt_angle+0x127>
ucomisd %xmm3,%xmm2
ja     124d <tilt_angle+0x12d>
jmp    1259 <tilt_angle+0x139>
ucomisd %xmm2,%xmm3
jbe    1259 <tilt_angle+0x139>
xorpd  0xdbb(%rip),%xmm0
movsd  %xmm0,(%rbx)
add    $0x30,%rsp
pop    %rbx
ret

LLVM IR (-O0):
@M_PI = global double 0.000000e+00
define void @tilt_angle(double %0, double %1, double %2, double %3, double* %4) {
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double*
%11 = alloca double
store double %0, double* %6
store double %1, double* %7
store double %2, double* %8
store double %3, double* %9
store double* %4, double** %10
%12 = load double, double* %8
%13 = fcmp oeq double %12, -1.000000e+03
br i1 %13, label %23, label %14
14: ; preds = %5
%15 = load double, double* %9
%16 = fcmp oeq double %15, -1.000000e+03
br i1 %16, label %23, label %17
17: ; preds = %14
%18 = load double, double* %6
%19 = fcmp oeq double %18, -1.000000e+03
br i1 %19, label %23, label %20
20: ; preds = %17
%21 = load double, double* %7
%22 = fcmp oeq double %21, -1.000000e+03
br i1 %22, label %23, label %25
23: ; preds = %20, %17, %14, %5
%24 = load double*, double** %10
store double 0.000000e+00, double* %24
br label %99
25: ; preds = %20
%26 = load double, double* %8
%27 = load double, double* %9
%28 = fsub double %26, %27
%29 = load double, double* %6
%30 = load double, double* %7
%31 = fsub double %29, %30
%32 = fdiv double %28, %31
%33 = call i64 @fabs(double %32)
%34 = sitofp i64 %33 to double
store double %34, double* %11
%35 = load double, double* @M_PI
%36 = fdiv double 1.800000e+02, %35
%37 = load double, double* %11
%38 = call double @atan(double %37)
%39 = fmul double %36, %38
%40 = load double*, double** %10
store double %39, double* %40
%41 = load double, double* %9
%42 = fcmp ogt double %41, 0.000000e+00
br i1 %42, label %43, label %69
43: ; preds = %25
%44 = load double, double* %8
%45 = fcmp ogt double %44, 0.000000e+00
br i1 %45, label %46, label %69
46: ; preds = %43
%47 = load double, double* %6
%48 = load double, double* %7
%49 = fcmp ogt double %47, %48
br i1 %49, label %50, label %59
50: ; preds = %46
%51 = load double, double* %8
%52 = load double, double* %9
%53 = fcmp ogt double %51, %52
br i1 %53, label %54, label %58
54: ; preds = %50
%55 = load double*, double** %10
%56 = load double, double* %55
%57 = fmul double %56, -1.000000e+00
store double %57, double* %55
br label %58
58: ; preds = %54, %50
br label %68
59: ; preds = %46
%60 = load double, double* %9
%61 = load double, double* %8
%62 = fcmp ogt double %60, %61
br i1 %62, label %63, label %67
63: ; preds = %59
%64 = load double*, double** %10
%65 = load double, double* %64
%66 = fmul double %65, -1.000000e+00
store double %66, double* %64
br label %67
67: ; preds = %63, %59
br label %68
68: ; preds = %67, %58
br label %69
69: ; preds = %68, %43, %25
%70 = load double, double* %9
%71 = fcmp olt double %70, 0.000000e+00
br i1 %71, label %72, label %98
72: ; preds = %69
%73 = load double, double* %8
%74 = fcmp olt double %73, 0.000000e+00
br i1 %74, label %75, label %98
75: ; preds = %72
%76 = load double, double* %6
%77 = load double, double* %7
%78 = fcmp ogt double %76, %77
br i1 %78, label %79, label %88
79: ; preds = %75
%80 = load double, double* %8
%81 = load double, double* %9
%82 = fcmp olt double %80, %81
br i1 %82, label %83, label %87
83: ; preds = %79
%84 = load double*, double** %10
%85 = load double, double* %84
%86 = fmul double %85, -1.000000e+00
store double %86, double* %84
br label %87
87: ; preds = %83, %79
br label %97
88: ; preds = %75
%89 = load double, double* %9
%90 = load double, double* %8
%91 = fcmp olt double %89, %90
br i1 %91, label %92, label %96
92: ; preds = %88
%93 = load double*, double** %10
%94 = load double, double* %93
%95 = fmul double %94, -1.000000e+00
store double %95, double* %93
br label %96
96: ; preds = %92, %88
br label %97
97: ; preds = %96, %87
br label %98
98: ; preds = %97, %72, %69
br label %99
99: ; preds = %98, %23
ret void
}

LLVM IR (-O2):
@M_PI = global double 0.000000e+00
define void @tilt_angle(double %0, double %1, double %2, double %3, double* nocapture %4) {
%6 = fcmp oeq double %2, -1.000000e+03
%7 = fcmp oeq double %3, -1.000000e+03
%8 = or i1 %6, %7
%9 = fcmp oeq double %0, -1.000000e+03
%10 = or i1 %9, %8
%11 = fcmp oeq double %1, -1.000000e+03
%12 = or i1 %11, %10
br i1 %12, label %49, label %13
13: ; preds = %5
%14 = fsub double %2, %3
%15 = fsub double %0, %1
%16 = fdiv double %14, %15
%17 = tail call i64 @fabs(double %16)
%18 = sitofp i64 %17 to double
%19 = load double, double* @M_PI
%20 = fdiv double 1.800000e+02, %19
%21 = tail call double @atan(double %18)
%22 = fmul double %20, %21
store double %22, double* %4
%23 = fcmp ogt double %3, 0.000000e+00
%24 = fcmp ogt double %2, 0.000000e+00
%25 = and i1 %24, %23
br i1 %25, label %26, label %34
26: ; preds = %13
%27 = fcmp ogt double %0, %1
br i1 %27, label %28, label %30
28: ; preds = %26
%29 = fcmp ogt double %2, %3
br i1 %29, label %32, label %34
30: ; preds = %26
%31 = fcmp ogt double %3, %2
br i1 %31, label %32, label %34
32: ; preds = %30, %28
%33 = fneg double %22
store double %33, double* %4
br label %34
34: ; preds = %32, %28, %30, %13
%35 = phi double [ %22, %28 ], [ %22, %30 ], [ %22, %13 ], [ %33, %32 ]
%36 = fcmp olt double %3, 0.000000e+00
%37 = fcmp olt double %2, 0.000000e+00
%38 = and i1 %37, %36
br i1 %38, label %39, label %51
39: ; preds = %34
%40 = fcmp ogt double %0, %1
br i1 %40, label %41, label %45
41: ; preds = %39
%42 = fcmp olt double %2, %3
br i1 %42, label %43, label %51
43: ; preds = %41
%44 = fneg double %35
br label %49
45: ; preds = %39
%46 = fcmp olt double %3, %2
br i1 %46, label %47, label %51
47: ; preds = %45
%48 = fneg double %35
br label %49
49: ; preds = %5, %43, %47
%50 = phi double [ %48, %47 ], [ %44, %43 ], [ 0.000000e+00, %5 ]
store double %50, double* %4
br label %51
51: ; preds = %49, %34, %45, %41
ret void
}