double find_max(double number1, double number2, double number3, double number4,
                double number5) {
  double max_number = number1;
  if ((number2 >= number1) && (number2 >= number3) && (number2 >= number4) &&
      (number2 >= number5)) {
    max_number = number2;
  } else if ((number3 >= number1) && (number3 >= number2) &&
             (number3 >= number4) && (number3 >= number5)) {
    max_number = number3;
  } else if ((number4 >= number1) && (number4 >= number2) &&
             (number4 >= number3) && (number4 >= number5)) {
    max_number = number4;
  } else if ((number5 >= number1) && (number5 >= number2) &&
             (number5 >= number3) && (number5 >= number4)) {
    max_number = number5;
  }
  return max_number;
}


x86 assembly (clang, -O0):
<find_max>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x10(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jb     1176 <find_max+0x76>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     1176 <find_max+0x76>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jb     1176 <find_max+0x76>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x28(%rbp),%xmm0
jb     1176 <find_max+0x76>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    126d <find_max+0x16d>
movsd  -0x18(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jb     11c5 <find_max+0xc5>
movsd  -0x18(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jb     11c5 <find_max+0xc5>
movsd  -0x18(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jb     11c5 <find_max+0xc5>
movsd  -0x18(%rbp),%xmm0
ucomisd -0x28(%rbp),%xmm0
jb     11c5 <find_max+0xc5>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1268 <find_max+0x168>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jb     1214 <find_max+0x114>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jb     1214 <find_max+0x114>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     1214 <find_max+0x114>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x28(%rbp),%xmm0
jb     1214 <find_max+0x114>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1263 <find_max+0x163>
movsd  -0x28(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jb     125e <find_max+0x15e>
movsd  -0x28(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jb     125e <find_max+0x15e>
movsd  -0x28(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     125e <find_max+0x15e>
movsd  -0x28(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jb     125e <find_max+0x15e>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1263 <find_max+0x163>
jmp    1268 <find_max+0x168>
jmp    126d <find_max+0x16d>
movsd  -0x30(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<find_max>:
ucomisd %xmm0,%xmm1
jb     111d <find_max+0x1d>
ucomisd %xmm2,%xmm1
jb     111d <find_max+0x1d>
ucomisd %xmm3,%xmm1
jb     111d <find_max+0x1d>
ucomisd %xmm4,%xmm1
jb     111d <find_max+0x1d>
movapd %xmm1,%xmm0
ret
ucomisd %xmm0,%xmm2
jb     113a <find_max+0x3a>
ucomisd %xmm1,%xmm2
jb     113a <find_max+0x3a>
ucomisd %xmm3,%xmm2
jb     113a <find_max+0x3a>
ucomisd %xmm4,%xmm2
jb     113a <find_max+0x3a>
movapd %xmm2,%xmm0
ret
ucomisd %xmm4,%xmm3
jb     1152 <find_max+0x52>
ucomisd %xmm2,%xmm3
jb     1152 <find_max+0x52>
ucomisd %xmm0,%xmm3
jb     1152 <find_max+0x52>
ucomisd %xmm1,%xmm3
jae    11aa <find_max+0xaa>
cmpnlesd %xmm4,%xmm1
movapd %xmm1,%xmm5
andpd  %xmm0,%xmm5
andnpd %xmm4,%xmm1
orpd   %xmm5,%xmm1
movapd %xmm0,%xmm5
cmpnlesd %xmm4,%xmm5
movapd %xmm5,%xmm6
andnpd %xmm1,%xmm6
andpd  %xmm0,%xmm5
orpd   %xmm6,%xmm5
cmpnlesd %xmm4,%xmm2
movapd %xmm2,%xmm1
andnpd %xmm5,%xmm1
andpd  %xmm0,%xmm2
orpd   %xmm1,%xmm2
cmpnlesd %xmm4,%xmm3
movapd %xmm3,%xmm1
andnpd %xmm2,%xmm1
andpd  %xmm0,%xmm3
orpd   %xmm1,%xmm3
movapd %xmm3,%xmm1
movapd %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @find_max(double %0, double %1, double %2, double %3, double %4) {
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
store double %0, double* %6
store double %1, double* %7
store double %2, double* %8
store double %3, double* %9
store double %4, double* %10
%12 = load double, double* %6
store double %12, double* %11
%13 = load double, double* %7
%14 = load double, double* %6
%15 = fcmp oge double %13, %14
br i1 %15, label %16, label %30
16: ; preds = %5
%17 = load double, double* %7
%18 = load double, double* %8
%19 = fcmp oge double %17, %18
br i1 %19, label %20, label %30
20: ; preds = %16
%21 = load double, double* %7
%22 = load double, double* %9
%23 = fcmp oge double %21, %22
br i1 %23, label %24, label %30
24: ; preds = %20
%25 = load double, double* %7
%26 = load double, double* %10
%27 = fcmp oge double %25, %26
br i1 %27, label %28, label %30
28: ; preds = %24
%29 = load double, double* %7
store double %29, double* %11
br label %87
30: ; preds = %24, %20, %16, %5
%31 = load double, double* %8
%32 = load double, double* %6
%33 = fcmp oge double %31, %32
br i1 %33, label %34, label %48
34: ; preds = %30
%35 = load double, double* %8
%36 = load double, double* %7
%37 = fcmp oge double %35, %36
br i1 %37, label %38, label %48
38: ; preds = %34
%39 = load double, double* %8
%40 = load double, double* %9
%41 = fcmp oge double %39, %40
br i1 %41, label %42, label %48
42: ; preds = %38
%43 = load double, double* %8
%44 = load double, double* %10
%45 = fcmp oge double %43, %44
br i1 %45, label %46, label %48
46: ; preds = %42
%47 = load double, double* %8
store double %47, double* %11
br label %86
48: ; preds = %42, %38, %34, %30
%49 = load double, double* %9
%50 = load double, double* %6
%51 = fcmp oge double %49, %50
br i1 %51, label %52, label %66
52: ; preds = %48
%53 = load double, double* %9
%54 = load double, double* %7
%55 = fcmp oge double %53, %54
br i1 %55, label %56, label %66
56: ; preds = %52
%57 = load double, double* %9
%58 = load double, double* %8
%59 = fcmp oge double %57, %58
br i1 %59, label %60, label %66
60: ; preds = %56
%61 = load double, double* %9
%62 = load double, double* %10
%63 = fcmp oge double %61, %62
br i1 %63, label %64, label %66
64: ; preds = %60
%65 = load double, double* %9
store double %65, double* %11
br label %85
66: ; preds = %60, %56, %52, %48
%67 = load double, double* %10
%68 = load double, double* %6
%69 = fcmp oge double %67, %68
br i1 %69, label %70, label %84
70: ; preds = %66
%71 = load double, double* %10
%72 = load double, double* %7
%73 = fcmp oge double %71, %72
br i1 %73, label %74, label %84
74: ; preds = %70
%75 = load double, double* %10
%76 = load double, double* %8
%77 = fcmp oge double %75, %76
br i1 %77, label %78, label %84
78: ; preds = %74
%79 = load double, double* %10
%80 = load double, double* %9
%81 = fcmp oge double %79, %80
br i1 %81, label %82, label %84
82: ; preds = %78
%83 = load double, double* %10
store double %83, double* %11
br label %84
84: ; preds = %82, %78, %74, %70, %66
br label %85
85: ; preds = %84, %64
br label %86
86: ; preds = %85, %46
br label %87
87: ; preds = %86, %28
%88 = load double, double* %11
ret double %88
}

LLVM IR (-O2):
define double @find_max(double %0, double %1, double %2, double %3, double %4) {
%6 = fcmp ult double %1, %0
%7 = fcmp ult double %1, %2
%8 = or i1 %6, %7
%9 = fcmp ult double %1, %3
%10 = or i1 %8, %9
%11 = fcmp ult double %1, %4
%12 = or i1 %10, %11
br i1 %12, label %13, label %38
13: ; preds = %5
%14 = fcmp ult double %2, %0
%15 = fcmp ult double %2, %1
%16 = or i1 %14, %15
%17 = fcmp ult double %2, %3
%18 = or i1 %16, %17
%19 = fcmp ult double %2, %4
%20 = or i1 %18, %19
br i1 %20, label %21, label %38
21: ; preds = %13
%22 = fcmp ult double %3, %0
%23 = fcmp ult double %3, %1
%24 = or i1 %22, %23
%25 = fcmp ult double %3, %2
%26 = or i1 %25, %24
%27 = fcmp ult double %3, %4
%28 = or i1 %27, %26
br i1 %28, label %29, label %38
29: ; preds = %21
%30 = fcmp ult double %4, %0
%31 = fcmp ult double %4, %1
%32 = or i1 %30, %31
%33 = fcmp ult double %4, %2
%34 = or i1 %33, %32
%35 = fcmp ult double %4, %3
%36 = or i1 %35, %34
%37 = select i1 %36, double %0, double %4
br label %38
38: ; preds = %29, %21, %13, %5
%39 = phi double [ %1, %5 ], [ %2, %13 ], [ %3, %21 ], [ %37, %29 ]
ret double %39
}