int iK(int iC, int ic1, int ic2, int nC) {
  int K = 0;
  int iCp;
  iCp = nC - iC - 1;
  K += iCp * (iCp + 1) * (2 * iCp + 1) / 6;
  if (ic1 != iC && ic2 != iC)
    return K += (nC - iC - 1) * (ic1 - iC - 1) + (ic2 - iC - 1);
  K += (nC - iC - 1) * (nC - iC - 1);
  if (ic1 != iC && ic2 == iC)
    return K += ic1 - iC - 1;
  K += (nC - iC - 1);
  if (ic1 == iC && ic2 != iC)
    return K += ic2 - iC - 1;
  K += (nC - iC - 1);
  return K;
}


x86 assembly (clang, -O0):
<iK>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x14(%rbp),%eax
sub    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x6,%ecx
cltd
idiv   %ecx
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x8(%rbp),%eax
je     118f <iK+0x8f>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
je     118f <iK+0x8f>
mov    -0x14(%rbp),%eax
sub    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    -0xc(%rbp),%ecx
sub    -0x8(%rbp),%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
mov    -0x10(%rbp),%ecx
sub    -0x8(%rbp),%ecx
sub    $0x1,%ecx
add    %ecx,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    %eax,-0x4(%rbp)
jmp    122c <iK+0x12c>
mov    -0x14(%rbp),%eax
sub    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    -0x14(%rbp),%ecx
sub    -0x8(%rbp),%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x8(%rbp),%eax
je     11d9 <iK+0xd9>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
jne    11d9 <iK+0xd9>
mov    -0xc(%rbp),%eax
sub    -0x8(%rbp),%eax
sub    $0x1,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    %eax,-0x4(%rbp)
jmp    122c <iK+0x12c>
mov    -0x14(%rbp),%eax
sub    -0x8(%rbp),%eax
sub    $0x1,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x8(%rbp),%eax
jne    1217 <iK+0x117>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
je     1217 <iK+0x117>
mov    -0x10(%rbp),%eax
sub    -0x8(%rbp),%eax
sub    $0x1,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    %eax,-0x4(%rbp)
jmp    122c <iK+0x12c>
mov    -0x14(%rbp),%eax
sub    -0x8(%rbp),%eax
sub    $0x1,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<iK>:
sub    %edi,%ecx
lea    -0x1(%rcx),%r8d
mov    %r8d,%eax
imul   %ecx,%eax
add    %ecx,%ecx
add    $0xffffffff,%ecx
imul   %eax,%ecx
movslq %ecx,%rax
imul   $0x2aaaaaab,%rax,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
shr    $0x20,%rax
add    %ecx,%eax
cmp    %edi,%esi
je     1142 <iK+0x42>
cmp    %edi,%edx
je     1142 <iK+0x42>
not    %edi
add    %edi,%esi
imul   %esi,%r8d
add    %edx,%edi
add    %r8d,%edi
jmp    1168 <iK+0x68>
mov    %r8d,%ecx
imul   %r8d,%ecx
add    %ecx,%eax
cmp    %edi,%edx
jne    1159 <iK+0x59>
cmp    %edi,%esi
je     1159 <iK+0x59>
not    %edi
add    %esi,%edi
jmp    1168 <iK+0x68>
add    %r8d,%eax
cmp    %edi,%esi
jne    116d <iK+0x6d>
cmp    %edi,%edx
je     116d <iK+0x6d>
not    %edi
add    %edx,%edi
add    %eax,%edi
mov    %edi,%eax
ret
add    %r8d,%eax
ret

LLVM IR (-O0):
define i32 @iK(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i32 0, i32* %10
%12 = load i32, i32* %9
%13 = load i32, i32* %6
%14 = sub nsw i32 %12, %13
%15 = sub nsw i32 %14, 1
store i32 %15, i32* %11
%16 = load i32, i32* %11
%17 = load i32, i32* %11
%18 = add nsw i32 %17, 1
%19 = mul nsw i32 %16, %18
%20 = load i32, i32* %11
%21 = mul nsw i32 2, %20
%22 = add nsw i32 %21, 1
%23 = mul nsw i32 %19, %22
%24 = sdiv i32 %23, 6
%25 = load i32, i32* %10
%26 = add nsw i32 %25, %24
store i32 %26, i32* %10
%27 = load i32, i32* %7
%28 = load i32, i32* %6
%29 = icmp ne i32 %27, %28
br i1 %29, label %30, label %51
30: ; preds = %4
%31 = load i32, i32* %8
%32 = load i32, i32* %6
%33 = icmp ne i32 %31, %32
br i1 %33, label %34, label %51
34: ; preds = %30
%35 = load i32, i32* %9
%36 = load i32, i32* %6
%37 = sub nsw i32 %35, %36
%38 = sub nsw i32 %37, 1
%39 = load i32, i32* %7
%40 = load i32, i32* %6
%41 = sub nsw i32 %39, %40
%42 = sub nsw i32 %41, 1
%43 = mul nsw i32 %38, %42
%44 = load i32, i32* %8
%45 = load i32, i32* %6
%46 = sub nsw i32 %44, %45
%47 = sub nsw i32 %46, 1
%48 = add nsw i32 %43, %47
%49 = load i32, i32* %10
%50 = add nsw i32 %49, %48
store i32 %50, i32* %10
store i32 %50, i32* %5
br label %106
51: ; preds = %30, %4
%52 = load i32, i32* %9
%53 = load i32, i32* %6
%54 = sub nsw i32 %52, %53
%55 = sub nsw i32 %54, 1
%56 = load i32, i32* %9
%57 = load i32, i32* %6
%58 = sub nsw i32 %56, %57
%59 = sub nsw i32 %58, 1
%60 = mul nsw i32 %55, %59
%61 = load i32, i32* %10
%62 = add nsw i32 %61, %60
store i32 %62, i32* %10
%63 = load i32, i32* %7
%64 = load i32, i32* %6
%65 = icmp ne i32 %63, %64
br i1 %65, label %66, label %77
66: ; preds = %51
%67 = load i32, i32* %8
%68 = load i32, i32* %6
%69 = icmp eq i32 %67, %68
br i1 %69, label %70, label %77
70: ; preds = %66
%71 = load i32, i32* %7
%72 = load i32, i32* %6
%73 = sub nsw i32 %71, %72
%74 = sub nsw i32 %73, 1
%75 = load i32, i32* %10
%76 = add nsw i32 %75, %74
store i32 %76, i32* %10
store i32 %76, i32* %5
br label %106
77: ; preds = %66, %51
%78 = load i32, i32* %9
%79 = load i32, i32* %6
%80 = sub nsw i32 %78, %79
%81 = sub nsw i32 %80, 1
%82 = load i32, i32* %10
%83 = add nsw i32 %82, %81
store i32 %83, i32* %10
%84 = load i32, i32* %7
%85 = load i32, i32* %6
%86 = icmp eq i32 %84, %85
br i1 %86, label %87, label %98
87: ; preds = %77
%88 = load i32, i32* %8
%89 = load i32, i32* %6
%90 = icmp ne i32 %88, %89
br i1 %90, label %91, label %98
91: ; preds = %87
%92 = load i32, i32* %8
%93 = load i32, i32* %6
%94 = sub nsw i32 %92, %93
%95 = sub nsw i32 %94, 1
%96 = load i32, i32* %10
%97 = add nsw i32 %96, %95
store i32 %97, i32* %10
store i32 %97, i32* %5
br label %106
98: ; preds = %87, %77
%99 = load i32, i32* %9
%100 = load i32, i32* %6
%101 = sub nsw i32 %99, %100
%102 = sub nsw i32 %101, 1
%103 = load i32, i32* %10
%104 = add nsw i32 %103, %102
store i32 %104, i32* %10
%105 = load i32, i32* %10
store i32 %105, i32* %5
br label %106
106: ; preds = %98, %91, %70, %34
%107 = load i32, i32* %5
ret i32 %107
}

LLVM IR (-O2):
define i32 @iK(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = sub nsw i32 %3, %0
%6 = add nsw i32 %5, -1
%7 = mul nsw i32 %6, %5
%8 = shl nsw i32 %6, 1
%9 = or i32 %8, 1
%10 = mul nsw i32 %7, %9
%11 = sdiv i32 %10, 6
%12 = icmp eq i32 %1, %0
%13 = icmp eq i32 %2, %0
%14 = or i1 %12, %13
br i1 %14, label %22, label %15
15: ; preds = %4
%16 = xor i32 %0, -1
%17 = add i32 %16, %1
%18 = mul nsw i32 %6, %17
%19 = add i32 %16, %2
%20 = add nsw i32 %19, %18
%21 = add nsw i32 %20, %11
br label %41
22: ; preds = %4
%23 = mul nsw i32 %6, %6
%24 = add nsw i32 %11, %23
%25 = xor i1 %12, true
%26 = and i1 %13, %25
br i1 %26, label %27, label %31
27: ; preds = %22
%28 = xor i32 %0, -1
%29 = add i32 %28, %1
%30 = add nsw i32 %29, %24
br label %41
31: ; preds = %22
%32 = add nsw i32 %24, %6
%33 = icmp ne i32 %1, %0
%34 = or i1 %33, %13
br i1 %34, label %39, label %35
35: ; preds = %31
%36 = xor i32 %0, -1
%37 = add i32 %36, %2
%38 = add nsw i32 %37, %32
br label %41
39: ; preds = %31
%40 = add nsw i32 %32, %6
br label %41
41: ; preds = %39, %35, %27, %15
%42 = phi i32 [ %21, %15 ], [ %30, %27 ], [ %38, %35 ], [ %40, %39 ]
ret i32 %42
}