#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 */
int M_PI;
float wraptopi(float number) {
  if (number > (float)M_PI) {
    return (number - (float)(2 * M_PI));
  } else if (number < (float)(-1 * M_PI)) {
    return (number + (float)(2 * M_PI));
  } else {
    return (number);
  }
}


x86 assembly (clang, -O0):
<wraptopi>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
mov    0x2ed3(%rip),%rax
cvtsi2ssl (%rax),%xmm1
ucomiss %xmm1,%xmm0
jbe    1145 <wraptopi+0x45>
movss  -0x8(%rbp),%xmm0
mov    0x2eba(%rip),%rax
mov    (%rax),%eax
shl    $0x1,%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1191 <wraptopi+0x91>
movss  -0x8(%rbp),%xmm1
mov    0x2e97(%rip),%rax
imul   $0xffffffff,(%rax),%eax
cvtsi2ss %eax,%xmm0
ucomiss %xmm1,%xmm0
jbe    1187 <wraptopi+0x87>
movss  -0x8(%rbp),%xmm0
mov    0x2e78(%rip),%rax
mov    (%rax),%eax
shl    $0x1,%eax
cvtsi2ss %eax,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1191 <wraptopi+0x91>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<wraptopi>:
mov    0x2ee1(%rip),%rax
mov    (%rax),%eax
cvtsi2ss %eax,%xmm1
ucomiss %xmm1,%xmm0
jbe    1120 <wraptopi+0x20>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
ret
mov    %eax,%ecx
neg    %ecx
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
ucomiss %xmm0,%xmm1
jbe    113d <wraptopi+0x3d>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
addss  %xmm1,%xmm0
ret

LLVM IR (-O0):
@M_PI = global i32 0
define float @wraptopi(float %0) {
%2 = alloca float
%3 = alloca float
store float %0, float* %3
%4 = load float, float* %3
%5 = load i32, i32* @M_PI
%6 = sitofp i32 %5 to float
%7 = fcmp ogt float %4, %6
br i1 %7, label %8, label %14
8: ; preds = %1
%9 = load float, float* %3
%10 = load i32, i32* @M_PI
%11 = mul nsw i32 2, %10
%12 = sitofp i32 %11 to float
%13 = fsub float %9, %12
store float %13, float* %2
br label %28
14: ; preds = %1
%15 = load float, float* %3
%16 = load i32, i32* @M_PI
%17 = mul nsw i32 -1, %16
%18 = sitofp i32 %17 to float
%19 = fcmp olt float %15, %18
br i1 %19, label %20, label %26
20: ; preds = %14
%21 = load float, float* %3
%22 = load i32, i32* @M_PI
%23 = mul nsw i32 2, %22
%24 = sitofp i32 %23 to float
%25 = fadd float %21, %24
store float %25, float* %2
br label %28
26: ; preds = %14
%27 = load float, float* %3
store float %27, float* %2
br label %28
28: ; preds = %26, %20, %8
%29 = load float, float* %2
ret float %29
}

LLVM IR (-O2):
@M_PI = global i32 0
define float @wraptopi(float %0) {
%2 = load i32, i32* @M_PI
%3 = sitofp i32 %2 to float
%4 = fcmp olt float %3, %0
br i1 %4, label %5, label %9
5: ; preds = %1
%6 = shl nsw i32 %2, 1
%7 = sitofp i32 %6 to float
%8 = fsub float %0, %7
br label %17
9: ; preds = %1
%10 = sub nsw i32 0, %2
%11 = sitofp i32 %10 to float
%12 = fcmp ogt float %11, %0
br i1 %12, label %13, label %17
13: ; preds = %9
%14 = shl nsw i32 %2, 1
%15 = sitofp i32 %14 to float
%16 = fadd float %15, %0
br label %17
17: ; preds = %9, %13, %5
%18 = phi float [ %8, %5 ], [ %16, %13 ], [ %0, %9 ]
ret float %18
}