void moments(int n, float *ix, float *iy, float *io, float *x, float *y,
             float *m) {
  int i;
  for (i = 0; i < n; i++) {
    *ix += y[i] * y[i] * m[i];
    *iy += x[i] * x[i] * m[i];
    *io += (x[i] * x[i] + y[i] * y[i]) * m[i];
  }
}


x86 assembly (clang, -O0):
<moments>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1213 <moments+0x113>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm0
mov    0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm0
mov    0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1126 <moments+0x26>
pop    %rbp
ret

x86 assembly (clang, -O2):
<moments>:
test   %edi,%edi
jle    116c <moments+0x6c>
mov    0x8(%rsp),%rax
mov    %edi,%r10d
xor    %edi,%edi
xchg   %ax,%ax
movss  (%r9,%rdi,4),%xmm0
mulss  %xmm0,%xmm0
mulss  (%rax,%rdi,4),%xmm0
addss  (%rsi),%xmm0
movss  %xmm0,(%rsi)
movss  (%r8,%rdi,4),%xmm0
mulss  %xmm0,%xmm0
mulss  (%rax,%rdi,4),%xmm0
addss  (%rdx),%xmm0
movss  %xmm0,(%rdx)
movss  (%r8,%rdi,4),%xmm0
movss  (%r9,%rdi,4),%xmm1
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
mulss  (%rax,%rdi,4),%xmm0
addss  (%rcx),%xmm0
movss  %xmm0,(%rcx)
add    $0x1,%rdi
cmp    %rdi,%r10
jne    1110 <moments+0x10>
ret

LLVM IR (-O0):
define void @moments(i32 %0, float* %1, float* %2, float* %3, float* %4, float* %5, float* %6) {
%8 = alloca i32
%9 = alloca float*
%10 = alloca float*
%11 = alloca float*
%12 = alloca float*
%13 = alloca float*
%14 = alloca float*
%15 = alloca i32
store i32 %0, i32* %8
store float* %1, float** %9
store float* %2, float** %10
store float* %3, float** %11
store float* %4, float** %12
store float* %5, float** %13
store float* %6, float** %14
store i32 0, i32* %15
br label %16
16: ; preds = %89, %7
%17 = load i32, i32* %15
%18 = load i32, i32* %8
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %92
20: ; preds = %16
%21 = load float*, float** %13
%22 = load i32, i32* %15
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds float, float* %21, i64 %23
%25 = load float, float* %24
%26 = load float*, float** %13
%27 = load i32, i32* %15
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds float, float* %26, i64 %28
%30 = load float, float* %29
%31 = fmul float %25, %30
%32 = load float*, float** %14
%33 = load i32, i32* %15
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds float, float* %32, i64 %34
%36 = load float, float* %35
%37 = load float*, float** %9
%38 = load float, float* %37
%39 = call float @llvm.fmuladd.f32(float %31, float %36, float %38)
store float %39, float* %37
%40 = load float*, float** %12
%41 = load i32, i32* %15
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds float, float* %40, i64 %42
%44 = load float, float* %43
%45 = load float*, float** %12
%46 = load i32, i32* %15
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds float, float* %45, i64 %47
%49 = load float, float* %48
%50 = fmul float %44, %49
%51 = load float*, float** %14
%52 = load i32, i32* %15
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds float, float* %51, i64 %53
%55 = load float, float* %54
%56 = load float*, float** %10
%57 = load float, float* %56
%58 = call float @llvm.fmuladd.f32(float %50, float %55, float %57)
store float %58, float* %56
%59 = load float*, float** %12
%60 = load i32, i32* %15
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds float, float* %59, i64 %61
%63 = load float, float* %62
%64 = load float*, float** %12
%65 = load i32, i32* %15
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds float, float* %64, i64 %66
%68 = load float, float* %67
%69 = load float*, float** %13
%70 = load i32, i32* %15
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds float, float* %69, i64 %71
%73 = load float, float* %72
%74 = load float*, float** %13
%75 = load i32, i32* %15
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds float, float* %74, i64 %76
%78 = load float, float* %77
%79 = fmul float %73, %78
%80 = call float @llvm.fmuladd.f32(float %63, float %68, float %79)
%81 = load float*, float** %14
%82 = load i32, i32* %15
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds float, float* %81, i64 %83
%85 = load float, float* %84
%86 = load float*, float** %11
%87 = load float, float* %86
%88 = call float @llvm.fmuladd.f32(float %80, float %85, float %87)
store float %88, float* %86
br label %89
89: ; preds = %20
%90 = load i32, i32* %15
%91 = add nsw i32 %90, 1
store i32 %91, i32* %15
br label %16
92: ; preds = %16
ret void
}

LLVM IR (-O2):
define void @moments(i32 %0, float* nocapture %1, float* nocapture %2, float* nocapture %3, float* nocapture %4, float* nocapture %5, float* nocapture %6) {
%8 = icmp sgt i32 %0, 0
br i1 %8, label %9, label %35
9: ; preds = %7
%10 = zext i32 %0 to i64
br label %11
11: ; preds = %9, %11
%12 = phi i64 [ 0, %9 ], [ %33, %11 ]
%13 = getelementptr inbounds float, float* %5, i64 %12
%14 = load float, float* %13
%15 = fmul float %14, %14
%16 = getelementptr inbounds float, float* %6, i64 %12
%17 = load float, float* %16
%18 = load float, float* %1
%19 = tail call float @llvm.fmuladd.f32(float %15, float %17, float %18)
store float %19, float* %1
%20 = getelementptr inbounds float, float* %4, i64 %12
%21 = load float, float* %20
%22 = fmul float %21, %21
%23 = load float, float* %16
%24 = load float, float* %2
%25 = tail call float @llvm.fmuladd.f32(float %22, float %23, float %24)
store float %25, float* %2
%26 = load float, float* %20
%27 = load float, float* %13
%28 = fmul float %27, %27
%29 = tail call float @llvm.fmuladd.f32(float %26, float %26, float %28)
%30 = load float, float* %16
%31 = load float, float* %3
%32 = tail call float @llvm.fmuladd.f32(float %29, float %30, float %31)
store float %32, float* %3
%33 = add nuw nsw i64 %12, 1
%34 = icmp eq i64 %33, %10
br i1 %34, label %35, label %11
35: ; preds = %11, %7
ret void
}