float average(int n_values, int v1, int v2, int v3, int v4, int v5) {
  float sum = v1;
  if (n_values >= 2)
    sum += v2;
  if (n_values >= 3)
    sum += v3;
  if (n_values >= 4)
    sum += v4;
  if (n_values >= 5)
    sum += v5;
  return sum / n_values;
}


x86 assembly (clang, -O0):
<average>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9d,-0x18(%rbp)
cvtsi2ssl -0x8(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
cmpl   $0x2,-0x4(%rbp)
jl     113b <average+0x3b>
cvtsi2ssl -0xc(%rbp),%xmm0
addss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
cmpl   $0x3,-0x4(%rbp)
jl     1154 <average+0x54>
cvtsi2ssl -0x10(%rbp),%xmm0
addss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
cmpl   $0x4,-0x4(%rbp)
jl     116d <average+0x6d>
cvtsi2ssl -0x14(%rbp),%xmm0
addss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
cmpl   $0x5,-0x4(%rbp)
jl     1186 <average+0x86>
cvtsi2ssl -0x18(%rbp),%xmm0
addss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
cvtsi2ssl -0x4(%rbp),%xmm1
divss  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<average>:
cvtsi2ss %esi,%xmm2
movss  0xef4(%rip),%xmm1
cmp    $0x2,%edi
jge    1116 <average+0x16>
movaps %xmm1,%xmm0
jmp    111a <average+0x1a>
cvtsi2ss %edx,%xmm0
addss  %xmm2,%xmm0
cmp    $0x3,%edi
jge    1128 <average+0x28>
movaps %xmm1,%xmm2
jmp    112f <average+0x2f>
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
addss  %xmm2,%xmm0
cmp    $0x4,%edi
jge    113d <average+0x3d>
movaps %xmm1,%xmm2
jmp    1145 <average+0x45>
xorps  %xmm2,%xmm2
cvtsi2ss %r8d,%xmm2
addss  %xmm2,%xmm0
cmp    $0x5,%edi
jl     1156 <average+0x56>
xorps  %xmm1,%xmm1
cvtsi2ss %r9d,%xmm1
addss  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2ss %edi,%xmm1
divss  %xmm1,%xmm0
ret

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

LLVM IR (-O2):
define float @average(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = sitofp i32 %1 to float
%8 = icmp sgt i32 %0, 1
%9 = sitofp i32 %2 to float
%10 = select i1 %8, float %9, float -0.000000e+00
%11 = fadd float %10, %7
%12 = icmp sgt i32 %0, 2
%13 = sitofp i32 %3 to float
%14 = select i1 %12, float %13, float -0.000000e+00
%15 = fadd float %11, %14
%16 = icmp sgt i32 %0, 3
%17 = sitofp i32 %4 to float
%18 = select i1 %16, float %17, float -0.000000e+00
%19 = fadd float %15, %18
%20 = icmp sgt i32 %0, 4
%21 = sitofp i32 %5 to float
%22 = select i1 %20, float %21, float -0.000000e+00
%23 = fadd float %19, %22
%24 = sitofp i32 %0 to float
%25 = fdiv float %23, %24
ret float %25
}