#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 ARCTAN(double);
int /*<<< orphan*/ __VERIFIER_assert(int);
int /*<<< orphan*/ __VERIFIER_assume(int);
double __VERIFIER_nondet_double();
int main() {
  double a, r;
  a = __VERIFIER_nondet_double();
  __VERIFIER_assume(a >= -1.79e308 && a <= 1.79e308);
  r = ARCTAN(a);
  __VERIFIER_assert(r >= -1.571 && r <= 1.571);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movl   $0x0,-0x4(%rbp)
mov    $0x0,%al
call   1040 <__VERIFIER_nondet_double@plt>
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
xor    %eax,%eax
movsd  0xe96(%rip),%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x19(%rbp)
jb     118a <main+0x4a>
movsd  0xe89(%rip),%xmm0
ucomisd -0x10(%rbp),%xmm0
setae  %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1060 <__VERIFIER_assume@plt>
movsd  -0x10(%rbp),%xmm0
call   1030 <ARCTAN@plt>
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
xor    %eax,%eax
movsd  0xe5b(%rip),%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x1a(%rbp)
jb     11d5 <main+0x95>
movsd  0xe4e(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
setae  %al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1050 <__VERIFIER_assert@plt>
xor    %eax,%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rax
xor    %eax,%eax
call   1040 <__VERIFIER_nondet_double@plt>
movsd  %xmm0,(%rsp)
ucomisd 0xeab(%rip),%xmm0
setae  %al
movsd  0xea8(%rip),%xmm1
ucomisd %xmm0,%xmm1
setae  %cl
and    %al,%cl
movzbl %cl,%edi
call   1060 <__VERIFIER_assume@plt>
movsd  (%rsp),%xmm0
call   1030 <ARCTAN@plt>
ucomisd 0xe8d(%rip),%xmm0
setae  %al
movsd  0xe8a(%rip),%xmm1
ucomisd %xmm0,%xmm1
setae  %cl
and    %al,%cl
movzbl %cl,%edi
call   1050 <__VERIFIER_assert@plt>
xor    %eax,%eax
pop    %rcx
ret

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca double
%3 = alloca double
store i32 0, i32* %1
%4 = call double (...) @__VERIFIER_nondet_double()
store double %4, double* %2
%5 = load double, double* %2
%6 = fcmp oge double %5, -1.790000e+308
br i1 %6, label %7, label %10
7: ; preds = %0
%8 = load double, double* %2
%9 = fcmp ole double %8, 1.790000e+308
br label %10
10: ; preds = %7, %0
%11 = phi i1 [ false, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i32
%13 = call i32 @__VERIFIER_assume(i32 %12)
%14 = load double, double* %2
%15 = call double @ARCTAN(double %14)
store double %15, double* %3
%16 = load double, double* %3
%17 = fcmp oge double %16, -1.571000e+00
br i1 %17, label %18, label %21
18: ; preds = %10
%19 = load double, double* %3
%20 = fcmp ole double %19, 1.571000e+00
br label %21
21: ; preds = %18, %10
%22 = phi i1 [ false, %10 ], [ %20, %18 ]
%23 = zext i1 %22 to i32
%24 = call i32 @__VERIFIER_assert(i32 %23)
ret i32 0
}

LLVM IR (-O2):
define i32 @main() {
%1 = tail call double (...) @__VERIFIER_nondet_double()
%2 = fcmp oge double %1, -1.790000e+308
%3 = fcmp ole double %1, 1.790000e+308
%4 = and i1 %2, %3
%5 = zext i1 %4 to i32
%6 = tail call i32 @__VERIFIER_assume(i32 %5)
%7 = tail call double @ARCTAN(double %1)
%8 = fcmp oge double %7, -1.571000e+00
%9 = fcmp ole double %7, 1.571000e+00
%10 = and i1 %8, %9
%11 = zext i1 %10 to i32
%12 = tail call i32 @__VERIFIER_assert(i32 %11)
ret i32 0
}