double AIC_corrected(double logLikelihood, int nParams, long nData,
                     int chiSquareUsed) {
  double twok, aic, correctionTerm;
  twok = 2.0 * nParams;
  if (chiSquareUsed)
    aic = logLikelihood + twok;
  else
    aic = -2.0 * logLikelihood + twok;
  correctionTerm = 2.0 * nParams * (nParams + 1.0) / (nData - nParams - 1.0);
  return (aic + correctionTerm);
}


x86 assembly (clang, -O0):
<AIC_corrected>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xee0(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1147 <AIC_corrected+0x47>
movsd  -0x8(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    115e <AIC_corrected+0x5e>
movsd  -0x8(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
addsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xe95(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xe8c(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
sub    %rcx,%rax
cvtsi2sd %rax,%xmm1
movsd  0xe6c(%rip),%xmm2
subsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x30(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<AIC_corrected>:
movapd %xmm0,%xmm1
cvtsi2sd %edi,%xmm2
movapd %xmm2,%xmm0
addsd  %xmm2,%xmm0
test   %edx,%edx
je     111e <AIC_corrected+0x1e>
addsd  %xmm0,%xmm1
movapd %xmm1,%xmm3
jmp    112a <AIC_corrected+0x2a>
addsd  %xmm1,%xmm1
movapd %xmm0,%xmm3
subsd  %xmm1,%xmm3
addsd  0xece(%rip),%xmm2
mulsd  %xmm2,%xmm0
movslq %edi,%rax
sub    %rax,%rsi
xorps  %xmm1,%xmm1
cvtsi2sd %rsi,%xmm1
addsd  0xebc(%rip),%xmm1
divsd  %xmm1,%xmm0
addsd  %xmm3,%xmm0
ret

LLVM IR (-O0):
define double @AIC_corrected(double %0, i32 %1, i64 %2, i32 %3) {
%5 = alloca double
%6 = alloca i32
%7 = alloca i64
%8 = alloca i32
%9 = alloca double
%10 = alloca double
%11 = alloca double
store double %0, double* %5
store i32 %1, i32* %6
store i64 %2, i64* %7
store i32 %3, i32* %8
%12 = load i32, i32* %6
%13 = sitofp i32 %12 to double
%14 = fmul double 2.000000e+00, %13
store double %14, double* %9
%15 = load i32, i32* %8
%16 = icmp ne i32 %15, 0
br i1 %16, label %17, label %21
17: ; preds = %4
%18 = load double, double* %5
%19 = load double, double* %9
%20 = fadd double %18, %19
store double %20, double* %10
br label %25
21: ; preds = %4
%22 = load double, double* %5
%23 = load double, double* %9
%24 = call double @llvm.fmuladd.f64(double -2.000000e+00, double %22, double %23)
store double %24, double* %10
br label %25
25: ; preds = %21, %17
%26 = load i32, i32* %6
%27 = sitofp i32 %26 to double
%28 = fmul double 2.000000e+00, %27
%29 = load i32, i32* %6
%30 = sitofp i32 %29 to double
%31 = fadd double %30, 1.000000e+00
%32 = fmul double %28, %31
%33 = load i64, i64* %7
%34 = load i32, i32* %6
%35 = sext i32 %34 to i64
%36 = sub nsw i64 %33, %35
%37 = sitofp i64 %36 to double
%38 = fsub double %37, 1.000000e+00
%39 = fdiv double %32, %38
store double %39, double* %11
%40 = load double, double* %10
%41 = load double, double* %11
%42 = fadd double %40, %41
ret double %42
}

LLVM IR (-O2):
define double @AIC_corrected(double %0, i32 %1, i64 %2, i32 %3) {
%5 = sitofp i32 %1 to double
%6 = fmul double %5, 2.000000e+00
%7 = icmp eq i32 %3, 0
%8 = fadd double %6, %0
%9 = tail call double @llvm.fmuladd.f64(double %0, double -2.000000e+00, double %6)
%10 = select i1 %7, double %9, double %8
%11 = fadd double %5, 1.000000e+00
%12 = fmul double %6, %11
%13 = sext i32 %1 to i64
%14 = sub nsw i64 %2, %13
%15 = sitofp i64 %14 to double
%16 = fadd double %15, -1.000000e+00
%17 = fdiv double %12, %16
%18 = fadd double %10, %17
ret double %18
}