float range3f(float v1, float v2, float v3) {
  float range;
  float max;
  float min;
  if (v1 > v2) {
    if (v1 > v3) {
      max = v1;
      if (v2 > v3) {
        min = v3;
      } else {
        min = v2;
      }
    } else {
      max = v3;
      min = v2;
    }
  } else {
    if (v2 > v3) {
      max = v2;
      if (v1 > v3) {
        min = v3;
      } else {
        min = v1;
      }
    } else {
      max = v3;
      min = v1;
    }
  }
  range = max - min;
  return range;
}


x86 assembly (clang, -O0):
<range3f>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    1181 <range3f+0x81>
movss  -0x4(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    1168 <range3f+0x68>
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x8(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    1159 <range3f+0x59>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1163 <range3f+0x63>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    117c <range3f+0x7c>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    11e0 <range3f+0xe0>
movss  -0x8(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11c7 <range3f+0xc7>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x4(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11b8 <range3f+0xb8>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    11c2 <range3f+0xc2>
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    11db <range3f+0xdb>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    11e0 <range3f+0xe0>
movss  -0x14(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<range3f>:
ucomiss %xmm1,%xmm0
jbe    1119 <range3f+0x19>
ucomiss %xmm2,%xmm0
jbe    112a <range3f+0x2a>
movaps %xmm2,%xmm3
minss  %xmm1,%xmm3
movaps %xmm0,%xmm2
movaps %xmm3,%xmm0
jmp    112d <range3f+0x2d>
ucomiss %xmm2,%xmm1
jbe    112d <range3f+0x2d>
minss  %xmm0,%xmm2
movaps %xmm2,%xmm0
movaps %xmm1,%xmm2
jmp    112d <range3f+0x2d>
movaps %xmm1,%xmm0
subss  %xmm0,%xmm2
movaps %xmm2,%xmm0
ret

LLVM IR (-O0):
define float @range3f(float %0, float %1, float %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
store float %0, float* %4
store float %1, float* %5
store float %2, float* %6
%10 = load float, float* %4
%11 = load float, float* %5
%12 = fcmp ogt float %10, %11
br i1 %12, label %13, label %31
13: ; preds = %3
%14 = load float, float* %4
%15 = load float, float* %6
%16 = fcmp ogt float %14, %15
br i1 %16, label %17, label %27
17: ; preds = %13
%18 = load float, float* %4
store float %18, float* %8
%19 = load float, float* %5
%20 = load float, float* %6
%21 = fcmp ogt float %19, %20
br i1 %21, label %22, label %24
22: ; preds = %17
%23 = load float, float* %6
store float %23, float* %9
br label %26
24: ; preds = %17
%25 = load float, float* %5
store float %25, float* %9
br label %26
26: ; preds = %24, %22
br label %30
27: ; preds = %13
%28 = load float, float* %6
store float %28, float* %8
%29 = load float, float* %5
store float %29, float* %9
br label %30
30: ; preds = %27, %26
br label %49
31: ; preds = %3
%32 = load float, float* %5
%33 = load float, float* %6
%34 = fcmp ogt float %32, %33
br i1 %34, label %35, label %45
35: ; preds = %31
%36 = load float, float* %5
store float %36, float* %8
%37 = load float, float* %4
%38 = load float, float* %6
%39 = fcmp ogt float %37, %38
br i1 %39, label %40, label %42
40: ; preds = %35
%41 = load float, float* %6
store float %41, float* %9
br label %44
42: ; preds = %35
%43 = load float, float* %4
store float %43, float* %9
br label %44
44: ; preds = %42, %40
br label %48
45: ; preds = %31
%46 = load float, float* %6
store float %46, float* %8
%47 = load float, float* %4
store float %47, float* %9
br label %48
48: ; preds = %45, %44
br label %49
49: ; preds = %48, %30
%50 = load float, float* %8
%51 = load float, float* %9
%52 = fsub float %50, %51
store float %52, float* %7
%53 = load float, float* %7
ret float %53
}

LLVM IR (-O2):
define float @range3f(float %0, float %1, float %2) {
%4 = fcmp ogt float %0, %1
br i1 %4, label %5, label %10
5: ; preds = %3
%6 = fcmp ogt float %0, %2
br i1 %6, label %7, label %15
7: ; preds = %5
%8 = fcmp ogt float %1, %2
%9 = select i1 %8, float %2, float %1
br label %15
10: ; preds = %3
%11 = fcmp ogt float %1, %2
br i1 %11, label %12, label %15
12: ; preds = %10
%13 = fcmp ogt float %0, %2
%14 = select i1 %13, float %2, float %0
br label %15
15: ; preds = %10, %12, %5, %7
%16 = phi float [ %0, %7 ], [ %2, %5 ], [ %1, %12 ], [ %2, %10 ]
%17 = phi float [ %9, %7 ], [ %1, %5 ], [ %14, %12 ], [ %0, %10 ]
%18 = fsub float %16, %17
ret float %18
}