void future_move_rook(int px, int py, int fm[][2], char ***pp) {
  int i, j, k = 0;
  j = py;
  for (i = px + 1; i < 8; i++) {
    if (pp[px][py][0] == pp[i][j][0])
      break;
    else if (pp[i][j][0] == '\0') {
      fm[k][0] = i;
      fm[k][1] = j;
      k++;
    } else {
      fm[k][0] = i;
      fm[k][1] = j;
      k++;
      break;
    }
  }
  for (i = px - 1; i > -1; i--) {
    if (pp[px][py][0] == pp[i][j][0])
      break;
    else if (pp[i][j][0] == '\0') {
      fm[k][0] = i;
      fm[k][1] = j;
      k++;
    } else {
      fm[k][0] = i;
      fm[k][1] = j;
      k++;
      break;
    }
  }
  i = px;
  for (j = py + 1; j < 8; j++) {
    if (pp[px][py][0] == pp[i][j][0])
      break;
    else if (pp[i][j][0] == '\0') {
      fm[k][0] = i;
      fm[k][1] = j;
      k++;
    } else {
      fm[k][0] = i;
      fm[k][1] = j;
      k++;
      break;
    }
  }
  for (j = py - 1; j > -1; j--) {
    if (pp[px][py][0] == pp[i][j][0])
      break;
    else if (pp[i][j][0] == '\0') {
      fm[k][0] = i;
      fm[k][1] = j;
      k++;
    } else {
      fm[k][0] = i;
      fm[k][1] = j;
      k++;
      break;
    }
  }
  fm[14][0] = k;
}


x86 assembly (clang, -O0):
<future_move_rook>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x8,-0x1c(%rbp)
jge    11fb <future_move_rook+0xfb>
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movslq -0x20(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    116d <future_move_rook+0x6d>
jmp    11fb <future_move_rook+0xfb>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11b8 <future_move_rook+0xb8>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,8)
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,0x4(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11e3 <future_move_rook+0xe3>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,8)
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,0x4(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11fb <future_move_rook+0xfb>
jmp    11e8 <future_move_rook+0xe8>
jmp    11ed <future_move_rook+0xed>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1128 <future_move_rook+0x28>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0xffffffff,-0x1c(%rbp)
jle    12d7 <future_move_rook+0x1d7>
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movslq -0x20(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    1249 <future_move_rook+0x149>
jmp    12d7 <future_move_rook+0x1d7>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1294 <future_move_rook+0x194>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,8)
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,0x4(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12bf <future_move_rook+0x1bf>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,8)
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,0x4(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12d7 <future_move_rook+0x1d7>
jmp    12c4 <future_move_rook+0x1c4>
jmp    12c9 <future_move_rook+0x1c9>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
jmp    1204 <future_move_rook+0x104>
mov    -0x4(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x8,-0x20(%rbp)
jge    13b9 <future_move_rook+0x2b9>
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movslq -0x20(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    132b <future_move_rook+0x22b>
jmp    13b9 <future_move_rook+0x2b9>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1376 <future_move_rook+0x276>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,8)
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,0x4(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    13a1 <future_move_rook+0x2a1>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,8)
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,0x4(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    13b9 <future_move_rook+0x2b9>
jmp    13a6 <future_move_rook+0x2a6>
jmp    13ab <future_move_rook+0x2ab>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12e6 <future_move_rook+0x1e6>
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0xffffffff,-0x20(%rbp)
jle    1495 <future_move_rook+0x395>
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movslq -0x20(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    1407 <future_move_rook+0x307>
jmp    1495 <future_move_rook+0x395>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1452 <future_move_rook+0x352>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,8)
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,0x4(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    147d <future_move_rook+0x37d>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,8)
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,0x4(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1495 <future_move_rook+0x395>
jmp    1482 <future_move_rook+0x382>
jmp    1487 <future_move_rook+0x387>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    13c2 <future_move_rook+0x2c2>
mov    -0x24(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x70(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<future_move_rook>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
movabs $0x100000000,%r13
xor    %r11d,%r11d
mov    %edi,%r12d
movslq %esi,%r10
movslq %edi,%r9
cmp    $0x6,%edi
jg     1191 <future_move_rook+0x91>
mov    (%rcx,%r9,8),%rax
mov    (%rax,%r10,8),%r14
mov    $0x7,%r11d
sub    %r9d,%r11d
lea    (%rcx,%r9,8),%rbp
add    $0x8,%rbp
xor    %ebx,%ebx
mov    0x0(%rbp,%rbx,8),%rax
mov    (%rax,%r10,8),%rax
movzbl (%rax),%eax
cmp    %al,(%r14)
je     116e <future_move_rook+0x6e>
test   %al,%al
jne    117b <future_move_rook+0x7b>
lea    (%r12,%rbx,1),%eax
add    $0x1,%eax
mov    %eax,(%rdx,%rbx,8)
mov    %esi,0x4(%rdx,%rbx,8)
add    $0x1,%rbx
cmp    %rbx,%r11
jne    1140 <future_move_rook+0x40>
jmp    1171 <future_move_rook+0x71>
mov    %ebx,%r11d
test   %r12d,%r12d
jg     1191 <future_move_rook+0x91>
jmp    1206 <future_move_rook+0x106>
lea    (%rdi,%rbx,1),%eax
add    $0x1,%eax
mov    %eax,(%rdx,%rbx,8)
mov    %esi,0x4(%rdx,%rbx,8)
lea    0x1(%rbx),%r11d
test   %r12d,%r12d
jle    1206 <future_move_rook+0x106>
mov    (%rcx,%r12,8),%rax
mov    (%rax,%r10,8),%r14
movslq %r11d,%r8
lea    (%r8,%rdi,1),%r15d
lea    (%rdx,%r8,8),%rbp
add    $0x4,%rbp
shl    $0x20,%r8
nopl   0x0(%rax)
lea    -0x1(%r12),%rax
mov    %eax,%ebx
mov    (%rcx,%rbx,8),%rbx
mov    (%rbx,%r10,8),%rbx
movzbl (%rbx),%ebx
cmp    %bl,(%r14)
je     1206 <future_move_rook+0x106>
test   %bl,%bl
jne    11f1 <future_move_rook+0xf1>
mov    %eax,-0x4(%rbp)
mov    %esi,0x0(%rbp)
add    $0x1,%r11d
add    %r13,%r8
add    $0x8,%rbp
mov    %rax,%rbx
add    $0x1,%rbx
mov    %rax,%r12
cmp    $0x1,%rbx
ja     11b0 <future_move_rook+0xb0>
mov    %r15d,%r11d
jmp    1206 <future_move_rook+0x106>
add    $0xffffffff,%r12d
sar    $0x1d,%r8
mov    %r12d,(%rdx,%r8,1)
mov    %esi,0x4(%rdx,%r8,1)
add    $0x1,%r11d
mov    %esi,%r14d
cmp    $0x6,%esi
mov    %r9,-0x8(%rsp)
jg     12bd <future_move_rook+0x1bd>
mov    (%rcx,%r9,8),%rbp
mov    0x0(%rbp,%r10,8),%r15
movslq %r11d,%rax
mov    %eax,%r9d
sub    %esi,%r9d
add    $0x7,%r9d
lea    (%rdx,%rax,8),%r12
add    $0x4,%r12
shl    $0x20,%rax
mov    $0x7,%r13d
sub    %r10,%r13
lea    0x8(,%r10,8),%r10
add    %rbp,%r10
xor    %ebp,%ebp
nop
mov    (%r10,%rbp,8),%rbx
movzbl (%rbx),%r8d
cmp    %r8b,(%r15)
je     128a <future_move_rook+0x18a>
test   %r8b,%r8b
jne    1292 <future_move_rook+0x192>
mov    %edi,-0x4(%r12,%rbp,8)
lea    (%r14,%rbp,1),%ebx
add    $0x1,%ebx
mov    %ebx,(%r12,%rbp,8)
add    $0x1,%rbp
movabs $0x100000000,%rbx
add    %rbx,%rax
cmp    %rbp,%r13
jne    1250 <future_move_rook+0x150>
jmp    12ab <future_move_rook+0x1ab>
add    %ebp,%r11d
mov    %r11d,%r9d
jmp    12ab <future_move_rook+0x1ab>
lea    (%rsi,%rbp,1),%ebx
add    $0x1,%ebx
sar    $0x1d,%rax
mov    %edi,(%rdx,%rax,1)
mov    %ebx,0x4(%rdx,%rax,1)
lea    (%r11,%rbp,1),%r9d
add    $0x1,%r9d
mov    %r9d,%r11d
test   %r14d,%r14d
movabs $0x100000000,%r13
jle    1330 <future_move_rook+0x230>
mov    -0x8(%rsp),%rax
mov    (%rcx,%rax,8),%r10
mov    (%r10,%r14,8),%r8
movslq %r11d,%rcx
add    %ecx,%esi
lea    (%rdx,%rcx,8),%rbp
add    $0x4,%rbp
shl    $0x20,%rcx
mov    %r11d,%r9d
xchg   %ax,%ax
lea    -0x1(%r14),%rax
mov    %eax,%ebx
mov    (%r10,%rbx,8),%rbx
movzbl (%rbx),%ebx
cmp    %bl,(%r8)
je     1330 <future_move_rook+0x230>
test   %bl,%bl
jne    131c <future_move_rook+0x21c>
mov    %edi,-0x4(%rbp)
mov    %eax,0x0(%rbp)
add    $0x1,%r9d
add    %r13,%rcx
add    $0x8,%rbp
mov    %rax,%rbx
add    $0x1,%rbx
mov    %rax,%r14
cmp    $0x1,%rbx
ja     12e0 <future_move_rook+0x1e0>
mov    %esi,%r9d
jmp    1330 <future_move_rook+0x230>
add    $0xffffffff,%r14d
sar    $0x1d,%rcx
mov    %edi,(%rdx,%rcx,1)
mov    %r14d,0x4(%rdx,%rcx,1)
add    $0x1,%r9d
mov    %r9d,0x70(%rdx)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @future_move_rook(i32 %0, i32 %1, [2 x i32]* %2, i8*** %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca [2 x i32]*
%8 = alloca i8***
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store [2 x i32]* %2, [2 x i32]** %7
store i8*** %3, i8**** %8
store i32 0, i32* %11
%12 = load i32, i32* %6
store i32 %12, i32* %10
%13 = load i32, i32* %5
%14 = add nsw i32 %13, 1
store i32 %14, i32* %9
br label %15
15: ; preds = %91, %4
%16 = load i32, i32* %9
%17 = icmp slt i32 %16, 8
br i1 %17, label %18, label %94
18: ; preds = %15
%19 = load i8***, i8**** %8
%20 = load i32, i32* %5
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i8**, i8*** %19, i64 %21
%23 = load i8**, i8*** %22
%24 = load i32, i32* %6
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8*, i8** %23, i64 %25
%27 = load i8*, i8** %26
%28 = getelementptr inbounds i8, i8* %27, i64 0
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = load i8***, i8**** %8
%32 = load i32, i32* %9
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i8**, i8*** %31, i64 %33
%35 = load i8**, i8*** %34
%36 = load i32, i32* %10
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i8*, i8** %35, i64 %37
%39 = load i8*, i8** %38
%40 = getelementptr inbounds i8, i8* %39, i64 0
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = icmp eq i32 %30, %42
br i1 %43, label %44, label %45
44: ; preds = %18
br label %94
45: ; preds = %18
%46 = load i8***, i8**** %8
%47 = load i32, i32* %9
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8**, i8*** %46, i64 %48
%50 = load i8**, i8*** %49
%51 = load i32, i32* %10
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i8*, i8** %50, i64 %52
%54 = load i8*, i8** %53
%55 = getelementptr inbounds i8, i8* %54, i64 0
%56 = load i8, i8* %55
%57 = sext i8 %56 to i32
%58 = icmp eq i32 %57, 0
br i1 %58, label %59, label %74
59: ; preds = %45
%60 = load i32, i32* %9
%61 = load [2 x i32]*, [2 x i32]** %7
%62 = load i32, i32* %11
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds [2 x i32], [2 x i32]* %61, i64 %63
%65 = getelementptr inbounds [2 x i32], [2 x i32]* %64, i64 0, i64 0
store i32 %60, i32* %65
%66 = load i32, i32* %10
%67 = load [2 x i32]*, [2 x i32]** %7
%68 = load i32, i32* %11
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds [2 x i32], [2 x i32]* %67, i64 %69
%71 = getelementptr inbounds [2 x i32], [2 x i32]* %70, i64 0, i64 1
store i32 %66, i32* %71
%72 = load i32, i32* %11
%73 = add nsw i32 %72, 1
store i32 %73, i32* %11
br label %89
74: ; preds = %45
%75 = load i32, i32* %9
%76 = load [2 x i32]*, [2 x i32]** %7
%77 = load i32, i32* %11
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds [2 x i32], [2 x i32]* %76, i64 %78
%80 = getelementptr inbounds [2 x i32], [2 x i32]* %79, i64 0, i64 0
store i32 %75, i32* %80
%81 = load i32, i32* %10
%82 = load [2 x i32]*, [2 x i32]** %7
%83 = load i32, i32* %11
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds [2 x i32], [2 x i32]* %82, i64 %84
%86 = getelementptr inbounds [2 x i32], [2 x i32]* %85, i64 0, i64 1
store i32 %81, i32* %86
%87 = load i32, i32* %11
%88 = add nsw i32 %87, 1
store i32 %88, i32* %11
br label %94
89: ; preds = %59
br label %90
90: ; preds = %89
br label %91
91: ; preds = %90
%92 = load i32, i32* %9
%93 = add nsw i32 %92, 1
store i32 %93, i32* %9
br label %15
94: ; preds = %74, %44, %15
%95 = load i32, i32* %5
%96 = sub nsw i32 %95, 1
store i32 %96, i32* %9
br label %97
97: ; preds = %173, %94
%98 = load i32, i32* %9
%99 = icmp sgt i32 %98, -1
br i1 %99, label %100, label %176
100: ; preds = %97
%101 = load i8***, i8**** %8
%102 = load i32, i32* %5
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8**, i8*** %101, i64 %103
%105 = load i8**, i8*** %104
%106 = load i32, i32* %6
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds i8*, i8** %105, i64 %107
%109 = load i8*, i8** %108
%110 = getelementptr inbounds i8, i8* %109, i64 0
%111 = load i8, i8* %110
%112 = sext i8 %111 to i32
%113 = load i8***, i8**** %8
%114 = load i32, i32* %9
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds i8**, i8*** %113, i64 %115
%117 = load i8**, i8*** %116
%118 = load i32, i32* %10
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds i8*, i8** %117, i64 %119
%121 = load i8*, i8** %120
%122 = getelementptr inbounds i8, i8* %121, i64 0
%123 = load i8, i8* %122
%124 = sext i8 %123 to i32
%125 = icmp eq i32 %112, %124
br i1 %125, label %126, label %127
126: ; preds = %100
br label %176
127: ; preds = %100
%128 = load i8***, i8**** %8
%129 = load i32, i32* %9
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds i8**, i8*** %128, i64 %130
%132 = load i8**, i8*** %131
%133 = load i32, i32* %10
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds i8*, i8** %132, i64 %134
%136 = load i8*, i8** %135
%137 = getelementptr inbounds i8, i8* %136, i64 0
%138 = load i8, i8* %137
%139 = sext i8 %138 to i32
%140 = icmp eq i32 %139, 0
br i1 %140, label %141, label %156
141: ; preds = %127
%142 = load i32, i32* %9
%143 = load [2 x i32]*, [2 x i32]** %7
%144 = load i32, i32* %11
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds [2 x i32], [2 x i32]* %143, i64 %145
%147 = getelementptr inbounds [2 x i32], [2 x i32]* %146, i64 0, i64 0
store i32 %142, i32* %147
%148 = load i32, i32* %10
%149 = load [2 x i32]*, [2 x i32]** %7
%150 = load i32, i32* %11
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds [2 x i32], [2 x i32]* %149, i64 %151
%153 = getelementptr inbounds [2 x i32], [2 x i32]* %152, i64 0, i64 1
store i32 %148, i32* %153
%154 = load i32, i32* %11
%155 = add nsw i32 %154, 1
store i32 %155, i32* %11
br label %171
156: ; preds = %127
%157 = load i32, i32* %9
%158 = load [2 x i32]*, [2 x i32]** %7
%159 = load i32, i32* %11
%160 = sext i32 %159 to i64
%161 = getelementptr inbounds [2 x i32], [2 x i32]* %158, i64 %160
%162 = getelementptr inbounds [2 x i32], [2 x i32]* %161, i64 0, i64 0
store i32 %157, i32* %162
%163 = load i32, i32* %10
%164 = load [2 x i32]*, [2 x i32]** %7
%165 = load i32, i32* %11
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds [2 x i32], [2 x i32]* %164, i64 %166
%168 = getelementptr inbounds [2 x i32], [2 x i32]* %167, i64 0, i64 1
store i32 %163, i32* %168
%169 = load i32, i32* %11
%170 = add nsw i32 %169, 1
store i32 %170, i32* %11
br label %176
171: ; preds = %141
br label %172
172: ; preds = %171
br label %173
173: ; preds = %172
%174 = load i32, i32* %9
%175 = add nsw i32 %174, -1
store i32 %175, i32* %9
br label %97
176: ; preds = %156, %126, %97
%177 = load i32, i32* %5
store i32 %177, i32* %9
%178 = load i32, i32* %6
%179 = add nsw i32 %178, 1
store i32 %179, i32* %10
br label %180
180: ; preds = %256, %176
%181 = load i32, i32* %10
%182 = icmp slt i32 %181, 8
br i1 %182, label %183, label %259
183: ; preds = %180
%184 = load i8***, i8**** %8
%185 = load i32, i32* %5
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds i8**, i8*** %184, i64 %186
%188 = load i8**, i8*** %187
%189 = load i32, i32* %6
%190 = sext i32 %189 to i64
%191 = getelementptr inbounds i8*, i8** %188, i64 %190
%192 = load i8*, i8** %191
%193 = getelementptr inbounds i8, i8* %192, i64 0
%194 = load i8, i8* %193
%195 = sext i8 %194 to i32
%196 = load i8***, i8**** %8
%197 = load i32, i32* %9
%198 = sext i32 %197 to i64
%199 = getelementptr inbounds i8**, i8*** %196, i64 %198
%200 = load i8**, i8*** %199
%201 = load i32, i32* %10
%202 = sext i32 %201 to i64
%203 = getelementptr inbounds i8*, i8** %200, i64 %202
%204 = load i8*, i8** %203
%205 = getelementptr inbounds i8, i8* %204, i64 0
%206 = load i8, i8* %205
%207 = sext i8 %206 to i32
%208 = icmp eq i32 %195, %207
br i1 %208, label %209, label %210
209: ; preds = %183
br label %259
210: ; preds = %183
%211 = load i8***, i8**** %8
%212 = load i32, i32* %9
%213 = sext i32 %212 to i64
%214 = getelementptr inbounds i8**, i8*** %211, i64 %213
%215 = load i8**, i8*** %214
%216 = load i32, i32* %10
%217 = sext i32 %216 to i64
%218 = getelementptr inbounds i8*, i8** %215, i64 %217
%219 = load i8*, i8** %218
%220 = getelementptr inbounds i8, i8* %219, i64 0
%221 = load i8, i8* %220
%222 = sext i8 %221 to i32
%223 = icmp eq i32 %222, 0
br i1 %223, label %224, label %239
224: ; preds = %210
%225 = load i32, i32* %9
%226 = load [2 x i32]*, [2 x i32]** %7
%227 = load i32, i32* %11
%228 = sext i32 %227 to i64
%229 = getelementptr inbounds [2 x i32], [2 x i32]* %226, i64 %228
%230 = getelementptr inbounds [2 x i32], [2 x i32]* %229, i64 0, i64 0
store i32 %225, i32* %230
%231 = load i32, i32* %10
%232 = load [2 x i32]*, [2 x i32]** %7
%233 = load i32, i32* %11
%234 = sext i32 %233 to i64
%235 = getelementptr inbounds [2 x i32], [2 x i32]* %232, i64 %234
%236 = getelementptr inbounds [2 x i32], [2 x i32]* %235, i64 0, i64 1
store i32 %231, i32* %236
%237 = load i32, i32* %11
%238 = add nsw i32 %237, 1
store i32 %238, i32* %11
br label %254
239: ; preds = %210
%240 = load i32, i32* %9
%241 = load [2 x i32]*, [2 x i32]** %7
%242 = load i32, i32* %11
%243 = sext i32 %242 to i64
%244 = getelementptr inbounds [2 x i32], [2 x i32]* %241, i64 %243
%245 = getelementptr inbounds [2 x i32], [2 x i32]* %244, i64 0, i64 0
store i32 %240, i32* %245
%246 = load i32, i32* %10
%247 = load [2 x i32]*, [2 x i32]** %7
%248 = load i32, i32* %11
%249 = sext i32 %248 to i64
%250 = getelementptr inbounds [2 x i32], [2 x i32]* %247, i64 %249
%251 = getelementptr inbounds [2 x i32], [2 x i32]* %250, i64 0, i64 1
store i32 %246, i32* %251
%252 = load i32, i32* %11
%253 = add nsw i32 %252, 1
store i32 %253, i32* %11
br label %259
254: ; preds = %224
br label %255
255: ; preds = %254
br label %256
256: ; preds = %255
%257 = load i32, i32* %10
%258 = add nsw i32 %257, 1
store i32 %258, i32* %10
br label %180
259: ; preds = %239, %209, %180
%260 = load i32, i32* %6
%261 = sub nsw i32 %260, 1
store i32 %261, i32* %10
br label %262
262: ; preds = %338, %259
%263 = load i32, i32* %10
%264 = icmp sgt i32 %263, -1
br i1 %264, label %265, label %341
265: ; preds = %262
%266 = load i8***, i8**** %8
%267 = load i32, i32* %5
%268 = sext i32 %267 to i64
%269 = getelementptr inbounds i8**, i8*** %266, i64 %268
%270 = load i8**, i8*** %269
%271 = load i32, i32* %6
%272 = sext i32 %271 to i64
%273 = getelementptr inbounds i8*, i8** %270, i64 %272
%274 = load i8*, i8** %273
%275 = getelementptr inbounds i8, i8* %274, i64 0
%276 = load i8, i8* %275
%277 = sext i8 %276 to i32
%278 = load i8***, i8**** %8
%279 = load i32, i32* %9
%280 = sext i32 %279 to i64
%281 = getelementptr inbounds i8**, i8*** %278, i64 %280
%282 = load i8**, i8*** %281
%283 = load i32, i32* %10
%284 = sext i32 %283 to i64
%285 = getelementptr inbounds i8*, i8** %282, i64 %284
%286 = load i8*, i8** %285
%287 = getelementptr inbounds i8, i8* %286, i64 0
%288 = load i8, i8* %287
%289 = sext i8 %288 to i32
%290 = icmp eq i32 %277, %289
br i1 %290, label %291, label %292
291: ; preds = %265
br label %341
292: ; preds = %265
%293 = load i8***, i8**** %8
%294 = load i32, i32* %9
%295 = sext i32 %294 to i64
%296 = getelementptr inbounds i8**, i8*** %293, i64 %295
%297 = load i8**, i8*** %296
%298 = load i32, i32* %10
%299 = sext i32 %298 to i64
%300 = getelementptr inbounds i8*, i8** %297, i64 %299
%301 = load i8*, i8** %300
%302 = getelementptr inbounds i8, i8* %301, i64 0
%303 = load i8, i8* %302
%304 = sext i8 %303 to i32
%305 = icmp eq i32 %304, 0
br i1 %305, label %306, label %321
306: ; preds = %292
%307 = load i32, i32* %9
%308 = load [2 x i32]*, [2 x i32]** %7
%309 = load i32, i32* %11
%310 = sext i32 %309 to i64
%311 = getelementptr inbounds [2 x i32], [2 x i32]* %308, i64 %310
%312 = getelementptr inbounds [2 x i32], [2 x i32]* %311, i64 0, i64 0
store i32 %307, i32* %312
%313 = load i32, i32* %10
%314 = load [2 x i32]*, [2 x i32]** %7
%315 = load i32, i32* %11
%316 = sext i32 %315 to i64
%317 = getelementptr inbounds [2 x i32], [2 x i32]* %314, i64 %316
%318 = getelementptr inbounds [2 x i32], [2 x i32]* %317, i64 0, i64 1
store i32 %313, i32* %318
%319 = load i32, i32* %11
%320 = add nsw i32 %319, 1
store i32 %320, i32* %11
br label %336
321: ; preds = %292
%322 = load i32, i32* %9
%323 = load [2 x i32]*, [2 x i32]** %7
%324 = load i32, i32* %11
%325 = sext i32 %324 to i64
%326 = getelementptr inbounds [2 x i32], [2 x i32]* %323, i64 %325
%327 = getelementptr inbounds [2 x i32], [2 x i32]* %326, i64 0, i64 0
store i32 %322, i32* %327
%328 = load i32, i32* %10
%329 = load [2 x i32]*, [2 x i32]** %7
%330 = load i32, i32* %11
%331 = sext i32 %330 to i64
%332 = getelementptr inbounds [2 x i32], [2 x i32]* %329, i64 %331
%333 = getelementptr inbounds [2 x i32], [2 x i32]* %332, i64 0, i64 1
store i32 %328, i32* %333
%334 = load i32, i32* %11
%335 = add nsw i32 %334, 1
store i32 %335, i32* %11
br label %341
336: ; preds = %306
br label %337
337: ; preds = %336
br label %338
338: ; preds = %337
%339 = load i32, i32* %10
%340 = add nsw i32 %339, -1
store i32 %340, i32* %10
br label %262
341: ; preds = %321, %291, %262
%342 = load i32, i32* %11
%343 = load [2 x i32]*, [2 x i32]** %7
%344 = getelementptr inbounds [2 x i32], [2 x i32]* %343, i64 14
%345 = getelementptr inbounds [2 x i32], [2 x i32]* %344, i64 0, i64 0
store i32 %342, i32* %345
ret void
}

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