#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 fabs(float);
float angleDifference(float angleA, float angleB) {
  float diff = fabs(angleA - angleB);
  if (fabs((angleA + 360) - angleB) < diff) {
    diff = fabs((angleA + 360) - angleB);
  }
  if (fabs((angleA - 360) - angleB) < diff) {
    diff = fabs((angleA - 360) - angleB);
  }
  if (fabs(angleA - (angleB + 360)) < diff) {
    diff = fabs(angleA - (angleB + 360));
  }
  if (fabs(angleA - (angleB - 360)) < diff) {
    diff = fabs(angleA - (angleB - 360));
  }
  return diff;
}


x86 assembly (clang, -O0):
<angleDifference>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  -0x4(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0xc(%rbp)
movss  0xec2(%rip),%xmm0
addss  -0x4(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
call   1030 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    117a <angleDifference+0x6a>
movss  0xe9a(%rip),%xmm0
addss  -0x4(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
movss  0xe79(%rip),%xmm1
subss  %xmm1,%xmm0
subss  -0x8(%rbp),%xmm0
call   1030 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    11c6 <angleDifference+0xb6>
movss  -0x4(%rbp),%xmm0
movss  0xe4d(%rip),%xmm1
subss  %xmm1,%xmm0
subss  -0x8(%rbp),%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
movss  0xe2d(%rip),%xmm1
addss  -0x8(%rbp),%xmm1
subss  %xmm1,%xmm0
call   1030 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1212 <angleDifference+0x102>
movss  -0x4(%rbp),%xmm0
movss  0xe01(%rip),%xmm1
addss  -0x8(%rbp),%xmm1
subss  %xmm1,%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movss  0xddc(%rip),%xmm2
subss  %xmm2,%xmm1
subss  %xmm1,%xmm0
call   1030 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1266 <angleDifference+0x156>
movss  -0x4(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movss  0xdac(%rip),%xmm2
subss  %xmm2,%xmm1
subss  %xmm1,%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<angleDifference>:
movss  0xef8(%rip),%xmm2
movaps %xmm0,%xmm3
addss  %xmm2,%xmm3
unpcklps %xmm0,%xmm3
movaps %xmm1,%xmm4
shufps $0x0,%xmm1,%xmm4
subps  %xmm4,%xmm3
movaps 0xeed(%rip),%xmm4
andps  %xmm4,%xmm3
pshufd $0x55,%xmm3,%xmm5
minss  %xmm5,%xmm3
movss  0xecd(%rip),%xmm5
movaps %xmm0,%xmm6
addss  %xmm5,%xmm6
subss  %xmm1,%xmm6
andps  %xmm4,%xmm6
minss  %xmm3,%xmm6
addss  %xmm1,%xmm2
movaps %xmm0,%xmm3
subss  %xmm2,%xmm3
andps  %xmm4,%xmm3
minss  %xmm6,%xmm3
addss  %xmm5,%xmm1
subss  %xmm1,%xmm0
andps  %xmm4,%xmm0
minss  %xmm3,%xmm0
ret

LLVM IR (-O0):
define float @angleDifference(float %0, float %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca float
store float %0, float* %3
store float %1, float* %4
%6 = load float, float* %3
%7 = load float, float* %4
%8 = fsub float %6, %7
%9 = call float @fabs(float %8)
store float %9, float* %5
%10 = load float, float* %3
%11 = fadd float %10, 3.600000e+02
%12 = load float, float* %4
%13 = fsub float %11, %12
%14 = call float @fabs(float %13)
%15 = load float, float* %5
%16 = fcmp olt float %14, %15
br i1 %16, label %17, label %23
17: ; preds = %2
%18 = load float, float* %3
%19 = fadd float %18, 3.600000e+02
%20 = load float, float* %4
%21 = fsub float %19, %20
%22 = call float @fabs(float %21)
store float %22, float* %5
br label %23
23: ; preds = %17, %2
%24 = load float, float* %3
%25 = fsub float %24, 3.600000e+02
%26 = load float, float* %4
%27 = fsub float %25, %26
%28 = call float @fabs(float %27)
%29 = load float, float* %5
%30 = fcmp olt float %28, %29
br i1 %30, label %31, label %37
31: ; preds = %23
%32 = load float, float* %3
%33 = fsub float %32, 3.600000e+02
%34 = load float, float* %4
%35 = fsub float %33, %34
%36 = call float @fabs(float %35)
store float %36, float* %5
br label %37
37: ; preds = %31, %23
%38 = load float, float* %3
%39 = load float, float* %4
%40 = fadd float %39, 3.600000e+02
%41 = fsub float %38, %40
%42 = call float @fabs(float %41)
%43 = load float, float* %5
%44 = fcmp olt float %42, %43
br i1 %44, label %45, label %51
45: ; preds = %37
%46 = load float, float* %3
%47 = load float, float* %4
%48 = fadd float %47, 3.600000e+02
%49 = fsub float %46, %48
%50 = call float @fabs(float %49)
store float %50, float* %5
br label %51
51: ; preds = %45, %37
%52 = load float, float* %3
%53 = load float, float* %4
%54 = fsub float %53, 3.600000e+02
%55 = fsub float %52, %54
%56 = call float @fabs(float %55)
%57 = load float, float* %5
%58 = fcmp olt float %56, %57
br i1 %58, label %59, label %65
59: ; preds = %51
%60 = load float, float* %3
%61 = load float, float* %4
%62 = fsub float %61, 3.600000e+02
%63 = fsub float %60, %62
%64 = call float @fabs(float %63)
store float %64, float* %5
br label %65
65: ; preds = %59, %51
%66 = load float, float* %5
ret float %66
}

LLVM IR (-O2):
define float @angleDifference(float %0, float %1) {
%3 = fadd float %0, 3.600000e+02
%4 = insertelement <2 x float> poison, float %0, i64 1
%5 = insertelement <2 x float> %4, float %3, i64 0
%6 = insertelement <2 x float> poison, float %1, i64 0
%7 = shufflevector <2 x float> %6, <2 x float> poison, <2 x i32> zeroinitializer
%8 = fsub <2 x float> %5, %7
%9 = call <2 x float> @llvm.fabs.v2f32(<2 x float> %8)
%10 = extractelement <2 x float> %9, i64 0
%11 = extractelement <2 x float> %9, i64 1
%12 = fcmp olt float %10, %11
%13 = select i1 %12, float %10, float %11
%14 = fadd float %0, -3.600000e+02
%15 = fsub float %14, %1
%16 = tail call float @llvm.fabs.f32(float %15)
%17 = fcmp olt float %16, %13
%18 = select i1 %17, float %16, float %13
%19 = fadd float %1, 3.600000e+02
%20 = fsub float %0, %19
%21 = tail call float @llvm.fabs.f32(float %20)
%22 = fcmp olt float %21, %18
%23 = select i1 %22, float %21, float %18
%24 = fadd float %1, -3.600000e+02
%25 = fsub float %0, %24
%26 = tail call float @llvm.fabs.f32(float %25)
%27 = fcmp olt float %26, %23
%28 = select i1 %27, float %26, float %23
ret float %28
}