#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 /*<<< orphan*/ printf(char *, float, float);
float check_signal(float a, float b) {
  printf("A: %.0f B: %.0f ", a, b);
  if (a > 0 && b > 0) {
    return (-b) / a;
  } else if (a > 0 && b < 0) {
    return b / (-a);
  } else if (a < 0 && b > 0) {
    return (-b) / a;
  } else if (a < 0 && b < 0) {
    return b / a;
  }
}


x86 assembly (clang, -O0):
<check_signal>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
lea    0xecd(%rip),%rdi
call   1030 <printf@plt>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    117b <check_signal+0x6b>
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    117b <check_signal+0x6b>
movss  -0xc(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
divss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    123a <check_signal+0x12a>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    11be <check_signal+0xae>
xorps  %xmm0,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11be <check_signal+0xae>
movss  -0xc(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    123a <check_signal+0x12a>
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    11fd <check_signal+0xed>
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    11fd <check_signal+0xed>
movss  -0xc(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
divss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    123a <check_signal+0x12a>
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    122b <check_signal+0x11b>
xorps  %xmm0,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    122b <check_signal+0x11b>
movss  -0xc(%rbp),%xmm0
divss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    123a <check_signal+0x12a>
jmp    1230 <check_signal+0x120>
jmp    1235 <check_signal+0x125>
jmp    123a <check_signal+0x12a>
movss  -0x4(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_signal>:
sub    $0x28,%rsp
movaps %xmm1,(%rsp)
movaps %xmm0,0x10(%rsp)
lea    0xeec(%rip),%rdi
call   1030 <printf@plt>
movaps 0x10(%rsp),%xmm2
movaps (%rsp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm2
jbe    1148 <check_signal+0x38>
ucomiss %xmm1,%xmm0
jbe    1148 <check_signal+0x38>
xorps  0xeba(%rip),%xmm0
jmp    115c <check_signal+0x4c>
ucomiss %xmm1,%xmm2
jbe    1165 <check_signal+0x55>
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
jbe    1165 <check_signal+0x55>
xorps  0xea4(%rip),%xmm2
divss  %xmm2,%xmm0
add    $0x28,%rsp
ret
xorps  %xmm1,%xmm1
ucomiss %xmm2,%xmm1
jbe    1172 <check_signal+0x62>
ucomiss %xmm1,%xmm0
ja     113f <check_signal+0x2f>
ucomiss %xmm2,%xmm1
jbe    1160 <check_signal+0x50>
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
ja     115c <check_signal+0x4c>
jmp    1160 <check_signal+0x50>

LLVM IR (-O0):
@.str = [17 x i8] c"A: %.0f B: %.0f \00"
define float @check_signal(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 = call i32 @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i64 0, i64 0), float %6, float %7)
%9 = load float, float* %4
%10 = fcmp ogt float %9, 0.000000e+00
br i1 %10, label %11, label %19
11: ; preds = %2
%12 = load float, float* %5
%13 = fcmp ogt float %12, 0.000000e+00
br i1 %13, label %14, label %19
14: ; preds = %11
%15 = load float, float* %5
%16 = fneg float %15
%17 = load float, float* %4
%18 = fdiv float %16, %17
store float %18, float* %3
br label %54
19: ; preds = %11, %2
%20 = load float, float* %4
%21 = fcmp ogt float %20, 0.000000e+00
br i1 %21, label %22, label %30
22: ; preds = %19
%23 = load float, float* %5
%24 = fcmp olt float %23, 0.000000e+00
br i1 %24, label %25, label %30
25: ; preds = %22
%26 = load float, float* %5
%27 = load float, float* %4
%28 = fneg float %27
%29 = fdiv float %26, %28
store float %29, float* %3
br label %54
30: ; preds = %22, %19
%31 = load float, float* %4
%32 = fcmp olt float %31, 0.000000e+00
br i1 %32, label %33, label %41
33: ; preds = %30
%34 = load float, float* %5
%35 = fcmp ogt float %34, 0.000000e+00
br i1 %35, label %36, label %41
36: ; preds = %33
%37 = load float, float* %5
%38 = fneg float %37
%39 = load float, float* %4
%40 = fdiv float %38, %39
store float %40, float* %3
br label %54
41: ; preds = %33, %30
%42 = load float, float* %4
%43 = fcmp olt float %42, 0.000000e+00
br i1 %43, label %44, label %51
44: ; preds = %41
%45 = load float, float* %5
%46 = fcmp olt float %45, 0.000000e+00
br i1 %46, label %47, label %51
47: ; preds = %44
%48 = load float, float* %5
%49 = load float, float* %4
%50 = fdiv float %48, %49
store float %50, float* %3
br label %54
51: ; preds = %44, %41
br label %52
52: ; preds = %51
br label %53
53: ; preds = %52
br label %54
54: ; preds = %14, %25, %36, %47, %53
%55 = load float, float* %3
ret float %55
}

LLVM IR (-O2):
@.str = [17 x i8] c"A: %.0f B: %.0f \00"
define float @check_signal(float %0, float %1) {
%3 = tail call i32 @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i64 0, i64 0), float %0, float %1)
%4 = fcmp ogt float %0, 0.000000e+00
%5 = fcmp ogt float %1, 0.000000e+00
%6 = and i1 %4, %5
br i1 %6, label %7, label %10
7: ; preds = %2
%8 = fneg float %1
%9 = fdiv float %8, %0
br label %26
10: ; preds = %2
%11 = fcmp olt float %1, 0.000000e+00
%12 = and i1 %4, %11
br i1 %12, label %13, label %16
13: ; preds = %10
%14 = fneg float %0
%15 = fdiv float %1, %14
br label %26
16: ; preds = %10
%17 = fcmp olt float %0, 0.000000e+00
%18 = and i1 %17, %5
br i1 %18, label %19, label %22
19: ; preds = %16
%20 = fneg float %1
%21 = fdiv float %20, %0
br label %26
22: ; preds = %16
%23 = and i1 %17, %11
br i1 %23, label %24, label %26
24: ; preds = %22
%25 = fdiv float %1, %0
br label %26
26: ; preds = %22, %7, %13, %19, %24
%27 = phi float [ %9, %7 ], [ %15, %13 ], [ %21, %19 ], [ %25, %24 ], [ undef, %22 ]
ret float %27
}