#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 */
float INFINITY;
float M_PI;
float M_PI_2;
float atanf(float);
float atan2f(float y, float x) {
  if (y == INFINITY && x == INFINITY) {
    return 0.785398163397448;
  }
  if (y == INFINITY && x == -INFINITY) {
    return 2.356194490192345;
  }
  if (y == -INFINITY && x == INFINITY) {
    return -0.785398163397448;
  }
  if (y == -INFINITY && x == -INFINITY) {
    return -2.356194490192345;
  }
  if (x > 0) {
    return atanf(y / x);
  } else if (y >= 0 && x < 0) {
    return atanf(y / x) + M_PI;
  } else if (y < 0) {
    if (x == 0) {
      return -M_PI_2;
    } else {
      return atanf(y / x) - M_PI;
    }
  } else if (y > 0 && x == 0) {
    return M_PI_2;
  } else {
    return 0;
  }
}


x86 assembly (clang, -O0):
<atan2f>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
mov    0x2eba(%rip),%rax
ucomiss (%rax),%xmm0
jne    116a <atan2f+0x5a>
jp     116a <atan2f+0x5a>
movss  -0xc(%rbp),%xmm0
mov    0x2e9f(%rip),%rax
ucomiss (%rax),%xmm0
jne    116a <atan2f+0x5a>
jp     116a <atan2f+0x5a>
movss  0xeac(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
movss  -0x8(%rbp),%xmm0
mov    0x2e72(%rip),%rax
ucomiss (%rax),%xmm0
jne    11c3 <atan2f+0xb3>
jp     11c3 <atan2f+0xb3>
movss  -0xc(%rbp),%xmm0
mov    0x2e57(%rip),%rax
movss  (%rax),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
ucomiss %xmm1,%xmm0
jne    11c3 <atan2f+0xb3>
jp     11c3 <atan2f+0xb3>
movss  0xe4f(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
movss  -0x8(%rbp),%xmm0
mov    0x2e19(%rip),%rax
movss  (%rax),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
ucomiss %xmm1,%xmm0
jne    121c <atan2f+0x10c>
jp     121c <atan2f+0x10c>
movss  -0xc(%rbp),%xmm0
mov    0x2ded(%rip),%rax
ucomiss (%rax),%xmm0
jne    121c <atan2f+0x10c>
jp     121c <atan2f+0x10c>
movss  0xdf2(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
movss  -0x8(%rbp),%xmm0
mov    0x2dc0(%rip),%rax
movss  (%rax),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
ucomiss %xmm1,%xmm0
jne    1286 <atan2f+0x176>
jp     1286 <atan2f+0x176>
movss  -0xc(%rbp),%xmm0
mov    0x2d94(%rip),%rax
movss  (%rax),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
ucomiss %xmm1,%xmm0
jne    1286 <atan2f+0x176>
jp     1286 <atan2f+0x176>
movss  0xd84(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    12b0 <atan2f+0x1a0>
movss  -0x8(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <atanf@plt>
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     12f2 <atan2f+0x1e2>
xorps  %xmm0,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    12f2 <atan2f+0x1e2>
movss  -0x8(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <atanf@plt>
mov    0x2cfc(%rip),%rax
addss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    135c <atan2f+0x24c>
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1338 <atan2f+0x228>
jp     1338 <atan2f+0x228>
mov    0x2cbb(%rip),%rax
movss  (%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
movss  -0x8(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <atanf@plt>
mov    0x2c92(%rip),%rax
subss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    1399 <atan2f+0x289>
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1399 <atan2f+0x289>
jp     1399 <atan2f+0x289>
mov    0x2c4d(%rip),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13a1 <atan2f+0x291>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<atan2f>:
push   %rax
mov    0x2ed0(%rip),%rax
movss  (%rax),%xmm2
ucomiss %xmm0,%xmm2
jne    1134 <atan2f+0x24>
jp     1134 <atan2f+0x24>
ucomiss %xmm1,%xmm2
jne    1134 <atan2f+0x24>
jp     1134 <atan2f+0x24>
movss  0xece(%rip),%xmm0
pop    %rax
ret
ucomiss %xmm0,%xmm2
movaps 0xed2(%rip),%xmm3
xorps  %xmm2,%xmm3
jne    1156 <atan2f+0x46>
jp     1156 <atan2f+0x46>
ucomiss %xmm1,%xmm3
jne    1156 <atan2f+0x46>
jp     1156 <atan2f+0x46>
movss  0xeb0(%rip),%xmm0
pop    %rax
ret
ucomiss %xmm0,%xmm3
jne    116e <atan2f+0x5e>
jp     116e <atan2f+0x5e>
ucomiss %xmm1,%xmm2
jne    116e <atan2f+0x5e>
jp     116e <atan2f+0x5e>
movss  0xe9c(%rip),%xmm0
pop    %rax
ret
ucomiss %xmm0,%xmm3
jne    1186 <atan2f+0x76>
jp     1186 <atan2f+0x76>
ucomiss %xmm1,%xmm3
jne    1186 <atan2f+0x76>
jp     1186 <atan2f+0x76>
movss  0xe88(%rip),%xmm0
pop    %rax
ret
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm1
jbe    1198 <atan2f+0x88>
divss  %xmm1,%xmm0
pop    %rax
jmp    1030 <atanf@plt>
ucomiss %xmm2,%xmm0
jb     11bb <atan2f+0xab>
xorps  %xmm2,%xmm2
ucomiss %xmm1,%xmm2
jbe    11bb <atan2f+0xab>
divss  %xmm1,%xmm0
call   1030 <atanf@plt>
mov    0x2e2b(%rip),%rax
addss  (%rax),%xmm0
pop    %rax
ret
xorps  %xmm2,%xmm2
ucomiss %xmm0,%xmm2
jbe    11de <atan2f+0xce>
ucomiss %xmm2,%xmm1
jne    11fb <atan2f+0xeb>
jp     11fb <atan2f+0xeb>
mov    0x2e07(%rip),%rax
movss  (%rax),%xmm0
xorps  0xe34(%rip),%xmm0
pop    %rax
ret
mov    0x2df3(%rip),%rax
cmpeqss %xmm2,%xmm1
cmpltss %xmm0,%xmm2
movss  (%rax),%xmm0
andps  %xmm1,%xmm0
andps  %xmm2,%xmm0
pop    %rax
ret
divss  %xmm1,%xmm0
call   1030 <atanf@plt>
mov    0x2dd5(%rip),%rax
subss  (%rax),%xmm0
pop    %rax
ret

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

LLVM IR (-O2):
@INFINITY = global float 0.000000e+00
@M_PI = global float 0.000000e+00
@M_PI_2 = global float 0.000000e+00
define float @atan2f(float %0, float %1) {
%3 = load float, float* @INFINITY
%4 = fcmp oeq float %3, %0
%5 = fcmp oeq float %3, %1
%6 = and i1 %4, %5
br i1 %6, label %48, label %7
7: ; preds = %2
%8 = fneg float %3
%9 = fcmp oeq float %8, %1
%10 = and i1 %4, %9
br i1 %10, label %48, label %11
11: ; preds = %7
%12 = fcmp oeq float %8, %0
%13 = and i1 %12, %5
br i1 %13, label %48, label %14
14: ; preds = %11
%15 = and i1 %12, %9
br i1 %15, label %48, label %16
16: ; preds = %14
%17 = fcmp ogt float %1, 0.000000e+00
br i1 %17, label %18, label %21
18: ; preds = %16
%19 = fdiv float %0, %1
%20 = tail call float @atanf(float %19)
br label %48
21: ; preds = %16
%22 = fcmp oge float %0, 0.000000e+00
%23 = fcmp olt float %1, 0.000000e+00
%24 = and i1 %22, %23
br i1 %24, label %25, label %30
25: ; preds = %21
%26 = fdiv float %0, %1
%27 = tail call float @atanf(float %26)
%28 = load float, float* @M_PI
%29 = fadd float %27, %28
br label %48
30: ; preds = %21
%31 = fcmp olt float %0, 0.000000e+00
br i1 %31, label %32, label %42
32: ; preds = %30
%33 = fcmp oeq float %1, 0.000000e+00
br i1 %33, label %34, label %37
34: ; preds = %32
%35 = load float, float* @M_PI_2
%36 = fneg float %35
br label %48
37: ; preds = %32
%38 = fdiv float %0, %1
%39 = tail call float @atanf(float %38)
%40 = load float, float* @M_PI
%41 = fsub float %39, %40
br label %48
42: ; preds = %30
%43 = fcmp ogt float %0, 0.000000e+00
%44 = fcmp oeq float %1, 0.000000e+00
%45 = and i1 %43, %44
%46 = load float, float* @M_PI_2
%47 = select i1 %45, float %46, float 0.000000e+00
br label %48
48: ; preds = %42, %14, %11, %7, %2, %37, %34, %25, %18
%49 = phi float [ %20, %18 ], [ %29, %25 ], [ %36, %34 ], [ %41, %37 ], [ 0x3FE921FB60000000, %2 ], [ 0x4002D97C80000000, %7 ], [ 0xBFE921FB60000000, %11 ], [ 0xC002D97C80000000, %14 ], [ %47, %42 ]
ret float %49
}