int grideliminate(char grid[9][9][10], char m, char n) {
  if (!grid[m][n][0])
    return 0;
  char i, j, f = 0;
  for (i = 3 * (m / 3); i < 3 * (m / 3 + 1); ++i)
    for (j = 3 * (n / 3); j < 3 * (n / 3 + 1); ++j)
      if (!(i == m && j == n))
        if (grid[i][j][grid[m][n][0]])
          grid[i][j][grid[m][n][0]] = 0, f = 1;
  return f;
}


x86 assembly (clang, -O0):
<grideliminate>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %sil,%cl
mov    %rdi,-0x10(%rbp)
mov    %cl,-0x11(%rbp)
mov    %al,-0x12(%rbp)
mov    -0x10(%rbp),%rax
movsbq -0x11(%rbp),%rcx
imul   $0x5a,%rcx,%rcx
add    %rcx,%rax
movsbq -0x12(%rbp),%rcx
imul   $0xa,%rcx,%rcx
add    %rcx,%rax
cmpb   $0x0,(%rax)
jne    1144 <grideliminate+0x44>
movl   $0x0,-0x4(%rbp)
jmp    1292 <grideliminate+0x192>
movb   $0x0,-0x15(%rbp)
movsbl -0x11(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
imul   $0x3,%eax,%eax
mov    %al,-0x13(%rbp)
movsbl -0x13(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movsbl -0x11(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x1c(%rbp),%eax
add    $0x1,%ecx
imul   $0x3,%ecx,%ecx
cmp    %ecx,%eax
jge    128b <grideliminate+0x18b>
movsbl -0x12(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
imul   $0x3,%eax,%eax
mov    %al,-0x14(%rbp)
movsbl -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsbl -0x12(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x20(%rbp),%eax
add    $0x1,%ecx
imul   $0x3,%ecx,%ecx
cmp    %ecx,%eax
jge    1279 <grideliminate+0x179>
movsbl -0x13(%rbp),%eax
movsbl -0x11(%rbp),%ecx
cmp    %ecx,%eax
jne    11d8 <grideliminate+0xd8>
movsbl -0x14(%rbp),%eax
movsbl -0x12(%rbp),%ecx
cmp    %ecx,%eax
je     1267 <grideliminate+0x167>
mov    -0x10(%rbp),%rax
movsbq -0x13(%rbp),%rcx
imul   $0x5a,%rcx,%rcx
add    %rcx,%rax
movsbq -0x14(%rbp),%rcx
imul   $0xa,%rcx,%rcx
add    %rcx,%rax
mov    -0x10(%rbp),%rcx
movsbq -0x11(%rbp),%rdx
imul   $0x5a,%rdx,%rdx
add    %rdx,%rcx
movsbq -0x12(%rbp),%rdx
imul   $0xa,%rdx,%rdx
add    %rdx,%rcx
movsbq (%rcx),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     1262 <grideliminate+0x162>
mov    -0x10(%rbp),%rax
movsbq -0x13(%rbp),%rcx
imul   $0x5a,%rcx,%rcx
add    %rcx,%rax
movsbq -0x14(%rbp),%rcx
imul   $0xa,%rcx,%rcx
add    %rcx,%rax
mov    -0x10(%rbp),%rcx
movsbq -0x11(%rbp),%rdx
imul   $0x5a,%rdx,%rdx
add    %rdx,%rcx
movsbq -0x12(%rbp),%rdx
imul   $0xa,%rdx,%rdx
add    %rdx,%rcx
movsbq (%rcx),%rcx
movb   $0x0,(%rax,%rcx,1)
movb   $0x1,-0x15(%rbp)
jmp    1267 <grideliminate+0x167>
jmp    126c <grideliminate+0x16c>
mov    -0x14(%rbp),%al
add    $0x1,%al
mov    %al,-0x14(%rbp)
jmp    1192 <grideliminate+0x92>
jmp    127e <grideliminate+0x17e>
mov    -0x13(%rbp),%al
add    $0x1,%al
mov    %al,-0x13(%rbp)
jmp    115a <grideliminate+0x5a>
movsbl -0x15(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<grideliminate>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
movslq %esi,%rax
movslq %edx,%rbp
imul   $0x5a,%rax,%rcx
add    %rdi,%rcx
lea    0x0(%rbp,%rbp,4),%rbp
cmpb   $0x0,(%rcx,%rbp,2)
je     11ed <grideliminate+0xed>
movsbl %sil,%eax
imul   $0x56,%eax,%eax
movzwl %ax,%eax
mov    %eax,%ebx
shr    $0xf,%ebx
shr    $0x8,%eax
add    %bl,%al
movzbl %al,%eax
movsbl %al,%ebx
lea    (%rax,%rax,2),%r13d
lea    (%rbx,%rbx,2),%r8d
add    $0x3,%r8d
movsbl %r13b,%ebx
cmp    %ebx,%r8d
jle    11f1 <grideliminate+0xf1>
lea    (%rcx,%rbp,2),%r10
movsbl %dl,%ecx
imul   $0x56,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%ebp
shr    $0xf,%ebp
shr    $0x8,%ecx
add    %bpl,%cl
movzbl %cl,%ecx
movsbl %cl,%ebp
lea    (%rcx,%rcx,2),%r9d
lea    0x3(%rbp,%rbp,2),%r12d
movsbl %r9b,%r14d
xor    %r11d,%r11d
jmp    119d <grideliminate+0x9d>
nopl   0x0(%rax)
add    $0x1,%r13b
movsbl %r13b,%eax
cmp    %eax,%r8d
jle    11f4 <grideliminate+0xf4>
cmp    %r14d,%r12d
jle    1190 <grideliminate+0x90>
movsbq %r13b,%r15
mov    %r9d,%ebx
jmp    11bb <grideliminate+0xbb>
nopl   0x0(%rax,%rax,1)
add    $0x1,%bl
movsbl %bl,%eax
cmp    %eax,%r12d
jle    1190 <grideliminate+0x90>
cmp    %sil,%r13b
jne    11c4 <grideliminate+0xc4>
cmp    %bl,%dl
je     11b0 <grideliminate+0xb0>
movsbq %bl,%rcx
movsbq (%r10),%rbp
imul   $0x5a,%r15,%rax
add    %rdi,%rax
lea    (%rcx,%rcx,4),%rcx
lea    (%rax,%rcx,2),%rcx
cmpb   $0x0,0x0(%rbp,%rcx,1)
je     11b0 <grideliminate+0xb0>
add    %rbp,%rcx
movb   $0x0,(%rcx)
mov    $0x1,%r11b
jmp    11b0 <grideliminate+0xb0>
xor    %eax,%eax
jmp    11f8 <grideliminate+0xf8>
xor    %r11d,%r11d
movzbl %r11b,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @grideliminate([9 x [10 x i8]]* nocapture %0, i8 signext %1, i8 signext %2) {
%4 = sext i8 %1 to i64
%5 = sext i8 %2 to i64
%6 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %4, i64 %5, i64 0
%7 = load i8, i8* %6
%8 = icmp eq i8 %7, 0
br i1 %8, label %57, label %9
9: ; preds = %3
%10 = sdiv i8 %1, 3
%11 = sext i8 %10 to i32
%12 = mul nsw i8 %10, 3
%13 = mul nsw i32 %11, 3
%14 = add nsw i32 %13, 3
%15 = sext i8 %12 to i32
%16 = icmp sgt i32 %14, %15
br i1 %16, label %17, label %54
17: ; preds = %9
%18 = sdiv i8 %2, 3
%19 = sext i8 %18 to i32
%20 = mul nsw i8 %18, 3
%21 = mul nsw i32 %19, 3
%22 = add nsw i32 %21, 3
%23 = sext i8 %20 to i32
%24 = icmp sgt i32 %22, %23
br label %25
25: ; preds = %17, %49
%26 = phi i8 [ 0, %17 ], [ %50, %49 ]
%27 = phi i8 [ %12, %17 ], [ %51, %49 ]
br i1 %24, label %28, label %49
28: ; preds = %25
%29 = icmp eq i8 %27, %1
%30 = sext i8 %27 to i64
br label %31
31: ; preds = %28, %44
%32 = phi i8 [ %26, %28 ], [ %45, %44 ]
%33 = phi i8 [ %20, %28 ], [ %46, %44 ]
%34 = icmp eq i8 %33, %2
%35 = select i1 %29, i1 %34, i1 false
br i1 %35, label %44, label %36
36: ; preds = %31
%37 = sext i8 %33 to i64
%38 = load i8, i8* %6
%39 = sext i8 %38 to i64
%40 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %30, i64 %37, i64 %39
%41 = load i8, i8* %40
%42 = icmp eq i8 %41, 0
br i1 %42, label %44, label %43
43: ; preds = %36
store i8 0, i8* %40
br label %44
44: ; preds = %31, %43, %36
%45 = phi i8 [ 1, %43 ], [ %32, %36 ], [ %32, %31 ]
%46 = add i8 %33, 1
%47 = sext i8 %46 to i32
%48 = icmp sgt i32 %22, %47
br i1 %48, label %31, label %49
49: ; preds = %44, %25
%50 = phi i8 [ %26, %25 ], [ %45, %44 ]
%51 = add i8 %27, 1
%52 = sext i8 %51 to i32
%53 = icmp sgt i32 %14, %52
br i1 %53, label %25, label %54
54: ; preds = %49, %9
%55 = phi i8 [ 0, %9 ], [ %50, %49 ]
%56 = zext i8 %55 to i32
br label %57
57: ; preds = %3, %54
%58 = phi i32 [ %56, %54 ], [ 0, %3 ]
ret i32 %58
}