void mycor2(float *x, float *y, int n, int nbins, float *z, int flag) {
  int i, j;
  int k, count = 0, lag = nbins / 2;
  float sum, avx = 0.0, avy = 0.0;
  if (flag) {
    for (i = 0; i < n; i++) {
      avx += x[i];
      avy += y[i];
    }
    avx = avx / (float)n;
    avy = avy / (float)n;
  }
  for (j = 0; j <= nbins; j++) {
    sum = 0.0;
    count = 0;
    for (i = 0; i < n; i++) {
      k = i + j - lag;
      k = (k + n) % n;
      if ((k >= 0) && (k < n)) {
        count++;
        sum += (x[i] - avx) * (y[k] - avy);
      }
    }
    if (count > 0)
      sum = sum / count;
    z[j] = sum;
  }
}


x86 assembly (clang, -O0):
<mycor2>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x18(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x38(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
cmpl   $0x0,-0x24(%rbp)
je     11be <mycor2+0xbe>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1198 <mycor2+0x98>
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1150 <mycor2+0x50>
movss  -0x40(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x44(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jg     12b1 <mycor2+0x1b1>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1274 <mycor2+0x174>
mov    -0x28(%rbp),%eax
add    -0x2c(%rbp),%eax
sub    -0x38(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
add    -0x14(%rbp),%eax
cltd
idivl  -0x14(%rbp)
mov    %edx,-0x30(%rbp)
cmpl   $0x0,-0x30(%rbp)
jl     1261 <mycor2+0x161>
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1261 <mycor2+0x161>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
subss  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
subss  -0x44(%rbp),%xmm2
movss  -0x3c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
jmp    1266 <mycor2+0x166>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    11e7 <mycor2+0xe7>
cmpl   $0x0,-0x34(%rbp)
jle    1291 <mycor2+0x191>
movss  -0x3c(%rbp),%xmm0
cvtsi2ssl -0x34(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11c5 <mycor2+0xc5>
pop    %rbp
ret

x86 assembly (clang, -O2):
<mycor2>:
push   %rbp
push   %r14
push   %rbx
mov    %edx,%r10d
mov    %edx,%r11d
test   %r9d,%r9d
je     112b <mycor2+0x2b>
test   %r10d,%r10d
jle    113b <mycor2+0x3b>
lea    -0x1(%r11),%rdx
mov    %r11d,%eax
and    $0x3,%eax
cmp    $0x3,%rdx
jae    1143 <mycor2+0x43>
xorps  %xmm0,%xmm0
xor    %edx,%edx
jmp    119f <mycor2+0x9f>
xorps  %xmm0,%xmm0
test   %ecx,%ecx
jns    11e1 <mycor2+0xe1>
jmp    1291 <mycor2+0x191>
xorps  %xmm0,%xmm0
jmp    11ca <mycor2+0xca>
mov    %r11d,%ebp
and    $0xfffffffc,%ebp
xorps  %xmm0,%xmm0
xor    %edx,%edx
xchg   %ax,%ax
movss  (%rsi,%rdx,4),%xmm1
movss  0x4(%rsi,%rdx,4),%xmm2
movss  0x8(%rsi,%rdx,4),%xmm3
movss  0xc(%rsi,%rdx,4),%xmm4
movss  (%rdi,%rdx,4),%xmm5
unpcklps %xmm1,%xmm5
addps  %xmm0,%xmm5
movss  0x4(%rdi,%rdx,4),%xmm0
unpcklps %xmm2,%xmm0
addps  %xmm5,%xmm0
movss  0x8(%rdi,%rdx,4),%xmm1
unpcklps %xmm3,%xmm1
addps  %xmm0,%xmm1
movss  0xc(%rdi,%rdx,4),%xmm0
unpcklps %xmm4,%xmm0
addps  %xmm1,%xmm0
add    $0x4,%rdx
cmp    %rdx,%rbp
jne    1150 <mycor2+0x50>
test   %rax,%rax
je     11ca <mycor2+0xca>
lea    (%rsi,%rdx,4),%rbp
lea    (%rdi,%rdx,4),%rdx
xor    %ebx,%ebx
xchg   %ax,%ax
movss  0x0(%rbp,%rbx,4),%xmm1
movss  (%rdx,%rbx,4),%xmm2
unpcklps %xmm1,%xmm2
addps  %xmm2,%xmm0
add    $0x1,%rbx
cmp    %rbx,%rax
jne    11b0 <mycor2+0xb0>
xorps  %xmm1,%xmm1
cvtsi2ss %r10d,%xmm1
shufps $0x0,%xmm1,%xmm1
divps  %xmm1,%xmm0
test   %ecx,%ecx
js     1291 <mycor2+0x191>
mov    %ecx,%r9d
shr    $0x1f,%r9d
add    %ecx,%r9d
sar    %r9d
neg    %r9d
add    %r10d,%r9d
add    $0x1,%ecx
movaps %xmm0,%xmm1
shufps $0x55,%xmm0,%xmm1
xor    %r14d,%r14d
jmp    1226 <mycor2+0x126>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xorps  %xmm2,%xmm2
movss  %xmm2,(%r8,%r14,4)
add    $0x1,%r14
add    $0x1,%r9
cmp    %rcx,%r14
je     1291 <mycor2+0x191>
test   %r10d,%r10d
jle    1210 <mycor2+0x110>
xor    %ebx,%ebx
xorps  %xmm2,%xmm2
xor    %ebp,%ebp
jmp    1249 <mycor2+0x149>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rbx
cmp    %rbx,%r11
je     1280 <mycor2+0x180>
lea    (%r9,%rbx,1),%eax
cltd
idiv   %r10d
mov    %edx,%eax
or     %r11d,%eax
js     1240 <mycor2+0x140>
add    $0x1,%ebp
movss  (%rdi,%rbx,4),%xmm3
subss  %xmm0,%xmm3
mov    %edx,%eax
movss  (%rsi,%rax,4),%xmm4
subss  %xmm1,%xmm4
mulss  %xmm3,%xmm4
addss  %xmm4,%xmm2
jmp    1240 <mycor2+0x140>
nopl   0x0(%rax)
test   %ebp,%ebp
jle    1213 <mycor2+0x113>
xorps  %xmm3,%xmm3
cvtsi2ss %ebp,%xmm3
divss  %xmm3,%xmm2
jmp    1213 <mycor2+0x113>
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define void @mycor2(float* %0, float* %1, i32 %2, i32 %3, float* %4, i32 %5) {
%7 = alloca float*
%8 = alloca float*
%9 = alloca i32
%10 = alloca i32
%11 = alloca float*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca float
%19 = alloca float
%20 = alloca float
store float* %0, float** %7
store float* %1, float** %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store float* %4, float** %11
store i32 %5, i32* %12
store i32 0, i32* %16
%21 = load i32, i32* %10
%22 = sdiv i32 %21, 2
store i32 %22, i32* %17
store float 0.000000e+00, float* %19
store float 0.000000e+00, float* %20
%23 = load i32, i32* %12
%24 = icmp ne i32 %23, 0
br i1 %24, label %25, label %57
25: ; preds = %6
store i32 0, i32* %13
br label %26
26: ; preds = %45, %25
%27 = load i32, i32* %13
%28 = load i32, i32* %9
%29 = icmp slt i32 %27, %28
br i1 %29, label %30, label %48
30: ; preds = %26
%31 = load float*, float** %7
%32 = load i32, i32* %13
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds float, float* %31, i64 %33
%35 = load float, float* %34
%36 = load float, float* %19
%37 = fadd float %36, %35
store float %37, float* %19
%38 = load float*, float** %8
%39 = load i32, i32* %13
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds float, float* %38, i64 %40
%42 = load float, float* %41
%43 = load float, float* %20
%44 = fadd float %43, %42
store float %44, float* %20
br label %45
45: ; preds = %30
%46 = load i32, i32* %13
%47 = add nsw i32 %46, 1
store i32 %47, i32* %13
br label %26
48: ; preds = %26
%49 = load float, float* %19
%50 = load i32, i32* %9
%51 = sitofp i32 %50 to float
%52 = fdiv float %49, %51
store float %52, float* %19
%53 = load float, float* %20
%54 = load i32, i32* %9
%55 = sitofp i32 %54 to float
%56 = fdiv float %53, %55
store float %56, float* %20
br label %57
57: ; preds = %48, %6
store i32 0, i32* %14
br label %58
58: ; preds = %121, %57
%59 = load i32, i32* %14
%60 = load i32, i32* %10
%61 = icmp sle i32 %59, %60
br i1 %61, label %62, label %124
62: ; preds = %58
store float 0.000000e+00, float* %18
store i32 0, i32* %16
store i32 0, i32* %13
br label %63
63: ; preds = %104, %62
%64 = load i32, i32* %13
%65 = load i32, i32* %9
%66 = icmp slt i32 %64, %65
br i1 %66, label %67, label %107
67: ; preds = %63
%68 = load i32, i32* %13
%69 = load i32, i32* %14
%70 = add nsw i32 %68, %69
%71 = load i32, i32* %17
%72 = sub nsw i32 %70, %71
store i32 %72, i32* %15
%73 = load i32, i32* %15
%74 = load i32, i32* %9
%75 = add nsw i32 %73, %74
%76 = load i32, i32* %9
%77 = srem i32 %75, %76
store i32 %77, i32* %15
%78 = load i32, i32* %15
%79 = icmp sge i32 %78, 0
br i1 %79, label %80, label %103
80: ; preds = %67
%81 = load i32, i32* %15
%82 = load i32, i32* %9
%83 = icmp slt i32 %81, %82
br i1 %83, label %84, label %103
84: ; preds = %80
%85 = load i32, i32* %16
%86 = add nsw i32 %85, 1
store i32 %86, i32* %16
%87 = load float*, float** %7
%88 = load i32, i32* %13
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds float, float* %87, i64 %89
%91 = load float, float* %90
%92 = load float, float* %19
%93 = fsub float %91, %92
%94 = load float*, float** %8
%95 = load i32, i32* %15
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds float, float* %94, i64 %96
%98 = load float, float* %97
%99 = load float, float* %20
%100 = fsub float %98, %99
%101 = load float, float* %18
%102 = call float @llvm.fmuladd.f32(float %93, float %100, float %101)
store float %102, float* %18
br label %103
103: ; preds = %84, %80, %67
br label %104
104: ; preds = %103
%105 = load i32, i32* %13
%106 = add nsw i32 %105, 1
store i32 %106, i32* %13
br label %63
107: ; preds = %63
%108 = load i32, i32* %16
%109 = icmp sgt i32 %108, 0
br i1 %109, label %110, label %115
110: ; preds = %107
%111 = load float, float* %18
%112 = load i32, i32* %16
%113 = sitofp i32 %112 to float
%114 = fdiv float %111, %113
store float %114, float* %18
br label %115
115: ; preds = %110, %107
%116 = load float, float* %18
%117 = load float*, float** %11
%118 = load i32, i32* %14
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds float, float* %117, i64 %119
store float %116, float* %120
br label %121
121: ; preds = %115
%122 = load i32, i32* %14
%123 = add nsw i32 %122, 1
store i32 %123, i32* %14
br label %58
124: ; preds = %58
ret void
}

LLVM IR (-O2):
define void @mycor2(float* nocapture %0, float* nocapture %1, i32 %2, i32 %3, float* nocapture writeonly %4, i32 %5) {
%7 = sdiv i32 %3, -2
%8 = icmp eq i32 %5, 0
br i1 %8, label %81, label %9
9: ; preds = %6
%10 = icmp sgt i32 %2, 0
br i1 %10, label %11, label %75
11: ; preds = %9
%12 = zext i32 %2 to i64
%13 = add nsw i64 %12, -1
%14 = and i64 %12, 3
%15 = icmp ult i64 %13, 3
br i1 %15, label %56, label %16
16: ; preds = %11
%17 = and i64 %12, 4294967292
br label %18
18: ; preds = %18, %16
%19 = phi i64 [ 0, %16 ], [ %53, %18 ]
%20 = phi <2 x float> [ zeroinitializer, %16 ], [ %52, %18 ]
%21 = phi i64 [ 0, %16 ], [ %54, %18 ]
%22 = getelementptr inbounds float, float* %0, i64 %19
%23 = load float, float* %22
%24 = getelementptr inbounds float, float* %1, i64 %19
%25 = load float, float* %24
%26 = insertelement <2 x float> poison, float %23, i64 0
%27 = insertelement <2 x float> %26, float %25, i64 1
%28 = fadd <2 x float> %20, %27
%29 = or i64 %19, 1
%30 = getelementptr inbounds float, float* %0, i64 %29
%31 = load float, float* %30
%32 = getelementptr inbounds float, float* %1, i64 %29
%33 = load float, float* %32
%34 = insertelement <2 x float> poison, float %31, i64 0
%35 = insertelement <2 x float> %34, float %33, i64 1
%36 = fadd <2 x float> %28, %35
%37 = or i64 %19, 2
%38 = getelementptr inbounds float, float* %0, i64 %37
%39 = load float, float* %38
%40 = getelementptr inbounds float, float* %1, i64 %37
%41 = load float, float* %40
%42 = insertelement <2 x float> poison, float %39, i64 0
%43 = insertelement <2 x float> %42, float %41, i64 1
%44 = fadd <2 x float> %36, %43
%45 = or i64 %19, 3
%46 = getelementptr inbounds float, float* %0, i64 %45
%47 = load float, float* %46
%48 = getelementptr inbounds float, float* %1, i64 %45
%49 = load float, float* %48
%50 = insertelement <2 x float> poison, float %47, i64 0
%51 = insertelement <2 x float> %50, float %49, i64 1
%52 = fadd <2 x float> %44, %51
%53 = add nuw nsw i64 %19, 4
%54 = add i64 %21, 4
%55 = icmp eq i64 %54, %17
br i1 %55, label %56, label %18
56: ; preds = %18, %11
%57 = phi <2 x float> [ undef, %11 ], [ %52, %18 ]
%58 = phi i64 [ 0, %11 ], [ %53, %18 ]
%59 = phi <2 x float> [ zeroinitializer, %11 ], [ %52, %18 ]
%60 = icmp eq i64 %14, 0
br i1 %60, label %75, label %61
61: ; preds = %56, %61
%62 = phi i64 [ %72, %61 ], [ %58, %56 ]
%63 = phi <2 x float> [ %71, %61 ], [ %59, %56 ]
%64 = phi i64 [ %73, %61 ], [ 0, %56 ]
%65 = getelementptr inbounds float, float* %0, i64 %62
%66 = load float, float* %65
%67 = getelementptr inbounds float, float* %1, i64 %62
%68 = load float, float* %67
%69 = insertelement <2 x float> poison, float %66, i64 0
%70 = insertelement <2 x float> %69, float %68, i64 1
%71 = fadd <2 x float> %63, %70
%72 = add nuw nsw i64 %62, 1
%73 = add i64 %64, 1
%74 = icmp eq i64 %73, %14
br i1 %74, label %75, label %61
75: ; preds = %56, %61, %9
%76 = phi <2 x float> [ zeroinitializer, %9 ], [ %57, %56 ], [ %71, %61 ]
%77 = sitofp i32 %2 to float
%78 = insertelement <2 x float> poison, float %77, i64 0
%79 = shufflevector <2 x float> %78, <2 x float> poison, <2 x i32> zeroinitializer
%80 = fdiv <2 x float> %76, %79
br label %81
81: ; preds = %75, %6
%82 = phi <2 x float> [ %80, %75 ], [ zeroinitializer, %6 ]
%83 = icmp slt i32 %3, 0
br i1 %83, label %131, label %84
84: ; preds = %81
%85 = icmp sgt i32 %2, 0
%86 = add i32 %7, %2
%87 = add nuw i32 %3, 1
%88 = zext i32 %87 to i64
%89 = zext i32 %2 to i64
%90 = extractelement <2 x float> %82, i64 0
%91 = extractelement <2 x float> %82, i64 1
br label %92
92: ; preds = %84, %126
%93 = phi i64 [ 0, %84 ], [ %129, %126 ]
br i1 %85, label %94, label %126
94: ; preds = %92
%95 = trunc i64 %93 to i32
%96 = add i32 %86, %95
br label %97
97: ; preds = %94, %116
%98 = phi i64 [ 0, %94 ], [ %119, %116 ]
%99 = phi float [ 0.000000e+00, %94 ], [ %118, %116 ]
%100 = phi i32 [ 0, %94 ], [ %117, %116 ]
%101 = trunc i64 %98 to i32
%102 = add i32 %96, %101
%103 = srem i32 %102, %2
%104 = or i32 %103, %2
%105 = icmp sgt i32 %104, -1
br i1 %105, label %106, label %116
106: ; preds = %97
%107 = add nsw i32 %100, 1
%108 = getelementptr inbounds float, float* %0, i64 %98
%109 = load float, float* %108
%110 = fsub float %109, %90
%111 = zext i32 %103 to i64
%112 = getelementptr inbounds float, float* %1, i64 %111
%113 = load float, float* %112
%114 = fsub float %113, %91
%115 = tail call float @llvm.fmuladd.f32(float %110, float %114, float %99)
br label %116
116: ; preds = %97, %106
%117 = phi i32 [ %107, %106 ], [ %100, %97 ]
%118 = phi float [ %115, %106 ], [ %99, %97 ]
%119 = add nuw nsw i64 %98, 1
%120 = icmp eq i64 %119, %89
br i1 %120, label %121, label %97
121: ; preds = %116
%122 = icmp sgt i32 %117, 0
br i1 %122, label %123, label %126
123: ; preds = %121
%124 = sitofp i32 %117 to float
%125 = fdiv float %118, %124
br label %126
126: ; preds = %92, %123, %121
%127 = phi float [ %125, %123 ], [ %118, %121 ], [ 0.000000e+00, %92 ]
%128 = getelementptr inbounds float, float* %4, i64 %93
store float %127, float* %128
%129 = add nuw nsw i64 %93, 1
%130 = icmp eq i64 %129, %88
br i1 %130, label %131, label %92
131: ; preds = %126, %81
ret void
}