double GetThroughput(int nn, int mx, int my, int mz, double time) {
  double load_interior_only =
      (double)(mz - 2) * (double)(my - 2) * (double)(mx - 2) * 12;
  double load_whole = (double)(mz) * (double)(my) * (double)(mx)*1;
  double store = (double)(mz - 2) * (double)(my - 2) * (double)(mx - 2) * 1;
  double total_size_per_update =
      sizeof(float) * (load_interior_only + load_whole + store);
  return (total_size_per_update * nn / time) * 1.0e-09;
}


x86 assembly (clang, -O0):
<GetThroughput>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%eax
sub    $0x2,%eax
cvtsi2sd %eax,%xmm0
mov    -0xc(%rbp),%eax
sub    $0x2,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
mov    -0x8(%rbp),%eax
sub    $0x2,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xed5(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
cvtsi2sdl -0x10(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x8(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xea5(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%eax
sub    $0x2,%eax
cvtsi2sd %eax,%xmm0
mov    -0xc(%rbp),%eax
sub    $0x2,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
mov    -0x8(%rbp),%eax
sub    $0x2,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe6e(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x20(%rbp),%xmm1
addsd  -0x28(%rbp),%xmm1
addsd  -0x30(%rbp),%xmm1
movsd  0xe46(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
cvtsi2sdl -0x4(%rbp),%xmm1
mulsd  %xmm1,%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  0xe1a(%rip),%xmm1
mulsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<GetThroughput>:
lea    -0x2(%rcx),%eax
cvtsi2sd %eax,%xmm1
lea    -0x2(%rdx),%eax
cvtsi2sd %eax,%xmm2
mulsd  %xmm1,%xmm2
lea    -0x2(%rsi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  %xmm2,%xmm1
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
cvtsi2sd %edx,%xmm3
movsd  0xecd(%rip),%xmm4
mulsd  %xmm2,%xmm3
xorps  %xmm2,%xmm2
cvtsi2sd %esi,%xmm2
mulsd  %xmm1,%xmm4
mulsd  %xmm3,%xmm2
addsd  %xmm4,%xmm2
addsd  %xmm1,%xmm2
mulsd  0xeb2(%rip),%xmm2
xorps  %xmm1,%xmm1
cvtsi2sd %edi,%xmm1
mulsd  %xmm2,%xmm1
divsd  %xmm0,%xmm1
mulsd  0xea3(%rip),%xmm1
movapd %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @GetThroughput(i32 %0, i32 %1, i32 %2, i32 %3, double %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store double %4, double* %10
%15 = load i32, i32* %9
%16 = sub nsw i32 %15, 2
%17 = sitofp i32 %16 to double
%18 = load i32, i32* %8
%19 = sub nsw i32 %18, 2
%20 = sitofp i32 %19 to double
%21 = fmul double %17, %20
%22 = load i32, i32* %7
%23 = sub nsw i32 %22, 2
%24 = sitofp i32 %23 to double
%25 = fmul double %21, %24
%26 = fmul double %25, 1.200000e+01
store double %26, double* %11
%27 = load i32, i32* %9
%28 = sitofp i32 %27 to double
%29 = load i32, i32* %8
%30 = sitofp i32 %29 to double
%31 = fmul double %28, %30
%32 = load i32, i32* %7
%33 = sitofp i32 %32 to double
%34 = fmul double %31, %33
%35 = fmul double %34, 1.000000e+00
store double %35, double* %12
%36 = load i32, i32* %9
%37 = sub nsw i32 %36, 2
%38 = sitofp i32 %37 to double
%39 = load i32, i32* %8
%40 = sub nsw i32 %39, 2
%41 = sitofp i32 %40 to double
%42 = fmul double %38, %41
%43 = load i32, i32* %7
%44 = sub nsw i32 %43, 2
%45 = sitofp i32 %44 to double
%46 = fmul double %42, %45
%47 = fmul double %46, 1.000000e+00
store double %47, double* %13
%48 = load double, double* %11
%49 = load double, double* %12
%50 = fadd double %48, %49
%51 = load double, double* %13
%52 = fadd double %50, %51
%53 = fmul double 4.000000e+00, %52
store double %53, double* %14
%54 = load double, double* %14
%55 = load i32, i32* %6
%56 = sitofp i32 %55 to double
%57 = fmul double %54, %56
%58 = load double, double* %10
%59 = fdiv double %57, %58
%60 = fmul double %59, 1.000000e-09
ret double %60
}

LLVM IR (-O2):
define double @GetThroughput(i32 %0, i32 %1, i32 %2, i32 %3, double %4) {
%6 = add nsw i32 %3, -2
%7 = sitofp i32 %6 to double
%8 = add nsw i32 %2, -2
%9 = sitofp i32 %8 to double
%10 = fmul double %9, %7
%11 = add nsw i32 %1, -2
%12 = sitofp i32 %11 to double
%13 = fmul double %10, %12
%14 = fmul double %13, 1.200000e+01
%15 = sitofp i32 %3 to double
%16 = sitofp i32 %2 to double
%17 = fmul double %16, %15
%18 = sitofp i32 %1 to double
%19 = fmul double %17, %18
%20 = fadd double %19, %14
%21 = fadd double %13, %20
%22 = fmul double %21, 4.000000e+00
%23 = sitofp i32 %0 to double
%24 = fmul double %22, %23
%25 = fdiv double %24, %4
%26 = fmul double %25, 1.000000e-09
ret double %26
}