void velocity_calc(int nAtoms, int iter, int deltaWrite, double Ar_mmass,
                   double delta_t, double R, double *int_temp,
                   double *Tot_kinetic_en, double **atomVelocities,
                   double **atomForces, double **old_atomForces) {
  int i, j;
  double component;
  double sumv2;
  double dof;
  double convert;
  convert = 0.0001 * 4184;
  dof = nAtoms * 3.0;
  sumv2 = 0.0;
  *Tot_kinetic_en = 0.0;
  *int_temp = 0.0;
  for (j = 0; j < 3; j++) {
    for (i = 0; i < nAtoms; i++) {
      atomVelocities[i][j] += 0.5 * convert * delta_t *
                              (atomForces[i][j] + old_atomForces[i][j]) /
                              Ar_mmass;
      if (iter % deltaWrite == 0) {
        sumv2 += atomVelocities[i][j] * atomVelocities[i][j];
      }
    }
  }
  *Tot_kinetic_en = 0.5 * Ar_mmass * sumv2 / convert;
  sumv2 = sumv2 / dof;
  *int_temp = (Ar_mmass * sumv2) / (R * convert);
}


x86 assembly (clang, -O0):
<velocity_calc>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
movsd  %xmm2,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
mov    %r8,-0x38(%rbp)
mov    %r9,-0x40(%rbp)
movsd  0xed0(%rip),%xmm0
movsd  %xmm0,-0x68(%rbp)
cvtsi2sdl -0x4(%rbp),%xmm0
movsd  0xeb6(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x38(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x48(%rbp)
cmpl   $0x3,-0x48(%rbp)
jge    1266 <velocity_calc+0x166>
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1253 <velocity_calc+0x153>
movsd  0xe73(%rip),%xmm0
mulsd  -0x68(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
mov    0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
divsd  -0x18(%rbp),%xmm0
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%eax
cltd
idivl  -0xc(%rbp)
cmp    $0x0,%edx
jne    1240 <velocity_calc+0x140>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1245 <velocity_calc+0x145>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1189 <velocity_calc+0x89>
jmp    1258 <velocity_calc+0x158>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1178 <velocity_calc+0x78>
movsd  0xda2(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
divsd  -0x68(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x58(%rbp),%xmm0
divsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x18(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mulsd  -0x68(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<velocity_calc>:
push   %r15
push   %r14
push   %rbx
movq   $0x0,(%r8)
movq   $0x0,(%rcx)
test   %edi,%edi
jle    11df <velocity_calc+0xdf>
mov    %edx,%r10d
mov    %esi,%r11d
mov    0x28(%rsp),%r14
mov    0x20(%rsp),%r15
mulsd  0xecd(%rip),%xmm1
mov    %esi,%eax
cltd
idiv   %r10d
mov    %edi,%esi
xorpd  %xmm3,%xmm3
xor    %eax,%eax
jmp    1159 <velocity_calc+0x59>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rax
cmp    %rax,%rsi
je     118b <velocity_calc+0x8b>
mov    (%r15,%rax,8),%rbx
movsd  (%rbx),%xmm4
mov    (%r14,%rax,8),%rbx
addsd  (%rbx),%xmm4
mulsd  %xmm1,%xmm4
divsd  %xmm0,%xmm4
mov    (%r9,%rax,8),%rbx
addsd  (%rbx),%xmm4
movsd  %xmm4,(%rbx)
test   %edx,%edx
jne    1150 <velocity_calc+0x50>
mulsd  %xmm4,%xmm4
addsd  %xmm4,%xmm3
jmp    1150 <velocity_calc+0x50>
test   %edi,%edi
jle    123f <velocity_calc+0x13f>
mov    %r11d,%eax
cltd
idiv   %r10d
xor    %eax,%eax
jmp    11a9 <velocity_calc+0xa9>
xchg   %ax,%ax
add    $0x1,%rax
cmp    %rax,%rsi
je     11e5 <velocity_calc+0xe5>
mov    (%r15,%rax,8),%rbx
movsd  0x8(%rbx),%xmm4
mov    (%r14,%rax,8),%rbx
addsd  0x8(%rbx),%xmm4
mulsd  %xmm1,%xmm4
divsd  %xmm0,%xmm4
mov    (%r9,%rax,8),%rbx
addsd  0x8(%rbx),%xmm4
movsd  %xmm4,0x8(%rbx)
test   %edx,%edx
jne    11a0 <velocity_calc+0xa0>
mulsd  %xmm4,%xmm4
addsd  %xmm4,%xmm3
jmp    11a0 <velocity_calc+0xa0>
xorpd  %xmm3,%xmm3
jmp    123f <velocity_calc+0x13f>
test   %edi,%edi
jle    123f <velocity_calc+0x13f>
mov    %r11d,%eax
cltd
idiv   %r10d
xor    %eax,%eax
jmp    1209 <velocity_calc+0x109>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rax
cmp    %rax,%rsi
je     123f <velocity_calc+0x13f>
mov    (%r15,%rax,8),%rbx
movsd  0x10(%rbx),%xmm4
mov    (%r14,%rax,8),%rbx
addsd  0x10(%rbx),%xmm4
mulsd  %xmm1,%xmm4
divsd  %xmm0,%xmm4
mov    (%r9,%rax,8),%rbx
addsd  0x10(%rbx),%xmm4
movsd  %xmm4,0x10(%rbx)
test   %edx,%edx
jne    1200 <velocity_calc+0x100>
mulsd  %xmm4,%xmm4
addsd  %xmm4,%xmm3
jmp    1200 <velocity_calc+0x100>
xorps  %xmm1,%xmm1
cvtsi2sd %edi,%xmm1
mulsd  0xdba(%rip),%xmm1
movsd  0xdba(%rip),%xmm4
mulsd  %xmm0,%xmm4
mulsd  %xmm3,%xmm4
movsd  0xdb2(%rip),%xmm5
divsd  %xmm5,%xmm4
movsd  %xmm4,(%r8)
divsd  %xmm1,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm5,%xmm2
divsd  %xmm2,%xmm3
movsd  %xmm3,(%rcx)
pop    %rbx
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
define void @velocity_calc(i32 %0, i32 %1, i32 %2, double %3, double %4, double %5, double* nocapture writeonly %6, double* nocapture writeonly %7, double** nocapture %8, double** nocapture %9, double** nocapture %10) {
store double 0.000000e+00, double* %7
store double 0.000000e+00, double* %6
%12 = icmp sgt i32 %0, 0
%13 = fmul double %4, 2.092000e-01
br i1 %12, label %14, label %94
14: ; preds = %11
%15 = srem i32 %1, %2
%16 = icmp eq i32 %15, 0
%17 = zext i32 %0 to i64
br label %18
18: ; preds = %14, %18
%19 = phi i64 [ 0, %14 ], [ %36, %18 ]
%20 = phi double [ 0.000000e+00, %14 ], [ %35, %18 ]
%21 = getelementptr inbounds double*, double** %9, i64 %19
%22 = load double*, double** %21
%23 = load double, double* %22
%24 = getelementptr inbounds double*, double** %10, i64 %19
%25 = load double*, double** %24
%26 = load double, double* %25
%27 = fadd double %23, %26
%28 = fmul double %13, %27
%29 = fdiv double %28, %3
%30 = getelementptr inbounds double*, double** %8, i64 %19
%31 = load double*, double** %30
%32 = load double, double* %31
%33 = fadd double %32, %29
store double %33, double* %31
%34 = tail call double @llvm.fmuladd.f64(double %33, double %33, double %20)
%35 = select i1 %16, double %34, double %20
%36 = add nuw nsw i64 %19, 1
%37 = icmp eq i64 %36, %17
br i1 %37, label %38, label %18
38: ; preds = %18
br i1 %12, label %39, label %94
39: ; preds = %38
%40 = srem i32 %1, %2
%41 = icmp eq i32 %40, 0
%42 = zext i32 %0 to i64
br label %43
43: ; preds = %43, %39
%44 = phi i64 [ 0, %39 ], [ %64, %43 ]
%45 = phi double [ %35, %39 ], [ %63, %43 ]
%46 = getelementptr inbounds double*, double** %9, i64 %44
%47 = load double*, double** %46
%48 = getelementptr inbounds double, double* %47, i64 1
%49 = load double, double* %48
%50 = getelementptr inbounds double*, double** %10, i64 %44
%51 = load double*, double** %50
%52 = getelementptr inbounds double, double* %51, i64 1
%53 = load double, double* %52
%54 = fadd double %49, %53
%55 = fmul double %13, %54
%56 = fdiv double %55, %3
%57 = getelementptr inbounds double*, double** %8, i64 %44
%58 = load double*, double** %57
%59 = getelementptr inbounds double, double* %58, i64 1
%60 = load double, double* %59
%61 = fadd double %60, %56
store double %61, double* %59
%62 = tail call double @llvm.fmuladd.f64(double %61, double %61, double %45)
%63 = select i1 %41, double %62, double %45
%64 = add nuw nsw i64 %44, 1
%65 = icmp eq i64 %64, %42
br i1 %65, label %66, label %43
66: ; preds = %43
br i1 %12, label %67, label %94
67: ; preds = %66
%68 = srem i32 %1, %2
%69 = icmp eq i32 %68, 0
%70 = zext i32 %0 to i64
br label %71
71: ; preds = %71, %67
%72 = phi i64 [ 0, %67 ], [ %92, %71 ]
%73 = phi double [ %63, %67 ], [ %91, %71 ]
%74 = getelementptr inbounds double*, double** %9, i64 %72
%75 = load double*, double** %74
%76 = getelementptr inbounds double, double* %75, i64 2
%77 = load double, double* %76
%78 = getelementptr inbounds double*, double** %10, i64 %72
%79 = load double*, double** %78
%80 = getelementptr inbounds double, double* %79, i64 2
%81 = load double, double* %80
%82 = fadd double %77, %81
%83 = fmul double %13, %82
%84 = fdiv double %83, %3
%85 = getelementptr inbounds double*, double** %8, i64 %72
%86 = load double*, double** %85
%87 = getelementptr inbounds double, double* %86, i64 2
%88 = load double, double* %87
%89 = fadd double %88, %84
store double %89, double* %87
%90 = tail call double @llvm.fmuladd.f64(double %89, double %89, double %73)
%91 = select i1 %69, double %90, double %73
%92 = add nuw nsw i64 %72, 1
%93 = icmp eq i64 %92, %70
br i1 %93, label %94, label %71
94: ; preds = %71, %11, %38, %66
%95 = phi double [ %63, %66 ], [ %35, %38 ], [ 0.000000e+00, %11 ], [ %91, %71 ]
%96 = sitofp i32 %0 to double
%97 = fmul double %96, 3.000000e+00
%98 = fmul double %3, 5.000000e-01
%99 = fmul double %98, %95
%100 = fdiv double %99, 4.184000e-01
store double %100, double* %7
%101 = fdiv double %95, %97
%102 = fmul double %101, %3
%103 = fmul double %5, 4.184000e-01
%104 = fdiv double %102, %103
store double %104, double* %6
ret void
}