float max_of_4(float a, float b, float c, float d) {
  if (a >= b && a >= c && a >= d) {
    return a;
  }
  if (b >= c && b >= d) {
    return b;
  }
  if (c >= d) {
    return c;
  }
  return d;
}


x86 assembly (clang, -O0):
<max_of_4>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm2,-0x10(%rbp)
movss  %xmm3,-0x14(%rbp)
movss  -0x8(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jb     1154 <max_of_4+0x54>
movss  -0x8(%rbp),%xmm0
ucomiss -0x10(%rbp),%xmm0
jb     1154 <max_of_4+0x54>
movss  -0x8(%rbp),%xmm0
ucomiss -0x14(%rbp),%xmm0
jb     1154 <max_of_4+0x54>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11a9 <max_of_4+0xa9>
movss  -0xc(%rbp),%xmm0
ucomiss -0x10(%rbp),%xmm0
jb     1181 <max_of_4+0x81>
movss  -0xc(%rbp),%xmm0
ucomiss -0x14(%rbp),%xmm0
jb     1181 <max_of_4+0x81>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11a9 <max_of_4+0xa9>
movss  -0x10(%rbp),%xmm0
ucomiss -0x14(%rbp),%xmm0
jb     119f <max_of_4+0x9f>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11a9 <max_of_4+0xa9>
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<max_of_4>:
ucomiss %xmm1,%xmm0
jb     1110 <max_of_4+0x10>
ucomiss %xmm2,%xmm0
jb     1110 <max_of_4+0x10>
ucomiss %xmm3,%xmm0
jb     1110 <max_of_4+0x10>
ret
ucomiss %xmm2,%xmm1
jb     111d <max_of_4+0x1d>
ucomiss %xmm3,%xmm1
movaps %xmm1,%xmm0
jae    110f <max_of_4+0xf>
movaps %xmm3,%xmm0
cmpless %xmm2,%xmm0
andps  %xmm0,%xmm2
andnps %xmm3,%xmm0
orps   %xmm2,%xmm0
ret

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

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