int muGuessChord(const int *pNoteStatus, const int channel, const int lowRange,
                 const int highRange) {
  int octave[24];
  int i;
  int lowestNote = 999;
  int startNote = 999;
  int chordRoot = 0;
  int chordType = 0;
  int chordAdditions = 0;
  for (i = 0; i < 24; ++i) {
    octave[i] = 0;
  }
  for (i = lowRange; i <= highRange; ++i) {
    if (pNoteStatus[channel * 128 + i]) {
      if (i < lowestNote) {
        lowestNote = i;
      }
      ++octave[i % 12];
      ++octave[i % 12 + 12];
      if ((i % 12) < startNote) {
        startNote = i % 12;
      }
    }
  }
  if (lowestNote == 999) {
    return -1;
  }
  lowestNote %= 12;
  if (octave[startNote + 3] && octave[startNote + 8]) {
    chordRoot = startNote + 8;
    chordType = 0x00000100;
  } else if (octave[startNote + 5] && octave[startNote + 9]) {
    chordRoot = startNote + 5;
    chordType = 0x00000100;
  } else if (octave[startNote + 4] && octave[startNote + 7]) {
    chordRoot = startNote;
    chordType = 0x00000100;
  } else if (octave[startNote + 4] && octave[startNote + 9]) {
    chordRoot = startNote + 9;
    chordType = 0x00000200;
  } else if (octave[startNote + 5] && octave[startNote + 8]) {
    chordRoot = startNote + 5;
    chordType = 0x00000200;
  } else if (octave[startNote + 3] && octave[startNote + 7]) {
    chordRoot = startNote;
    chordType = 0x00000200;
  } else if (octave[startNote + 3] && octave[startNote + 6]) {
    chordRoot = lowestNote;
    chordType = 0x00000400;
  } else if (octave[startNote + 6] && octave[startNote + 9]) {
    chordRoot = lowestNote;
    chordType = 0x00000400;
  } else if (octave[startNote + 4] && octave[startNote + 8]) {
    chordRoot = lowestNote;
    chordType = 0x00000300;
  }
  if (octave[chordRoot + 10]) {
    chordAdditions |= 0x01000000;
  }
  if (octave[chordRoot + 11]) {
    chordAdditions |= 0x04000000;
  }
  if (octave[chordRoot + 2]) {
    chordAdditions |= 0x02000000;
  }
  chordRoot %= 12;
  if (chordType == 0) {
    return -1;
  }
  return chordRoot | chordType | chordAdditions | (lowestNote << 16);
}


x86 assembly (clang, -O0):
<muGuessChord>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x3e7,-0x88(%rbp)
movl   $0x3e7,-0x8c(%rbp)
movl   $0x0,-0x90(%rbp)
movl   $0x0,-0x94(%rbp)
movl   $0x0,-0x98(%rbp)
movl   $0x0,-0x84(%rbp)
cmpl   $0x18,-0x84(%rbp)
jge    1181 <muGuessChord+0x81>
movslq -0x84(%rbp),%rax
movl   $0x0,-0x80(%rbp,%rax,4)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    1151 <muGuessChord+0x51>
mov    -0x18(%rbp),%eax
mov    %eax,-0x84(%rbp)
mov    -0x84(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jg     125b <muGuessChord+0x15b>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x7,%ecx
add    -0x84(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     1242 <muGuessChord+0x142>
mov    -0x84(%rbp),%eax
cmp    -0x88(%rbp),%eax
jge    11d4 <muGuessChord+0xd4>
mov    -0x84(%rbp),%eax
mov    %eax,-0x88(%rbp)
mov    -0x84(%rbp),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
mov    -0x80(%rbp,%rax,4),%ecx
add    $0x1,%ecx
mov    %ecx,-0x80(%rbp,%rax,4)
mov    -0x84(%rbp),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
add    $0xc,%edx
movslq %edx,%rax
mov    -0x80(%rbp,%rax,4),%ecx
add    $0x1,%ecx
mov    %ecx,-0x80(%rbp,%rax,4)
mov    -0x84(%rbp),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
cmp    -0x8c(%rbp),%edx
jge    123d <muGuessChord+0x13d>
mov    -0x84(%rbp),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
mov    %edx,-0x8c(%rbp)
jmp    1242 <muGuessChord+0x142>
jmp    1247 <muGuessChord+0x147>
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    118a <muGuessChord+0x8a>
cmpl   $0x3e7,-0x88(%rbp)
jne    1277 <muGuessChord+0x177>
movl   $0xffffffff,-0x4(%rbp)
jmp    15fb <muGuessChord+0x4fb>
mov    -0x88(%rbp),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
mov    %edx,-0x88(%rbp)
mov    -0x8c(%rbp),%eax
add    $0x3,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     12d5 <muGuessChord+0x1d5>
mov    -0x8c(%rbp),%eax
add    $0x8,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     12d5 <muGuessChord+0x1d5>
mov    -0x8c(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x90(%rbp)
movl   $0x100,-0x94(%rbp)
jmp    1539 <muGuessChord+0x439>
mov    -0x8c(%rbp),%eax
add    $0x5,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     131f <muGuessChord+0x21f>
mov    -0x8c(%rbp),%eax
add    $0x9,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     131f <muGuessChord+0x21f>
mov    -0x8c(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x90(%rbp)
movl   $0x100,-0x94(%rbp)
jmp    1534 <muGuessChord+0x434>
mov    -0x8c(%rbp),%eax
add    $0x4,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1366 <muGuessChord+0x266>
mov    -0x8c(%rbp),%eax
add    $0x7,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1366 <muGuessChord+0x266>
mov    -0x8c(%rbp),%eax
mov    %eax,-0x90(%rbp)
movl   $0x100,-0x94(%rbp)
jmp    152f <muGuessChord+0x42f>
mov    -0x8c(%rbp),%eax
add    $0x4,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     13b0 <muGuessChord+0x2b0>
mov    -0x8c(%rbp),%eax
add    $0x9,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     13b0 <muGuessChord+0x2b0>
mov    -0x8c(%rbp),%eax
add    $0x9,%eax
mov    %eax,-0x90(%rbp)
movl   $0x200,-0x94(%rbp)
jmp    152a <muGuessChord+0x42a>
mov    -0x8c(%rbp),%eax
add    $0x5,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     13fa <muGuessChord+0x2fa>
mov    -0x8c(%rbp),%eax
add    $0x8,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     13fa <muGuessChord+0x2fa>
mov    -0x8c(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x90(%rbp)
movl   $0x200,-0x94(%rbp)
jmp    1525 <muGuessChord+0x425>
mov    -0x8c(%rbp),%eax
add    $0x3,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1441 <muGuessChord+0x341>
mov    -0x8c(%rbp),%eax
add    $0x7,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1441 <muGuessChord+0x341>
mov    -0x8c(%rbp),%eax
mov    %eax,-0x90(%rbp)
movl   $0x200,-0x94(%rbp)
jmp    1520 <muGuessChord+0x420>
mov    -0x8c(%rbp),%eax
add    $0x3,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1488 <muGuessChord+0x388>
mov    -0x8c(%rbp),%eax
add    $0x6,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1488 <muGuessChord+0x388>
mov    -0x88(%rbp),%eax
mov    %eax,-0x90(%rbp)
movl   $0x400,-0x94(%rbp)
jmp    151b <muGuessChord+0x41b>
mov    -0x8c(%rbp),%eax
add    $0x6,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     14cf <muGuessChord+0x3cf>
mov    -0x8c(%rbp),%eax
add    $0x9,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     14cf <muGuessChord+0x3cf>
mov    -0x88(%rbp),%eax
mov    %eax,-0x90(%rbp)
movl   $0x400,-0x94(%rbp)
jmp    1516 <muGuessChord+0x416>
mov    -0x8c(%rbp),%eax
add    $0x4,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1511 <muGuessChord+0x411>
mov    -0x8c(%rbp),%eax
add    $0x8,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1511 <muGuessChord+0x411>
mov    -0x88(%rbp),%eax
mov    %eax,-0x90(%rbp)
movl   $0x300,-0x94(%rbp)
jmp    1516 <muGuessChord+0x416>
jmp    151b <muGuessChord+0x41b>
jmp    1520 <muGuessChord+0x420>
jmp    1525 <muGuessChord+0x425>
jmp    152a <muGuessChord+0x42a>
jmp    152f <muGuessChord+0x42f>
jmp    1534 <muGuessChord+0x434>
jmp    1539 <muGuessChord+0x439>
mov    -0x90(%rbp),%eax
add    $0xa,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1560 <muGuessChord+0x460>
mov    -0x98(%rbp),%eax
or     $0x1000000,%eax
mov    %eax,-0x98(%rbp)
mov    -0x90(%rbp),%eax
add    $0xb,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     1587 <muGuessChord+0x487>
mov    -0x98(%rbp),%eax
or     $0x4000000,%eax
mov    %eax,-0x98(%rbp)
mov    -0x90(%rbp),%eax
add    $0x2,%eax
cltq
cmpl   $0x0,-0x80(%rbp,%rax,4)
je     15ae <muGuessChord+0x4ae>
mov    -0x98(%rbp),%eax
or     $0x2000000,%eax
mov    %eax,-0x98(%rbp)
mov    -0x90(%rbp),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
mov    %edx,-0x90(%rbp)
cmpl   $0x0,-0x94(%rbp)
jne    15db <muGuessChord+0x4db>
movl   $0xffffffff,-0x4(%rbp)
jmp    15fb <muGuessChord+0x4fb>
mov    -0x90(%rbp),%eax
or     -0x94(%rbp),%eax
or     -0x98(%rbp),%eax
mov    -0x88(%rbp),%ecx
shl    $0x10,%ecx
or     %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<muGuessChord>:
push   %r14
push   %rbx
xorps  %xmm0,%xmm0
movaps %xmm0,-0x18(%rsp)
movaps %xmm0,-0x28(%rsp)
movaps %xmm0,-0x38(%rsp)
movaps %xmm0,-0x48(%rsp)
movaps %xmm0,-0x58(%rsp)
movaps %xmm0,-0x68(%rsp)
mov    $0xffffffff,%eax
cmp    %ecx,%edx
jg     128d <muGuessChord+0x18d>
shl    $0x7,%esi
movslq %edx,%rdx
movslq %esi,%rsi
add    $0x1,%ecx
lea    (%rdi,%rsi,4),%r8
mov    $0x3e7,%r14d
mov    $0x3e7,%r10d
jmp    1158 <muGuessChord+0x58>
nop
add    $0x1,%rdx
cmp    %edx,%ecx
je     11a7 <muGuessChord+0xa7>
cmpl   $0x0,(%r8,%rdx,4)
je     1150 <muGuessChord+0x50>
movslq %r10d,%r10
cmp    %r10,%rdx
cmovl  %edx,%r10d
movslq %edx,%rbx
imul   $0x2aaaaaab,%rbx,%rsi
mov    %rsi,%rdi
shr    $0x3f,%rdi
shr    $0x21,%rsi
add    %edi,%esi
shl    $0x2,%esi
lea    (%rsi,%rsi,2),%esi
mov    %ebx,%edi
sub    %esi,%edi
movslq %edi,%rdi
addl   $0x1,-0x68(%rsp,%rdi,4)
neg    %esi
add    %ebx,%esi
add    $0xc,%esi
addl   $0x1,-0x68(%rsp,%rsi,4)
cmp    %r14d,%edi
cmovl  %edi,%r14d
jmp    1150 <muGuessChord+0x50>
cmp    $0x3e7,%r10d
je     128d <muGuessChord+0x18d>
movslq %r10d,%rcx
imul   $0x2aaaaaab,%rcx,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
shr    $0x21,%rcx
add    %edx,%ecx
shl    $0x2,%ecx
lea    (%rcx,%rcx,2),%ecx
sub    %ecx,%r10d
movslq %r14d,%rcx
mov    -0x5c(%rsp,%rcx,4),%edi
test   %edi,%edi
je     11ec <muGuessChord+0xec>
cmpl   $0x0,-0x48(%rsp,%rcx,4)
je     11ec <muGuessChord+0xec>
add    $0x8,%r14d
jmp    121f <muGuessChord+0x11f>
lea    0x5(%r14),%ebx
mov    -0x54(%rsp,%rcx,4),%edx
test   %edx,%edx
je     120a <muGuessChord+0x10a>
cmpl   $0x0,-0x44(%rsp,%rcx,4)
je     120a <muGuessChord+0x10a>
mov    $0x100,%r8d
xor    %r9d,%r9d
jmp    122b <muGuessChord+0x12b>
mov    -0x58(%rsp,%rcx,4),%r11d
test   %r11d,%r11d
je     12a4 <muGuessChord+0x1a4>
cmpl   $0x0,-0x4c(%rsp,%rcx,4)
je     1291 <muGuessChord+0x191>
mov    $0x100,%r8d
xor    %r9d,%r9d
mov    %r14d,%ebx
movslq %ebx,%rcx
xor    %esi,%esi
cmpl   $0x0,-0x40(%rsp,%rcx,4)
setne  %sil
shl    $0x18,%esi
lea    0xb(%rcx),%edx
cmpl   $0x0,-0x68(%rsp,%rdx,4)
lea    0x4000000(%rsi),%edx
cmove  %esi,%edx
test   %r9b,%r9b
jne    128d <muGuessChord+0x18d>
mov    %edx,%eax
or     $0x2000000,%eax
cmpl   $0x0,-0x60(%rsp,%rcx,4)
cmove  %edx,%eax
imul   $0x2aaaaaab,%rcx,%rdx
mov    %rdx,%rsi
shr    $0x3f,%rsi
shr    $0x21,%rdx
add    %esi,%edx
shl    $0x2,%edx
lea    (%rdx,%rdx,2),%edx
sub    %edx,%ecx
shl    $0x10,%r10d
or     %ecx,%r10d
or     %r8d,%r10d
or     %eax,%r10d
mov    %r10d,%eax
pop    %rbx
pop    %r14
ret
cmpl   $0x0,-0x44(%rsp,%rcx,4)
je     12a4 <muGuessChord+0x1a4>
add    $0x9,%r14d
mov    $0x200,%r8d
jmp    1225 <muGuessChord+0x125>
test   %edx,%edx
je     12bd <muGuessChord+0x1bd>
cmpl   $0x0,-0x48(%rsp,%rcx,4)
je     12bd <muGuessChord+0x1bd>
mov    $0x200,%r8d
xor    %r9d,%r9d
jmp    122b <muGuessChord+0x12b>
test   %edi,%edi
je     12d3 <muGuessChord+0x1d3>
cmpl   $0x0,-0x4c(%rsp,%rcx,4)
je     12dc <muGuessChord+0x1dc>
mov    $0x200,%r8d
jmp    1225 <muGuessChord+0x125>
add    $0x6,%r14d
movslq %r14d,%rdx
jmp    12ef <muGuessChord+0x1ef>
cmpl   $0x0,-0x50(%rsp,%rcx,4)
je     12eb <muGuessChord+0x1eb>
mov    $0x400,%r8d
jmp    1333 <muGuessChord+0x233>
lea    0x6(%rcx),%rdx
cmpl   $0x0,-0x68(%rsp,%rdx,4)
je     1321 <muGuessChord+0x221>
mov    -0x44(%rsp,%rcx,4),%ebx
xor    %r8d,%r8d
test   %ebx,%ebx
setne  %r8b
shl    $0xa,%r8d
test   %ebx,%ebx
sete   %r9b
cmovne %r10d,%ebx
jne    122b <muGuessChord+0x12b>
test   %r11d,%r11d
jne    1326 <muGuessChord+0x226>
jmp    122b <muGuessChord+0x12b>
test   %r11d,%r11d
je     133e <muGuessChord+0x23e>
cmpl   $0x0,-0x48(%rsp,%rcx,4)
je     133e <muGuessChord+0x23e>
mov    $0x300,%r8d
xor    %r9d,%r9d
mov    %r10d,%ebx
jmp    122b <muGuessChord+0x12b>
mov    $0x1,%r9b
xor    %ebx,%ebx
xor    %r8d,%r8d
jmp    122b <muGuessChord+0x12b>

LLVM IR (-O0):
define i32 @muGuessChord(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 [24 x i32]
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
store i32* %0, i32** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i32 999, i32* %12
store i32 999, i32* %13
store i32 0, i32* %14
store i32 0, i32* %15
store i32 0, i32* %16
store i32 0, i32* %11
br label %17
17: ; preds = %24, %4
%18 = load i32, i32* %11
%19 = icmp slt i32 %18, 24
br i1 %19, label %20, label %27
20: ; preds = %17
%21 = load i32, i32* %11
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %22
store i32 0, i32* %23
br label %24
24: ; preds = %20
%25 = load i32, i32* %11
%26 = add nsw i32 %25, 1
store i32 %26, i32* %11
br label %17
27: ; preds = %17
%28 = load i32, i32* %8
store i32 %28, i32* %11
br label %29
29: ; preds = %72, %27
%30 = load i32, i32* %11
%31 = load i32, i32* %9
%32 = icmp sle i32 %30, %31
br i1 %32, label %33, label %75
33: ; preds = %29
%34 = load i32*, i32** %6
%35 = load i32, i32* %7
%36 = mul nsw i32 %35, 128
%37 = load i32, i32* %11
%38 = add nsw i32 %36, %37
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i32, i32* %34, i64 %39
%41 = load i32, i32* %40
%42 = icmp ne i32 %41, 0
br i1 %42, label %43, label %71
43: ; preds = %33
%44 = load i32, i32* %11
%45 = load i32, i32* %12
%46 = icmp slt i32 %44, %45
br i1 %46, label %47, label %49
47: ; preds = %43
%48 = load i32, i32* %11
store i32 %48, i32* %12
br label %49
49: ; preds = %47, %43
%50 = load i32, i32* %11
%51 = srem i32 %50, 12
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %52
%54 = load i32, i32* %53
%55 = add nsw i32 %54, 1
store i32 %55, i32* %53
%56 = load i32, i32* %11
%57 = srem i32 %56, 12
%58 = add nsw i32 %57, 12
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %59
%61 = load i32, i32* %60
%62 = add nsw i32 %61, 1
store i32 %62, i32* %60
%63 = load i32, i32* %11
%64 = srem i32 %63, 12
%65 = load i32, i32* %13
%66 = icmp slt i32 %64, %65
br i1 %66, label %67, label %70
67: ; preds = %49
%68 = load i32, i32* %11
%69 = srem i32 %68, 12
store i32 %69, i32* %13
br label %70
70: ; preds = %67, %49
br label %71
71: ; preds = %70, %33
br label %72
72: ; preds = %71
%73 = load i32, i32* %11
%74 = add nsw i32 %73, 1
store i32 %74, i32* %11
br label %29
75: ; preds = %29
%76 = load i32, i32* %12
%77 = icmp eq i32 %76, 999
br i1 %77, label %78, label %79
78: ; preds = %75
store i32 -1, i32* %5
br label %282
79: ; preds = %75
%80 = load i32, i32* %12
%81 = srem i32 %80, 12
store i32 %81, i32* %12
%82 = load i32, i32* %13
%83 = add nsw i32 %82, 3
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %84
%86 = load i32, i32* %85
%87 = icmp ne i32 %86, 0
br i1 %87, label %88, label %98
88: ; preds = %79
%89 = load i32, i32* %13
%90 = add nsw i32 %89, 8
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %91
%93 = load i32, i32* %92
%94 = icmp ne i32 %93, 0
br i1 %94, label %95, label %98
95: ; preds = %88
%96 = load i32, i32* %13
%97 = add nsw i32 %96, 8
store i32 %97, i32* %14
store i32 256, i32* %15
br label %237
98: ; preds = %88, %79
%99 = load i32, i32* %13
%100 = add nsw i32 %99, 5
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %101
%103 = load i32, i32* %102
%104 = icmp ne i32 %103, 0
br i1 %104, label %105, label %115
105: ; preds = %98
%106 = load i32, i32* %13
%107 = add nsw i32 %106, 9
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %108
%110 = load i32, i32* %109
%111 = icmp ne i32 %110, 0
br i1 %111, label %112, label %115
112: ; preds = %105
%113 = load i32, i32* %13
%114 = add nsw i32 %113, 5
store i32 %114, i32* %14
store i32 256, i32* %15
br label %236
115: ; preds = %105, %98
%116 = load i32, i32* %13
%117 = add nsw i32 %116, 4
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %118
%120 = load i32, i32* %119
%121 = icmp ne i32 %120, 0
br i1 %121, label %122, label %131
122: ; preds = %115
%123 = load i32, i32* %13
%124 = add nsw i32 %123, 7
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %125
%127 = load i32, i32* %126
%128 = icmp ne i32 %127, 0
br i1 %128, label %129, label %131
129: ; preds = %122
%130 = load i32, i32* %13
store i32 %130, i32* %14
store i32 256, i32* %15
br label %235
131: ; preds = %122, %115
%132 = load i32, i32* %13
%133 = add nsw i32 %132, 4
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %134
%136 = load i32, i32* %135
%137 = icmp ne i32 %136, 0
br i1 %137, label %138, label %148
138: ; preds = %131
%139 = load i32, i32* %13
%140 = add nsw i32 %139, 9
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %141
%143 = load i32, i32* %142
%144 = icmp ne i32 %143, 0
br i1 %144, label %145, label %148
145: ; preds = %138
%146 = load i32, i32* %13
%147 = add nsw i32 %146, 9
store i32 %147, i32* %14
store i32 512, i32* %15
br label %234
148: ; preds = %138, %131
%149 = load i32, i32* %13
%150 = add nsw i32 %149, 5
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %151
%153 = load i32, i32* %152
%154 = icmp ne i32 %153, 0
br i1 %154, label %155, label %165
155: ; preds = %148
%156 = load i32, i32* %13
%157 = add nsw i32 %156, 8
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %158
%160 = load i32, i32* %159
%161 = icmp ne i32 %160, 0
br i1 %161, label %162, label %165
162: ; preds = %155
%163 = load i32, i32* %13
%164 = add nsw i32 %163, 5
store i32 %164, i32* %14
store i32 512, i32* %15
br label %233
165: ; preds = %155, %148
%166 = load i32, i32* %13
%167 = add nsw i32 %166, 3
%168 = sext i32 %167 to i64
%169 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %168
%170 = load i32, i32* %169
%171 = icmp ne i32 %170, 0
br i1 %171, label %172, label %181
172: ; preds = %165
%173 = load i32, i32* %13
%174 = add nsw i32 %173, 7
%175 = sext i32 %174 to i64
%176 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %175
%177 = load i32, i32* %176
%178 = icmp ne i32 %177, 0
br i1 %178, label %179, label %181
179: ; preds = %172
%180 = load i32, i32* %13
store i32 %180, i32* %14
store i32 512, i32* %15
br label %232
181: ; preds = %172, %165
%182 = load i32, i32* %13
%183 = add nsw i32 %182, 3
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %184
%186 = load i32, i32* %185
%187 = icmp ne i32 %186, 0
br i1 %187, label %188, label %197
188: ; preds = %181
%189 = load i32, i32* %13
%190 = add nsw i32 %189, 6
%191 = sext i32 %190 to i64
%192 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %191
%193 = load i32, i32* %192
%194 = icmp ne i32 %193, 0
br i1 %194, label %195, label %197
195: ; preds = %188
%196 = load i32, i32* %12
store i32 %196, i32* %14
store i32 1024, i32* %15
br label %231
197: ; preds = %188, %181
%198 = load i32, i32* %13
%199 = add nsw i32 %198, 6
%200 = sext i32 %199 to i64
%201 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %200
%202 = load i32, i32* %201
%203 = icmp ne i32 %202, 0
br i1 %203, label %204, label %213
204: ; preds = %197
%205 = load i32, i32* %13
%206 = add nsw i32 %205, 9
%207 = sext i32 %206 to i64
%208 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %207
%209 = load i32, i32* %208
%210 = icmp ne i32 %209, 0
br i1 %210, label %211, label %213
211: ; preds = %204
%212 = load i32, i32* %12
store i32 %212, i32* %14
store i32 1024, i32* %15
br label %230
213: ; preds = %204, %197
%214 = load i32, i32* %13
%215 = add nsw i32 %214, 4
%216 = sext i32 %215 to i64
%217 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %216
%218 = load i32, i32* %217
%219 = icmp ne i32 %218, 0
br i1 %219, label %220, label %229
220: ; preds = %213
%221 = load i32, i32* %13
%222 = add nsw i32 %221, 8
%223 = sext i32 %222 to i64
%224 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %223
%225 = load i32, i32* %224
%226 = icmp ne i32 %225, 0
br i1 %226, label %227, label %229
227: ; preds = %220
%228 = load i32, i32* %12
store i32 %228, i32* %14
store i32 768, i32* %15
br label %229
229: ; preds = %227, %220, %213
br label %230
230: ; preds = %229, %211
br label %231
231: ; preds = %230, %195
br label %232
232: ; preds = %231, %179
br label %233
233: ; preds = %232, %162
br label %234
234: ; preds = %233, %145
br label %235
235: ; preds = %234, %129
br label %236
236: ; preds = %235, %112
br label %237
237: ; preds = %236, %95
%238 = load i32, i32* %14
%239 = add nsw i32 %238, 10
%240 = sext i32 %239 to i64
%241 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %240
%242 = load i32, i32* %241
%243 = icmp ne i32 %242, 0
br i1 %243, label %244, label %247
244: ; preds = %237
%245 = load i32, i32* %16
%246 = or i32 %245, 16777216
store i32 %246, i32* %16
br label %247
247: ; preds = %244, %237
%248 = load i32, i32* %14
%249 = add nsw i32 %248, 11
%250 = sext i32 %249 to i64
%251 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %250
%252 = load i32, i32* %251
%253 = icmp ne i32 %252, 0
br i1 %253, label %254, label %257
254: ; preds = %247
%255 = load i32, i32* %16
%256 = or i32 %255, 67108864
store i32 %256, i32* %16
br label %257
257: ; preds = %254, %247
%258 = load i32, i32* %14
%259 = add nsw i32 %258, 2
%260 = sext i32 %259 to i64
%261 = getelementptr inbounds [24 x i32], [24 x i32]* %10, i64 0, i64 %260
%262 = load i32, i32* %261
%263 = icmp ne i32 %262, 0
br i1 %263, label %264, label %267
264: ; preds = %257
%265 = load i32, i32* %16
%266 = or i32 %265, 33554432
store i32 %266, i32* %16
br label %267
267: ; preds = %264, %257
%268 = load i32, i32* %14
%269 = srem i32 %268, 12
store i32 %269, i32* %14
%270 = load i32, i32* %15
%271 = icmp eq i32 %270, 0
br i1 %271, label %272, label %273
272: ; preds = %267
store i32 -1, i32* %5
br label %282
273: ; preds = %267
%274 = load i32, i32* %14
%275 = load i32, i32* %15
%276 = or i32 %274, %275
%277 = load i32, i32* %16
%278 = or i32 %276, %277
%279 = load i32, i32* %12
%280 = shl i32 %279, 16
%281 = or i32 %278, %280
store i32 %281, i32* %5
br label %282
282: ; preds = %273, %272, %78
%283 = load i32, i32* %5
ret i32 %283
}

LLVM IR (-O2):
define i32 @muGuessChord(i32* nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca [24 x i32]
%6 = bitcast [24 x i32]* %5 to i8*
%7 = icmp sgt i32 %2, %3
br i1 %7, label %165, label %8
8: ; preds = %4
%9 = shl nsw i32 %1, 7
%10 = sext i32 %2 to i64
%11 = sext i32 %9 to i64
%12 = add i32 %3, 1
br label %13
13: ; preds = %8, %38
%14 = phi i64 [ %10, %8 ], [ %41, %38 ]
%15 = phi i32 [ 999, %8 ], [ %40, %38 ]
%16 = phi i32 [ 999, %8 ], [ %39, %38 ]
%17 = add nsw i64 %14, %11
%18 = getelementptr inbounds i32, i32* %0, i64 %17
%19 = load i32, i32* %18
%20 = icmp eq i32 %19, 0
br i1 %20, label %38, label %21
21: ; preds = %13
%22 = sext i32 %16 to i64
%23 = icmp slt i64 %14, %22
%24 = trunc i64 %14 to i32
%25 = select i1 %23, i32 %24, i32 %16
%26 = srem i32 %24, 12
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %27
%29 = load i32, i32* %28
%30 = add nsw i32 %29, 1
store i32 %30, i32* %28
%31 = add nsw i32 %26, 12
%32 = zext i32 %31 to i64
%33 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %32
%34 = load i32, i32* %33
%35 = add nsw i32 %34, 1
store i32 %35, i32* %33
%36 = icmp slt i32 %26, %15
%37 = select i1 %36, i32 %26, i32 %15
br label %38
38: ; preds = %21, %13
%39 = phi i32 [ %16, %13 ], [ %25, %21 ]
%40 = phi i32 [ %15, %13 ], [ %37, %21 ]
%41 = add nsw i64 %14, 1
%42 = trunc i64 %41 to i32
%43 = icmp eq i32 %12, %42
br i1 %43, label %44, label %13
44: ; preds = %38
%45 = icmp eq i32 %39, 999
br i1 %45, label %165, label %46
46: ; preds = %44
%47 = srem i32 %39, 12
%48 = add nsw i32 %40, 3
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %49
%51 = load i32, i32* %50
%52 = icmp eq i32 %51, 0
br i1 %52, label %59, label %53
53: ; preds = %46
%54 = add nsw i32 %40, 8
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %55
%57 = load i32, i32* %56
%58 = icmp eq i32 %57, 0
br i1 %58, label %59, label %135
59: ; preds = %53, %46
%60 = add nsw i32 %40, 5
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %61
%63 = load i32, i32* %62
%64 = icmp eq i32 %63, 0
br i1 %64, label %71, label %65
65: ; preds = %59
%66 = add nsw i32 %40, 9
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %67
%69 = load i32, i32* %68
%70 = icmp eq i32 %69, 0
br i1 %70, label %71, label %135
71: ; preds = %65, %59
%72 = add nsw i32 %40, 4
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %73
%75 = load i32, i32* %74
%76 = icmp eq i32 %75, 0
br i1 %76, label %89, label %77
77: ; preds = %71
%78 = add nsw i32 %40, 7
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %79
%81 = load i32, i32* %80
%82 = icmp eq i32 %81, 0
br i1 %82, label %83, label %135
83: ; preds = %77
%84 = add nsw i32 %40, 9
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %85
%87 = load i32, i32* %86
%88 = icmp eq i32 %87, 0
br i1 %88, label %89, label %135
89: ; preds = %71, %83
br i1 %64, label %96, label %90
90: ; preds = %89
%91 = add nsw i32 %40, 8
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %92
%94 = load i32, i32* %93
%95 = icmp eq i32 %94, 0
br i1 %95, label %96, label %135
96: ; preds = %90, %89
br i1 %52, label %97, label %100
97: ; preds = %96
%98 = add nsw i32 %40, 6
%99 = sext i32 %98 to i64
br label %112
100: ; preds = %96
%101 = add nsw i32 %40, 7
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %102
%104 = load i32, i32* %103
%105 = icmp eq i32 %104, 0
br i1 %105, label %106, label %135
106: ; preds = %100
%107 = add nsw i32 %40, 6
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %108
%110 = load i32, i32* %109
%111 = icmp eq i32 %110, 0
br i1 %111, label %112, label %135
112: ; preds = %97, %106
%113 = phi i64 [ %99, %97 ], [ %108, %106 ]
%114 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %113
%115 = load i32, i32* %114
%116 = icmp eq i32 %115, 0
br i1 %116, label %127, label %117
117: ; preds = %112
%118 = add nsw i32 %40, 9
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %119
%121 = load i32, i32* %120
%122 = icmp ne i32 %121, 0
%123 = select i1 %122, i1 true, i1 %76
%124 = select i1 %122, i32 %47, i32 0
%125 = xor i1 %122, true
%126 = select i1 %122, i32 1024, i32 0
br i1 %123, label %135, label %128
127: ; preds = %112
br i1 %76, label %135, label %128
128: ; preds = %117, %127
%129 = add nsw i32 %40, 8
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %130
%132 = load i32, i32* %131
%133 = icmp eq i32 %132, 0
br i1 %133, label %135, label %134
134: ; preds = %128
br label %135
135: ; preds = %117, %106, %100, %90, %83, %77, %65, %53, %134, %128, %127
%136 = phi i32 [ %47, %134 ], [ 0, %128 ], [ 0, %127 ], [ %54, %53 ], [ %60, %65 ], [ %40, %77 ], [ %84, %83 ], [ %60, %90 ], [ %40, %100 ], [ %47, %106 ], [ %124, %117 ]
%137 = phi i1 [ false, %134 ], [ true, %128 ], [ true, %127 ], [ false, %53 ], [ false, %65 ], [ false, %77 ], [ false, %83 ], [ false, %90 ], [ false, %100 ], [ false, %106 ], [ %125, %117 ]
%138 = phi i32 [ 768, %134 ], [ 0, %128 ], [ 0, %127 ], [ 256, %53 ], [ 256, %65 ], [ 256, %77 ], [ 512, %83 ], [ 512, %90 ], [ 512, %100 ], [ 1024, %106 ], [ %126, %117 ]
%139 = add nsw i32 %136, 10
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %140
%142 = load i32, i32* %141
%143 = icmp eq i32 %142, 0
%144 = select i1 %143, i32 0, i32 16777216
%145 = add nsw i32 %136, 11
%146 = zext i32 %145 to i64
%147 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %146
%148 = load i32, i32* %147
%149 = icmp eq i32 %148, 0
%150 = or i32 %144, 67108864
%151 = select i1 %149, i32 %144, i32 %150
br i1 %137, label %165, label %152
152: ; preds = %135
%153 = add nsw i32 %136, 2
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds [24 x i32], [24 x i32]* %5, i64 0, i64 %154
%156 = load i32, i32* %155
%157 = icmp eq i32 %156, 0
%158 = or i32 %151, 33554432
%159 = select i1 %157, i32 %151, i32 %158
%160 = srem i32 %136, 12
%161 = shl nsw i32 %47, 16
%162 = or i32 %160, %161
%163 = or i32 %162, %138
%164 = or i32 %163, %159
br label %165
165: ; preds = %4, %135, %44, %152
%166 = phi i32 [ %164, %152 ], [ -1, %44 ], [ -1, %135 ], [ -1, %4 ]
ret i32 %166
}