#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 fabsf(float);
float sqrtf(float);
float edgedf(float gx, float gy, float a) {
  float df, glength, temp, a1;
  if ((gx == 0) || (gy == 0)) {
    df = 0.5f - a;
  } else {
    glength = sqrtf(gx * gx + gy * gy);
    if (glength > 0) {
      gx = gx / glength;
      gy = gy / glength;
    }
    gx = fabsf(gx);
    gy = fabsf(gy);
    if (gx < gy) {
      temp = gx;
      gx = gy;
      gy = temp;
    }
    a1 = 0.5f * gy / gx;
    if (a < a1) {
      df = 0.5f * (gx + gy) - sqrtf(2.0f * gx * gy * a);
    } else if (a < (1.0f - a1)) {
      df = (0.5f - a) * gx;
    } else {
      df = -0.5f * (gx + gy) + sqrtf(2.0f * gx * gy * (1.0f - a));
    }
  }
  return df;
}


x86 assembly (clang, -O0):
<edgedf>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1143 <edgedf+0x33>
jp     1143 <edgedf+0x33>
jmp    115a <edgedf+0x4a>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1171 <edgedf+0x61>
jp     1171 <edgedf+0x61>
movss  0xeae(%rip),%xmm0
subss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    133a <edgedf+0x22a>
movss  -0x4(%rbp),%xmm0
movss  -0x4(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <sqrtf@plt>
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    11c6 <edgedf+0xb6>
movss  -0x4(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x8(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x4(%rbp),%xmm0
movaps 0xe2e(%rip),%xmm1
pand   %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x8(%rbp),%xmm0
movaps 0xe19(%rip),%xmm1
pand   %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x4(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1221 <edgedf+0x111>
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xde7(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
divss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0xc(%rbp),%xmm1
movss  -0x1c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12a5 <edgedf+0x195>
movss  -0x4(%rbp),%xmm0
addss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  0xdba(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
call   1030 <sqrtf@plt>
movaps %xmm0,%xmm1
movss  -0x20(%rbp),%xmm0
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
movss  0xd7d(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    1335 <edgedf+0x225>
movss  -0xc(%rbp),%xmm1
movss  0xd62(%rip),%xmm0
subss  -0x1c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12dc <edgedf+0x1cc>
movss  0xd48(%rip),%xmm0
subss  -0xc(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    1330 <edgedf+0x220>
movss  -0x4(%rbp),%xmm0
addss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  0xd29(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  0xd0f(%rip),%xmm1
subss  -0xc(%rbp),%xmm1
mulss  %xmm1,%xmm0
call   1030 <sqrtf@plt>
movaps %xmm0,%xmm1
movss  -0x24(%rbp),%xmm0
movss  0xcf5(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    1335 <edgedf+0x225>
jmp    133a <edgedf+0x22a>
movss  -0x10(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<edgedf>:
sub    $0x38,%rsp
movaps %xmm0,%xmm4
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm4
jne    1121 <edgedf+0x11>
jnp    1148 <edgedf+0x38>
ucomiss %xmm0,%xmm1
jne    1128 <edgedf+0x18>
jnp    1148 <edgedf+0x38>
movaps %xmm1,%xmm3
mulss  %xmm1,%xmm3
movaps %xmm4,%xmm0
mulss  %xmm4,%xmm0
addss  %xmm3,%xmm0
xorps  %xmm3,%xmm3
ucomiss %xmm3,%xmm0
jb     1159 <edgedf+0x49>
sqrtss %xmm0,%xmm0
jmp    1181 <edgedf+0x71>
movss  0xec0(%rip),%xmm0
subss  %xmm2,%xmm0
add    $0x38,%rsp
ret
movaps %xmm1,0x10(%rsp)
movss  %xmm2,0xc(%rsp)
movaps %xmm4,0x20(%rsp)
call   1030 <sqrtf@plt>
xorps  %xmm3,%xmm3
movaps 0x20(%rsp),%xmm4
movss  0xc(%rsp),%xmm2
movaps 0x10(%rsp),%xmm1
ucomiss %xmm3,%xmm0
unpcklps %xmm4,%xmm1
jbe    1190 <edgedf+0x80>
shufps $0x0,%xmm0,%xmm0
divps  %xmm0,%xmm1
andps  0xe69(%rip),%xmm1
pshufd $0x55,%xmm1,%xmm0
movdqa %xmm0,%xmm4
minss  %xmm1,%xmm4
maxss  %xmm0,%xmm1
movss  0xe60(%rip),%xmm5
mulss  %xmm4,%xmm5
divss  %xmm1,%xmm5
ucomiss %xmm2,%xmm5
jbe    11e1 <edgedf+0xd1>
movaps %xmm1,%xmm3
addss  %xmm4,%xmm3
addss  %xmm1,%xmm1
mulss  %xmm4,%xmm1
mulss  %xmm2,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jb     120a <edgedf+0xfa>
xorps  %xmm0,%xmm0
sqrtss %xmm1,%xmm0
jmp    121c <edgedf+0x10c>
movss  0xe2b(%rip),%xmm0
movaps %xmm0,%xmm3
subss  %xmm5,%xmm3
ucomiss %xmm2,%xmm3
jbe    122a <edgedf+0x11a>
movss  0xe13(%rip),%xmm0
subss  %xmm2,%xmm0
mulss  %xmm1,%xmm0
add    $0x38,%rsp
ret
movaps %xmm1,%xmm0
movaps %xmm3,0x10(%rsp)
call   1030 <sqrtf@plt>
movaps 0x10(%rsp),%xmm3
mulss  0xdec(%rip),%xmm3
subss  %xmm0,%xmm3
jmp    126a <edgedf+0x15a>
movaps %xmm1,%xmm3
addss  %xmm4,%xmm3
addss  %xmm1,%xmm1
mulss  %xmm4,%xmm1
subss  %xmm2,%xmm0
mulss  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     124f <edgedf+0x13f>
sqrtss %xmm0,%xmm0
jmp    125e <edgedf+0x14e>
movaps %xmm3,0x10(%rsp)
call   1030 <sqrtf@plt>
movaps 0x10(%rsp),%xmm3
mulss  0xdb2(%rip),%xmm3
addss  %xmm0,%xmm3
movaps %xmm3,%xmm0
add    $0x38,%rsp
ret

LLVM IR (-O0):
define float @edgedf(float %0, float %1, float %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
store float %0, float* %4
store float %1, float* %5
store float %2, float* %6
%11 = load float, float* %4
%12 = fcmp oeq float %11, 0.000000e+00
br i1 %12, label %16, label %13
13: ; preds = %3
%14 = load float, float* %5
%15 = fcmp oeq float %14, 0.000000e+00
br i1 %15, label %16, label %19
16: ; preds = %13, %3
%17 = load float, float* %6
%18 = fsub float 5.000000e-01, %17
store float %18, float* %7
br label %94
19: ; preds = %13
%20 = load float, float* %4
%21 = load float, float* %4
%22 = load float, float* %5
%23 = load float, float* %5
%24 = fmul float %22, %23
%25 = call float @llvm.fmuladd.f32(float %20, float %21, float %24)
%26 = call float @sqrtf(float %25)
store float %26, float* %8
%27 = load float, float* %8
%28 = fcmp ogt float %27, 0.000000e+00
br i1 %28, label %29, label %36
29: ; preds = %19
%30 = load float, float* %4
%31 = load float, float* %8
%32 = fdiv float %30, %31
store float %32, float* %4
%33 = load float, float* %5
%34 = load float, float* %8
%35 = fdiv float %33, %34
store float %35, float* %5
br label %36
36: ; preds = %29, %19
%37 = load float, float* %4
%38 = call float @llvm.fabs.f32(float %37)
store float %38, float* %4
%39 = load float, float* %5
%40 = call float @llvm.fabs.f32(float %39)
store float %40, float* %5
%41 = load float, float* %4
%42 = load float, float* %5
%43 = fcmp olt float %41, %42
br i1 %43, label %44, label %48
44: ; preds = %36
%45 = load float, float* %4
store float %45, float* %9
%46 = load float, float* %5
store float %46, float* %4
%47 = load float, float* %9
store float %47, float* %5
br label %48
48: ; preds = %44, %36
%49 = load float, float* %5
%50 = fmul float 5.000000e-01, %49
%51 = load float, float* %4
%52 = fdiv float %50, %51
store float %52, float* %10
%53 = load float, float* %6
%54 = load float, float* %10
%55 = fcmp olt float %53, %54
br i1 %55, label %56, label %69
56: ; preds = %48
%57 = load float, float* %4
%58 = load float, float* %5
%59 = fadd float %57, %58
%60 = load float, float* %4
%61 = fmul float 2.000000e+00, %60
%62 = load float, float* %5
%63 = fmul float %61, %62
%64 = load float, float* %6
%65 = fmul float %63, %64
%66 = call float @sqrtf(float %65)
%67 = fneg float %66
%68 = call float @llvm.fmuladd.f32(float 5.000000e-01, float %59, float %67)
store float %68, float* %7
br label %93
69: ; preds = %48
%70 = load float, float* %6
%71 = load float, float* %10
%72 = fsub float 1.000000e+00, %71
%73 = fcmp olt float %70, %72
br i1 %73, label %74, label %79
74: ; preds = %69
%75 = load float, float* %6
%76 = fsub float 5.000000e-01, %75
%77 = load float, float* %4
%78 = fmul float %76, %77
store float %78, float* %7
br label %92
79: ; preds = %69
%80 = load float, float* %4
%81 = load float, float* %5
%82 = fadd float %80, %81
%83 = load float, float* %4
%84 = fmul float 2.000000e+00, %83
%85 = load float, float* %5
%86 = fmul float %84, %85
%87 = load float, float* %6
%88 = fsub float 1.000000e+00, %87
%89 = fmul float %86, %88
%90 = call float @sqrtf(float %89)
%91 = call float @llvm.fmuladd.f32(float -5.000000e-01, float %82, float %90)
store float %91, float* %7
br label %92
92: ; preds = %79, %74
br label %93
93: ; preds = %92, %56
br label %94
94: ; preds = %93, %16
%95 = load float, float* %7
ret float %95
}

LLVM IR (-O2):
define float @edgedf(float %0, float %1, float %2) {
%4 = fcmp oeq float %0, 0.000000e+00
%5 = fcmp oeq float %1, 0.000000e+00
%6 = or i1 %4, %5
br i1 %6, label %7, label %9
7: ; preds = %3
%8 = fsub float 5.000000e-01, %2
br label %53
9: ; preds = %3
%10 = fmul float %1, %1
%11 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %10)
%12 = tail call float @sqrtf(float %11)
%13 = fcmp ogt float %12, 0.000000e+00
%14 = insertelement <2 x float> poison, float %1, i64 0
%15 = insertelement <2 x float> %14, float %0, i64 1
br i1 %13, label %16, label %20
16: ; preds = %9
%17 = insertelement <2 x float> poison, float %12, i64 0
%18 = shufflevector <2 x float> %17, <2 x float> poison, <2 x i32> zeroinitializer
%19 = fdiv <2 x float> %15, %18
br label %20
20: ; preds = %16, %9
%21 = phi <2 x float> [ %19, %16 ], [ %15, %9 ]
%22 = call <2 x float> @llvm.fabs.v2f32(<2 x float> %21)
%23 = extractelement <2 x float> %22, i64 0
%24 = extractelement <2 x float> %22, i64 1
%25 = fcmp olt float %24, %23
%26 = select i1 %25, float %24, float %23
%27 = select i1 %25, float %23, float %24
%28 = fmul float %26, 5.000000e-01
%29 = fdiv float %28, %27
%30 = fcmp ogt float %29, %2
br i1 %30, label %31, label %39
31: ; preds = %20
%32 = fadd float %27, %26
%33 = fmul float %27, 2.000000e+00
%34 = fmul float %26, %33
%35 = fmul float %34, %2
%36 = tail call float @sqrtf(float %35)
%37 = fneg float %36
%38 = tail call float @llvm.fmuladd.f32(float %32, float 5.000000e-01, float %37)
br label %53
39: ; preds = %20
%40 = fsub float 1.000000e+00, %29
%41 = fcmp ogt float %40, %2
br i1 %41, label %42, label %45
42: ; preds = %39
%43 = fsub float 5.000000e-01, %2
%44 = fmul float %43, %27
br label %53
45: ; preds = %39
%46 = fadd float %27, %26
%47 = fmul float %27, 2.000000e+00
%48 = fmul float %26, %47
%49 = fsub float 1.000000e+00, %2
%50 = fmul float %49, %48
%51 = tail call float @sqrtf(float %50)
%52 = tail call float @llvm.fmuladd.f32(float %46, float -5.000000e-01, float %51)
br label %53
53: ; preds = %31, %45, %42, %7
%54 = phi float [ %8, %7 ], [ %38, %31 ], [ %44, %42 ], [ %52, %45 ]
ret float %54
}