#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 sqrt(float);
float round_hypot(float a, float b) {
  if (a > 0.) {
    if (b > 0.)
      return sqrt(a * a + b * b);
    if (a > -b)
      return sqrt(a * a + b * b);
    return -sqrt(b * b + a * a);
  }
  if (b < 0.)
    return -sqrt(a * a + b * b);
  if (-a > b)
    return -sqrt(a * a + b * b);
  return sqrt(b * b + a * a);
}


x86 assembly (clang, -O0):
<round_hypot>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    11fc <round_hypot+0xec>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1179 <round_hypot+0x69>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0xc(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <sqrt@plt>
movss  %xmm0,-0x4(%rbp)
jmp    12c4 <round_hypot+0x1b4>
movss  -0x8(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
ucomiss %xmm1,%xmm0
jbe    11c4 <round_hypot+0xb4>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0xc(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <sqrt@plt>
movss  %xmm0,-0x4(%rbp)
jmp    12c4 <round_hypot+0x1b4>
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <sqrt@plt>
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12c4 <round_hypot+0x1b4>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    124a <round_hypot+0x13a>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0xc(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <sqrt@plt>
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12c4 <round_hypot+0x1b4>
movss  -0x8(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    129e <round_hypot+0x18e>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0xc(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <sqrt@plt>
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12c4 <round_hypot+0x1b4>
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <sqrt@plt>
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<round_hypot>:
push   %rax
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm0
jbe    1147 <round_hypot+0x37>
ucomiss %xmm2,%xmm1
ja     112d <round_hypot+0x1d>
movaps 0xedb(%rip),%xmm2
xorps  %xmm1,%xmm2
ucomiss %xmm2,%xmm0
jbe    117b <round_hypot+0x6b>
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     1175 <round_hypot+0x65>
sqrtss %xmm0,%xmm0
pop    %rax
ret
ucomiss %xmm1,%xmm2
ja     115b <round_hypot+0x4b>
movaps 0xead(%rip),%xmm2
xorps  %xmm0,%xmm2
ucomiss %xmm1,%xmm2
jbe    1198 <round_hypot+0x88>
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     11b8 <round_hypot+0xa8>
sqrtss %xmm0,%xmm0
jmp    11bd <round_hypot+0xad>
pop    %rax
jmp    1030 <sqrt@plt>
mulss  %xmm0,%xmm0
mulss  %xmm1,%xmm1
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jb     11b5 <round_hypot+0xa5>
xorps  %xmm0,%xmm0
sqrtss %xmm1,%xmm0
jmp    11bd <round_hypot+0xad>
mulss  %xmm0,%xmm0
mulss  %xmm1,%xmm1
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jb     11c6 <round_hypot+0xb6>
xorps  %xmm0,%xmm0
sqrtss %xmm1,%xmm0
pop    %rax
ret
movaps %xmm1,%xmm0
call   1030 <sqrt@plt>
xorps  0xe3c(%rip),%xmm0
pop    %rax
ret
movaps %xmm1,%xmm0
pop    %rax
jmp    1030 <sqrt@plt>

LLVM IR (-O0):
define float @round_hypot(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 = fpext float %6 to double
%8 = fcmp ogt double %7, 0.000000e+00
br i1 %8, label %9, label %43
9: ; preds = %2
%10 = load float, float* %5
%11 = fpext float %10 to double
%12 = fcmp ogt double %11, 0.000000e+00
br i1 %12, label %13, label %21
13: ; preds = %9
%14 = load float, float* %4
%15 = load float, float* %4
%16 = load float, float* %5
%17 = load float, float* %5
%18 = fmul float %16, %17
%19 = call float @llvm.fmuladd.f32(float %14, float %15, float %18)
%20 = call float @sqrt(float %19)
store float %20, float* %3
br label %78
21: ; preds = %9
%22 = load float, float* %4
%23 = load float, float* %5
%24 = fneg float %23
%25 = fcmp ogt float %22, %24
br i1 %25, label %26, label %34
26: ; preds = %21
%27 = load float, float* %4
%28 = load float, float* %4
%29 = load float, float* %5
%30 = load float, float* %5
%31 = fmul float %29, %30
%32 = call float @llvm.fmuladd.f32(float %27, float %28, float %31)
%33 = call float @sqrt(float %32)
store float %33, float* %3
br label %78
34: ; preds = %21
%35 = load float, float* %5
%36 = load float, float* %5
%37 = load float, float* %4
%38 = load float, float* %4
%39 = fmul float %37, %38
%40 = call float @llvm.fmuladd.f32(float %35, float %36, float %39)
%41 = call float @sqrt(float %40)
%42 = fneg float %41
store float %42, float* %3
br label %78
43: ; preds = %2
%44 = load float, float* %5
%45 = fpext float %44 to double
%46 = fcmp olt double %45, 0.000000e+00
br i1 %46, label %47, label %56
47: ; preds = %43
%48 = load float, float* %4
%49 = load float, float* %4
%50 = load float, float* %5
%51 = load float, float* %5
%52 = fmul float %50, %51
%53 = call float @llvm.fmuladd.f32(float %48, float %49, float %52)
%54 = call float @sqrt(float %53)
%55 = fneg float %54
store float %55, float* %3
br label %78
56: ; preds = %43
%57 = load float, float* %4
%58 = fneg float %57
%59 = load float, float* %5
%60 = fcmp ogt float %58, %59
br i1 %60, label %61, label %70
61: ; preds = %56
%62 = load float, float* %4
%63 = load float, float* %4
%64 = load float, float* %5
%65 = load float, float* %5
%66 = fmul float %64, %65
%67 = call float @llvm.fmuladd.f32(float %62, float %63, float %66)
%68 = call float @sqrt(float %67)
%69 = fneg float %68
store float %69, float* %3
br label %78
70: ; preds = %56
%71 = load float, float* %5
%72 = load float, float* %5
%73 = load float, float* %4
%74 = load float, float* %4
%75 = fmul float %73, %74
%76 = call float @llvm.fmuladd.f32(float %71, float %72, float %75)
%77 = call float @sqrt(float %76)
store float %77, float* %3
br label %78
78: ; preds = %70, %61, %47, %34, %26, %13
%79 = load float, float* %3
ret float %79
}

LLVM IR (-O2):
define float @round_hypot(float %0, float %1) {
%3 = fcmp ogt float %0, 0.000000e+00
br i1 %3, label %4, label %22
4: ; preds = %2
%5 = fcmp ogt float %1, 0.000000e+00
br i1 %5, label %6, label %10
6: ; preds = %4
%7 = fmul float %1, %1
%8 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %7)
%9 = tail call float @sqrt(float %8)
br label %41
10: ; preds = %4
%11 = fneg float %1
%12 = fcmp olt float %11, %0
br i1 %12, label %13, label %17
13: ; preds = %10
%14 = fmul float %1, %1
%15 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %14)
%16 = tail call float @sqrt(float %15)
br label %41
17: ; preds = %10
%18 = fmul float %0, %0
%19 = tail call float @llvm.fmuladd.f32(float %1, float %1, float %18)
%20 = tail call float @sqrt(float %19)
%21 = fneg float %20
br label %41
22: ; preds = %2
%23 = fcmp olt float %1, 0.000000e+00
br i1 %23, label %24, label %29
24: ; preds = %22
%25 = fmul float %1, %1
%26 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %25)
%27 = tail call float @sqrt(float %26)
%28 = fneg float %27
br label %41
29: ; preds = %22
%30 = fneg float %0
%31 = fcmp ogt float %30, %1
br i1 %31, label %32, label %37
32: ; preds = %29
%33 = fmul float %1, %1
%34 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %33)
%35 = tail call float @sqrt(float %34)
%36 = fneg float %35
br label %41
37: ; preds = %29
%38 = fmul float %0, %0
%39 = tail call float @llvm.fmuladd.f32(float %1, float %1, float %38)
%40 = tail call float @sqrt(float %39)
br label %41
41: ; preds = %37, %32, %24, %17, %13, %6
%42 = phi float [ %9, %6 ], [ %16, %13 ], [ %21, %17 ], [ %28, %24 ], [ %36, %32 ], [ %40, %37 ]
ret float %42
}