#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 M_PI;
float minus(float a, float b) {
  if ((((a - b) < 0.0) ? -(a - b) : (a - b)) < M_PI) {
    return (a - b);
  } else if (a > b) {
    return (a - b - 2.0 * M_PI);
  } else {
    return (a - b + 2.0 * M_PI);
  }
}


x86 assembly (clang, -O0):
<minus>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    114a <minus+0x4a>
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    1159 <minus+0x59>
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm1
mov    0x2e83(%rip),%rax
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    1186 <minus+0x86>
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11f6 <minus+0xf6>
movss  -0x8(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11c8 <minus+0xc8>
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    0x2e3e(%rip),%rax
movss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11f6 <minus+0xf6>
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
mov    0x2e0b(%rip),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<minus>:
movaps %xmm0,%xmm2
subss  %xmm1,%xmm0
movaps 0xef2(%rip),%xmm3
xorps  %xmm0,%xmm3
xorps  %xmm4,%xmm4
movaps %xmm0,%xmm5
cmpltss %xmm4,%xmm5
andps  %xmm5,%xmm3
andnps %xmm0,%xmm5
orps   %xmm3,%xmm5
mov    0x2ebc(%rip),%rax
movss  (%rax),%xmm3
ucomiss %xmm5,%xmm3
ja     115d <minus+0x5d>
cvtss2sd %xmm0,%xmm0
ucomiss %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtss2sd %xmm3,%xmm1
addsd  %xmm1,%xmm1
jbe    1152 <minus+0x52>
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
ret
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
ret

LLVM IR (-O0):
@M_PI = global float 0.000000e+00
define float @minus(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* %5
%8 = fsub float %6, %7
%9 = fpext float %8 to double
%10 = fcmp olt double %9, 0.000000e+00
br i1 %10, label %11, label %16
11: ; preds = %2
%12 = load float, float* %4
%13 = load float, float* %5
%14 = fsub float %12, %13
%15 = fneg float %14
br label %20
16: ; preds = %2
%17 = load float, float* %4
%18 = load float, float* %5
%19 = fsub float %17, %18
br label %20
20: ; preds = %16, %11
%21 = phi float [ %15, %11 ], [ %19, %16 ]
%22 = load float, float* @M_PI
%23 = fcmp olt float %21, %22
br i1 %23, label %24, label %28
24: ; preds = %20
%25 = load float, float* %4
%26 = load float, float* %5
%27 = fsub float %25, %26
store float %27, float* %3
br label %50
28: ; preds = %20
%29 = load float, float* %4
%30 = load float, float* %5
%31 = fcmp ogt float %29, %30
br i1 %31, label %32, label %41
32: ; preds = %28
%33 = load float, float* %4
%34 = load float, float* %5
%35 = fsub float %33, %34
%36 = fpext float %35 to double
%37 = load float, float* @M_PI
%38 = fpext float %37 to double
%39 = call double @llvm.fmuladd.f64(double -2.000000e+00, double %38, double %36)
%40 = fptrunc double %39 to float
store float %40, float* %3
br label %50
41: ; preds = %28
%42 = load float, float* %4
%43 = load float, float* %5
%44 = fsub float %42, %43
%45 = fpext float %44 to double
%46 = load float, float* @M_PI
%47 = fpext float %46 to double
%48 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %47, double %45)
%49 = fptrunc double %48 to float
store float %49, float* %3
br label %50
50: ; preds = %41, %32, %24
%51 = load float, float* %3
ret float %51
}

LLVM IR (-O2):
@M_PI = global float 0.000000e+00
define float @minus(float %0, float %1) {
%3 = fsub float %0, %1
%4 = fpext float %3 to double
%5 = fcmp olt float %3, 0.000000e+00
%6 = fneg float %3
%7 = select i1 %5, float %6, float %3
%8 = load float, float* @M_PI
%9 = fcmp olt float %7, %8
br i1 %9, label %19, label %10
10: ; preds = %2
%11 = fcmp ogt float %0, %1
%12 = fpext float %8 to double
br i1 %11, label %13, label %16
13: ; preds = %10
%14 = tail call double @llvm.fmuladd.f64(double %12, double -2.000000e+00, double %4)
%15 = fptrunc double %14 to float
br label %19
16: ; preds = %10
%17 = tail call double @llvm.fmuladd.f64(double %12, double 2.000000e+00, double %4)
%18 = fptrunc double %17 to float
br label %19
19: ; preds = %2, %16, %13
%20 = phi float [ %15, %13 ], [ %18, %16 ], [ %3, %2 ]
ret float %20
}