long long int get_avg(long long int *samples) {
  int i, count;
  long long int res;
  res = 0;
  count = 0;
  for (i = 0; i < 16; i++) {
    if (samples[i] >= 0) {
      res += samples[i];
      count += 1;
    }
  }
  if (count == 0) {
    return -1;
  }
  return res / count;
}


x86 assembly (clang, -O0):
<get_avg>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movq   $0x0,-0x20(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x10,-0x14(%rbp)
jge    116b <get_avg+0x6b>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
jl     1158 <get_avg+0x58>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    115d <get_avg+0x5d>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111e <get_avg+0x1e>
cmpl   $0x0,-0x18(%rbp)
jne    1182 <get_avg+0x82>
movq   $0xffffffffffffffff,-0x8(%rbp)
ff
jmp    1193 <get_avg+0x93>
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
cqto
idiv   %rcx
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_avg>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
movdqu 0x60(%rdi),%xmm3
movdqu 0x70(%rdi),%xmm7
movdqu (%rdi),%xmm8
movdqu 0x10(%rdi),%xmm9
movdqu 0x20(%rdi),%xmm10
movdqu 0x30(%rdi),%xmm11
movdqu 0x40(%rdi),%xmm12
movdqu 0x50(%rdi),%xmm0
movdqa %xmm0,%xmm5
psrlq  $0x3f,%xmm5
movdqa %xmm12,%xmm4
psrlq  $0x3f,%xmm4
packuswb %xmm5,%xmm4
movdqa %xmm9,%xmm5
psrlq  $0x3f,%xmm5
movdqa %xmm8,%xmm2
psrlq  $0x3f,%xmm2
packuswb %xmm5,%xmm2
movdqa %xmm7,%xmm5
psrlq  $0x3f,%xmm5
movdqa %xmm3,%xmm6
psrlq  $0x3f,%xmm6
packuswb %xmm5,%xmm6
movdqa %xmm11,%xmm5
psrlq  $0x3f,%xmm5
movdqa %xmm10,%xmm1
psrlq  $0x3f,%xmm1
packuswb %xmm5,%xmm1
movdqa 0xe65(%rip),%xmm5
pxor   %xmm5,%xmm4
pxor   %xmm5,%xmm2
paddd  %xmm4,%xmm2
pxor   %xmm5,%xmm6
pxor   %xmm5,%xmm1
paddd  %xmm6,%xmm1
paddd  %xmm2,%xmm1
pshufd $0xee,%xmm1,%xmm2
paddd  %xmm1,%xmm2
pshufd $0x55,%xmm2,%xmm1
paddd  %xmm2,%xmm1
movd   %xmm1,%eax
test   %eax,%eax
je     1317 <get_avg+0x217>
pshufd $0xee,%xmm7,%xmm1
movq   %xmm1,%rcx
mov    %eax,-0x14(%rsp)
xor    %eax,%eax
test   %rcx,%rcx
cmovs  %rax,%rcx
mov    %rcx,-0x8(%rsp)
movq   %xmm7,%rcx
test   %rcx,%rcx
cmovs  %rax,%rcx
mov    %rcx,-0x10(%rsp)
pshufd $0xee,%xmm3,%xmm1
movq   %xmm1,%r11
test   %r11,%r11
cmovs  %rax,%r11
movq   %xmm3,%r14
test   %r14,%r14
cmovs  %rax,%r14
pshufd $0xee,%xmm0,%xmm1
movq   %xmm1,%r15
test   %r15,%r15
cmovs  %rax,%r15
movq   %xmm0,%r12
test   %r12,%r12
cmovs  %rax,%r12
pshufd $0xee,%xmm12,%xmm0
movq   %xmm0,%r13
test   %r13,%r13
cmovs  %rax,%r13
movq   %xmm12,%rbx
test   %rbx,%rbx
cmovs  %rax,%rbx
pshufd $0xee,%xmm11,%xmm0
movq   %xmm0,%r10
test   %r10,%r10
cmovs  %rax,%r10
movq   %xmm11,%r9
test   %r9,%r9
cmovs  %rax,%r9
pshufd $0xee,%xmm10,%xmm0
movq   %xmm0,%rsi
test   %rsi,%rsi
cmovs  %rax,%rsi
movq   %xmm10,%rdi
test   %rdi,%rdi
cmovs  %rax,%rdi
pshufd $0xee,%xmm9,%xmm0
movq   %xmm0,%rbp
test   %rbp,%rbp
cmovs  %rax,%rbp
movq   %xmm9,%r8
test   %r8,%r8
cmovs  %rax,%r8
pshufd $0xee,%xmm8,%xmm0
movq   %xmm0,%rcx
test   %rcx,%rcx
cmovs  %rax,%rcx
movq   %xmm8,%rdx
test   %rdx,%rdx
cmovns %rdx,%rax
add    %rcx,%rax
add    %r8,%rax
add    %rbp,%rax
add    %rdi,%rax
add    %rsi,%rax
add    %r9,%rax
add    %r10,%rax
add    %rbx,%rax
add    %r13,%rax
add    %r12,%rax
add    %r15,%rax
add    %r14,%rax
add    %r11,%rax
add    -0x10(%rsp),%rax
add    -0x8(%rsp),%rax
mov    %rax,%rcx
shr    $0x20,%rcx
mov    -0x14(%rsp),%ecx
je     1320 <get_avg+0x220>
xor    %edx,%edx
div    %rcx
jmp    1324 <get_avg+0x224>
mov    $0xffffffffffffffff,%rax
jmp    1324 <get_avg+0x224>
xor    %edx,%edx
div    %ecx
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i64 @get_avg(i64* %0) {
%2 = alloca i64
%3 = alloca i64*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i64
store i64* %0, i64** %3
store i64 0, i64* %6
store i32 0, i32* %5
store i32 0, i32* %4
br label %7
7: ; preds = %28, %1
%8 = load i32, i32* %4
%9 = icmp slt i32 %8, 16
br i1 %9, label %10, label %31
10: ; preds = %7
%11 = load i64*, i64** %3
%12 = load i32, i32* %4
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i64, i64* %11, i64 %13
%15 = load i64, i64* %14
%16 = icmp sge i64 %15, 0
br i1 %16, label %17, label %27
17: ; preds = %10
%18 = load i64*, i64** %3
%19 = load i32, i32* %4
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i64, i64* %18, i64 %20
%22 = load i64, i64* %21
%23 = load i64, i64* %6
%24 = add nsw i64 %23, %22
store i64 %24, i64* %6
%25 = load i32, i32* %5
%26 = add nsw i32 %25, 1
store i32 %26, i32* %5
br label %27
27: ; preds = %17, %10
br label %28
28: ; preds = %27
%29 = load i32, i32* %4
%30 = add nsw i32 %29, 1
store i32 %30, i32* %4
br label %7
31: ; preds = %7
%32 = load i32, i32* %5
%33 = icmp eq i32 %32, 0
br i1 %33, label %34, label %35
34: ; preds = %31
store i64 -1, i64* %2
br label %40
35: ; preds = %31
%36 = load i64, i64* %6
%37 = load i32, i32* %5
%38 = sext i32 %37 to i64
%39 = sdiv i64 %36, %38
store i64 %39, i64* %2
br label %40
40: ; preds = %35, %34
%41 = load i64, i64* %2
ret i64 %41
}

LLVM IR (-O2):
define i64 @get_avg(i64* nocapture %0) {
%2 = bitcast i64* %0 to <16 x i64>*
%3 = load <16 x i64>, <16 x i64>* %2
%4 = lshr <16 x i64> %3, <i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63>
%5 = trunc <16 x i64> %4 to <16 x i32>
%6 = xor <16 x i32> %5, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
%7 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %6)
%8 = icmp eq i32 %7, 0
br i1 %8, label %75, label %9
9: ; preds = %1
%10 = extractelement <16 x i64> %3, i64 15
%11 = icmp sgt i64 %10, 0
%12 = select i1 %11, i64 %10, i64 0
%13 = extractelement <16 x i64> %3, i64 14
%14 = icmp sgt i64 %13, 0
%15 = select i1 %14, i64 %13, i64 0
%16 = extractelement <16 x i64> %3, i64 13
%17 = icmp sgt i64 %16, 0
%18 = select i1 %17, i64 %16, i64 0
%19 = extractelement <16 x i64> %3, i64 12
%20 = icmp sgt i64 %19, 0
%21 = select i1 %20, i64 %19, i64 0
%22 = extractelement <16 x i64> %3, i64 11
%23 = icmp sgt i64 %22, 0
%24 = select i1 %23, i64 %22, i64 0
%25 = extractelement <16 x i64> %3, i64 10
%26 = icmp sgt i64 %25, 0
%27 = select i1 %26, i64 %25, i64 0
%28 = extractelement <16 x i64> %3, i64 9
%29 = icmp sgt i64 %28, 0
%30 = select i1 %29, i64 %28, i64 0
%31 = extractelement <16 x i64> %3, i64 8
%32 = icmp sgt i64 %31, 0
%33 = select i1 %32, i64 %31, i64 0
%34 = extractelement <16 x i64> %3, i64 7
%35 = icmp sgt i64 %34, 0
%36 = select i1 %35, i64 %34, i64 0
%37 = extractelement <16 x i64> %3, i64 6
%38 = icmp sgt i64 %37, 0
%39 = select i1 %38, i64 %37, i64 0
%40 = extractelement <16 x i64> %3, i64 5
%41 = icmp sgt i64 %40, 0
%42 = select i1 %41, i64 %40, i64 0
%43 = extractelement <16 x i64> %3, i64 4
%44 = icmp sgt i64 %43, 0
%45 = select i1 %44, i64 %43, i64 0
%46 = extractelement <16 x i64> %3, i64 3
%47 = icmp sgt i64 %46, 0
%48 = select i1 %47, i64 %46, i64 0
%49 = extractelement <16 x i64> %3, i64 2
%50 = icmp sgt i64 %49, 0
%51 = select i1 %50, i64 %49, i64 0
%52 = extractelement <16 x i64> %3, i64 1
%53 = icmp sgt i64 %52, 0
%54 = select i1 %53, i64 %52, i64 0
%55 = extractelement <16 x i64> %3, i64 0
%56 = icmp sgt i64 %55, 0
%57 = select i1 %56, i64 %55, i64 0
%58 = add nuw nsw i64 %54, %57
%59 = add nuw nsw i64 %51, %58
%60 = add nuw nsw i64 %48, %59
%61 = add nuw nsw i64 %45, %60
%62 = add nuw nsw i64 %42, %61
%63 = add nuw nsw i64 %39, %62
%64 = add nuw nsw i64 %36, %63
%65 = add nuw nsw i64 %33, %64
%66 = add nuw nsw i64 %30, %65
%67 = add nuw nsw i64 %27, %66
%68 = add nuw nsw i64 %24, %67
%69 = add nuw nsw i64 %21, %68
%70 = add nuw nsw i64 %18, %69
%71 = add nuw nsw i64 %15, %70
%72 = add nuw nsw i64 %12, %71
%73 = zext i32 %7 to i64
%74 = udiv i64 %72, %73
br label %75
75: ; preds = %1, %9
%76 = phi i64 [ %74, %9 ], [ -1, %1 ]
ret i64 %76
}