float data_ComputeBinnedDataAverageArrTime(int *data, int nbins, int fitstart,
                                           int nphotons, float interval) {
  int bin, nphotonsbin;
  float avg;
  for (bin = fitstart, avg = 0.0; bin < nbins; bin++) {
    nphotonsbin = data[bin];
    if (nphotonsbin)
      avg += (0.5f + (float)bin) * nphotonsbin;
  }
  return (interval * avg / (float)nbins / (float)nphotons);
}


x86 assembly (clang, -O0):
<data_ComputeBinnedDataAverageArrTime>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
movss  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x1c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1183 <data_ComputeBinnedDataAverageArrTime+0x83>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     1170 <data_ComputeBinnedDataAverageArrTime+0x70>
cvtsi2ssl -0x1c(%rbp),%xmm1
movss  0xeab(%rip),%xmm0
addss  %xmm1,%xmm0
cvtsi2ssl -0x20(%rbp),%xmm2
movss  -0x24(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    1175 <data_ComputeBinnedDataAverageArrTime+0x75>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1124 <data_ComputeBinnedDataAverageArrTime+0x24>
movss  -0x18(%rbp),%xmm0
mulss  -0x24(%rbp),%xmm0
cvtsi2ssl -0xc(%rbp),%xmm1
divss  %xmm1,%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<data_ComputeBinnedDataAverageArrTime>:
xorps  %xmm1,%xmm1
cmp    %esi,%edx
jge    115f <data_ComputeBinnedDataAverageArrTime+0x5f>
movslq %edx,%rax
movslq %esi,%r8
mov    %esi,%r10d
sub    %edx,%r10d
mov    %rax,%r9
not    %r9
test   $0x1,%r10b
jne    1129 <data_ComputeBinnedDataAverageArrTime+0x29>
xorps  %xmm1,%xmm1
add    %r8,%r9
je     115f <data_ComputeBinnedDataAverageArrTime+0x5f>
jmp    117d <data_ComputeBinnedDataAverageArrTime+0x7d>
mov    (%rdi,%rax,4),%r10d
test   %r10d,%r10d
je     1153 <data_ComputeBinnedDataAverageArrTime+0x53>
xorps  %xmm1,%xmm1
cvtsi2ss %edx,%xmm1
addss  0xebf(%rip),%xmm1
cvtsi2ss %r10d,%xmm2
mulss  %xmm1,%xmm2
xorps  %xmm1,%xmm1
addss  %xmm2,%xmm1
jmp    1156 <data_ComputeBinnedDataAverageArrTime+0x56>
xorps  %xmm1,%xmm1
add    $0x1,%rax
add    %r8,%r9
jne    117d <data_ComputeBinnedDataAverageArrTime+0x7d>
mulss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %esi,%xmm0
divss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
divss  %xmm0,%xmm1
movaps %xmm1,%xmm0
ret
movss  0xe7b(%rip),%xmm2
jmp    1199 <data_ComputeBinnedDataAverageArrTime+0x99>
nopw   0x0(%rax,%rax,1)
add    $0x2,%rax
cmp    %rax,%r8
je     115f <data_ComputeBinnedDataAverageArrTime+0x5f>
mov    (%rdi,%rax,4),%edx
test   %edx,%edx
je     11ba <data_ComputeBinnedDataAverageArrTime+0xba>
xorps  %xmm3,%xmm3
cvtsi2ss %eax,%xmm3
xorps  %xmm4,%xmm4
cvtsi2ss %edx,%xmm4
addss  %xmm2,%xmm3
mulss  %xmm3,%xmm4
addss  %xmm4,%xmm1
mov    0x4(%rdi,%rax,4),%r9d
test   %r9d,%r9d
je     1190 <data_ComputeBinnedDataAverageArrTime+0x90>
lea    0x1(%rax),%edx
xorps  %xmm3,%xmm3
cvtsi2ss %edx,%xmm3
xorps  %xmm4,%xmm4
cvtsi2ss %r9d,%xmm4
addss  %xmm2,%xmm3
mulss  %xmm3,%xmm4
addss  %xmm4,%xmm1
jmp    1190 <data_ComputeBinnedDataAverageArrTime+0x90>

LLVM IR (-O0):
define float @data_ComputeBinnedDataAverageArrTime(i32* %0, i32 %1, i32 %2, i32 %3, float %4) {
%6 = alloca i32*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca float
%11 = alloca i32
%12 = alloca i32
%13 = alloca float
store i32* %0, i32** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store float %4, float* %10
%14 = load i32, i32* %8
store i32 %14, i32* %11
store float 0.000000e+00, float* %13
br label %15
15: ; preds = %36, %5
%16 = load i32, i32* %11
%17 = load i32, i32* %7
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %39
19: ; preds = %15
%20 = load i32*, i32** %6
%21 = load i32, i32* %11
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i32, i32* %20, i64 %22
%24 = load i32, i32* %23
store i32 %24, i32* %12
%25 = load i32, i32* %12
%26 = icmp ne i32 %25, 0
br i1 %26, label %27, label %35
27: ; preds = %19
%28 = load i32, i32* %11
%29 = sitofp i32 %28 to float
%30 = fadd float 5.000000e-01, %29
%31 = load i32, i32* %12
%32 = sitofp i32 %31 to float
%33 = load float, float* %13
%34 = call float @llvm.fmuladd.f32(float %30, float %32, float %33)
store float %34, float* %13
br label %35
35: ; preds = %27, %19
br label %36
36: ; preds = %35
%37 = load i32, i32* %11
%38 = add nsw i32 %37, 1
store i32 %38, i32* %11
br label %15
39: ; preds = %15
%40 = load float, float* %10
%41 = load float, float* %13
%42 = fmul float %40, %41
%43 = load i32, i32* %7
%44 = sitofp i32 %43 to float
%45 = fdiv float %42, %44
%46 = load i32, i32* %9
%47 = sitofp i32 %46 to float
%48 = fdiv float %45, %47
ret float %48
}

LLVM IR (-O2):
define float @data_ComputeBinnedDataAverageArrTime(i32* nocapture %0, i32 %1, i32 %2, i32 %3, float %4) {
%6 = icmp slt i32 %2, %1
br i1 %6, label %7, label %60
7: ; preds = %5
%8 = sext i32 %2 to i64
%9 = sext i32 %1 to i64
%10 = sub nsw i64 %9, %8
%11 = xor i64 %8, -1
%12 = and i64 %10, 1
%13 = icmp eq i64 %12, 0
br i1 %13, label %26, label %14
14: ; preds = %7
%15 = getelementptr inbounds i32, i32* %0, i64 %8
%16 = load i32, i32* %15
%17 = icmp eq i32 %16, 0
br i1 %17, label %23, label %18
18: ; preds = %14
%19 = sitofp i32 %2 to float
%20 = fadd float %19, 5.000000e-01
%21 = sitofp i32 %16 to float
%22 = tail call float @llvm.fmuladd.f32(float %20, float %21, float 0.000000e+00)
br label %23
23: ; preds = %18, %14
%24 = phi float [ %22, %18 ], [ 0.000000e+00, %14 ]
%25 = add nsw i64 %8, 1
br label %26
26: ; preds = %23, %7
%27 = phi float [ undef, %7 ], [ %24, %23 ]
%28 = phi i64 [ %8, %7 ], [ %25, %23 ]
%29 = phi float [ 0.000000e+00, %7 ], [ %24, %23 ]
%30 = sub nsw i64 0, %9
%31 = icmp eq i64 %11, %30
br i1 %31, label %60, label %32
32: ; preds = %26, %56
%33 = phi i64 [ %58, %56 ], [ %28, %26 ]
%34 = phi float [ %57, %56 ], [ %29, %26 ]
%35 = getelementptr inbounds i32, i32* %0, i64 %33
%36 = load i32, i32* %35
%37 = icmp eq i32 %36, 0
br i1 %37, label %44, label %38
38: ; preds = %32
%39 = trunc i64 %33 to i32
%40 = sitofp i32 %39 to float
%41 = fadd float %40, 5.000000e-01
%42 = sitofp i32 %36 to float
%43 = tail call float @llvm.fmuladd.f32(float %41, float %42, float %34)
br label %44
44: ; preds = %32, %38
%45 = phi float [ %43, %38 ], [ %34, %32 ]
%46 = add nsw i64 %33, 1
%47 = getelementptr inbounds i32, i32* %0, i64 %46
%48 = load i32, i32* %47
%49 = icmp eq i32 %48, 0
br i1 %49, label %56, label %50
50: ; preds = %44
%51 = trunc i64 %46 to i32
%52 = sitofp i32 %51 to float
%53 = fadd float %52, 5.000000e-01
%54 = sitofp i32 %48 to float
%55 = tail call float @llvm.fmuladd.f32(float %53, float %54, float %45)
br label %56
56: ; preds = %50, %44
%57 = phi float [ %55, %50 ], [ %45, %44 ]
%58 = add nsw i64 %33, 2
%59 = icmp eq i64 %58, %9
br i1 %59, label %60, label %32
60: ; preds = %26, %56, %5
%61 = phi float [ 0.000000e+00, %5 ], [ %27, %26 ], [ %57, %56 ]
%62 = fmul float %61, %4
%63 = sitofp i32 %1 to float
%64 = fdiv float %62, %63
%65 = sitofp i32 %3 to float
%66 = fdiv float %64, %65
ret float %66
}