#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 dipole_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):
<dipole_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    1216 <dipole_hypot+0x106>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1179 <dipole_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    12f8 <dipole_hypot+0x1e8>
movss  -0x8(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
ucomiss %xmm1,%xmm0
jbe    11d1 <dipole_hypot+0xc1>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0xc(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <sqrt@plt>
movss  %xmm0,-0x4(%rbp)
jmp    12f8 <dipole_hypot+0x1e8>
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%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    12f8 <dipole_hypot+0x1e8>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    1264 <dipole_hypot+0x154>
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    12f8 <dipole_hypot+0x1e8>
movss  -0x8(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    12c5 <dipole_hypot+0x1b5>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0xc(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%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    12f8 <dipole_hypot+0x1e8>
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%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):
<dipole_hypot>:
push   %rax
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm0
jbe    112c <dipole_hypot+0x1c>
ucomiss %xmm2,%xmm1
jbe    113f <dipole_hypot+0x2f>
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
jmp    115a <dipole_hypot+0x4a>
ucomiss %xmm1,%xmm2
jbe    1168 <dipole_hypot+0x58>
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
jmp    1183 <dipole_hypot+0x73>
movaps 0xeba(%rip),%xmm2
xorps  %xmm1,%xmm2
ucomiss %xmm2,%xmm0
jbe    1197 <dipole_hypot+0x87>
mulss  %xmm1,%xmm2
mulss  %xmm0,%xmm0
addss  %xmm2,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     1191 <dipole_hypot+0x81>
sqrtss %xmm0,%xmm0
pop    %rax
ret
movaps 0xe91(%rip),%xmm2
xorps  %xmm0,%xmm2
ucomiss %xmm1,%xmm2
jbe    11b4 <dipole_hypot+0xa4>
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
subss  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     11d4 <dipole_hypot+0xc4>
sqrtss %xmm0,%xmm0
jmp    11d9 <dipole_hypot+0xc9>
pop    %rax
jmp    1030 <sqrt@plt>
mulss  %xmm0,%xmm0
mulss  %xmm1,%xmm1
subss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jb     11d1 <dipole_hypot+0xc1>
xorps  %xmm0,%xmm0
sqrtss %xmm1,%xmm0
jmp    11d9 <dipole_hypot+0xc9>
mulss  %xmm0,%xmm2
mulss  %xmm1,%xmm1
addss  %xmm2,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jb     11e2 <dipole_hypot+0xd2>
xorps  %xmm0,%xmm0
sqrtss %xmm1,%xmm0
pop    %rax
ret
movaps %xmm1,%xmm0
call   1030 <sqrt@plt>
xorps  0xe20(%rip),%xmm0
pop    %rax
ret
movaps %xmm1,%xmm0
pop    %rax
jmp    1030 <sqrt@plt>

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

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