float media_lasalle(float nota1, float nota2, float nota3) {
  float media;
  if (nota1 >= nota2 && nota2 >= nota3) {
    media = (nota1 + nota2) / 2;
  } else if (nota1 >= nota2 && nota2 <= nota3) {
    media = (nota1 + nota3) / 2;
  } else {
    media = (nota2 + nota3) / 2;
  }
  return media;
}


x86 assembly (clang, -O0):
<media_lasalle>:
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
jb     1151 <media_lasalle+0x51>
movss  -0x8(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jb     1151 <media_lasalle+0x51>
movss  -0x4(%rbp),%xmm0
addss  -0x8(%rbp),%xmm0
movss  0xebd(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    11b3 <media_lasalle+0xb3>
movss  -0x4(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jb     1193 <media_lasalle+0x93>
movss  -0x8(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     1193 <media_lasalle+0x93>
movss  -0x4(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  0xe7b(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    11ae <media_lasalle+0xae>
movss  -0x8(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  0xe5b(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    11b3 <media_lasalle+0xb3>
movss  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<media_lasalle>:
ucomiss %xmm1,%xmm0
jb     1110 <media_lasalle+0x10>
ucomiss %xmm2,%xmm1
jb     1110 <media_lasalle+0x10>
addss  %xmm0,%xmm1
jmp    1127 <media_lasalle+0x27>
ucomiss %xmm1,%xmm0
jb     1123 <media_lasalle+0x23>
ucomiss %xmm1,%xmm2
jb     1123 <media_lasalle+0x23>
addss  %xmm2,%xmm0
movaps %xmm0,%xmm1
jmp    1127 <media_lasalle+0x27>
addss  %xmm2,%xmm1
mulss  0xed1(%rip),%xmm1
movaps %xmm1,%xmm0
ret

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

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