#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
struct Board {
  int dummy;
};

/* Variables and functions */
unsigned int getPosInBox(struct Board *, int, int);
int maskColExceptBox(struct Board *, int, int, int);
int maskRowExceptBox(struct Board *, int, int, int);
int checkBoxes(struct Board *board) {
  int box, val, change;
  unsigned int pos;
  change = 0;
  for (box = 0; box < 9; box++) {
    for (val = 0; val < 9; val++) {
      pos = getPosInBox(board, val, box);
      if (!(pos & 0x3F) && (pos & ~0x3F)) {
        change |= maskRowExceptBox(board, box, 3 * (box / 3) + 0, ~(1 << val));
      } else if (!(pos & 0x1C7) && (pos & ~0x1C7)) {
        change |= maskRowExceptBox(board, box, 3 * (box / 3) + 1, ~(1 << val));
      } else if (!(pos & 0x1F8) && (pos & ~0x1F8)) {
        change |= maskRowExceptBox(board, box, 3 * (box / 3) + 2, ~(1 << val));
      }
      if (!(pos & 0xDB) && (pos & ~0xDB)) {
        change |= maskColExceptBox(board, box, 3 * (box % 3) + 0, ~(1 << val));
      } else if (!(pos & 0x16D) && (pos & ~0x16D)) {
        change |= maskColExceptBox(board, box, 3 * (box % 3) + 1, ~(1 << val));
      } else if (!(pos & 0x1B6) && (pos & ~0x1B6)) {
        change |= maskColExceptBox(board, box, 3 * (box % 3) + 2, ~(1 << val));
      }
    }
  }
  return change;
}


x86 assembly (clang, -O0):
<checkBoxes>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x9,-0xc(%rbp)
jge    13b9 <checkBoxes+0x289>
movl   $0x0,-0x10(%rbp)
cmpl   $0x9,-0x10(%rbp)
jge    13a6 <checkBoxes+0x276>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%esi
mov    -0xc(%rbp),%edx
call   1040 <getPosInBox@plt>
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
and    $0x3f,%eax
cmp    $0x0,%eax
jne    11cc <checkBoxes+0x9c>
mov    -0x18(%rbp),%eax
and    $0xffffffc0,%eax
cmp    $0x0,%eax
je     11cc <checkBoxes+0x9c>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0xc(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
imul   $0x3,%eax,%edx
add    $0x0,%edx
mov    -0x10(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,%ecx
xor    $0xffffffff,%ecx
call   1030 <maskRowExceptBox@plt>
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    1283 <checkBoxes+0x153>
mov    -0x18(%rbp),%eax
and    $0x1c7,%eax
cmp    $0x0,%eax
jne    1225 <checkBoxes+0xf5>
mov    -0x18(%rbp),%eax
and    $0xfffffe38,%eax
cmp    $0x0,%eax
je     1225 <checkBoxes+0xf5>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0xc(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
imul   $0x3,%eax,%edx
add    $0x1,%edx
mov    -0x10(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,%ecx
xor    $0xffffffff,%ecx
call   1030 <maskRowExceptBox@plt>
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    127e <checkBoxes+0x14e>
mov    -0x18(%rbp),%eax
and    $0x1f8,%eax
cmp    $0x0,%eax
jne    1279 <checkBoxes+0x149>
mov    -0x18(%rbp),%eax
and    $0xfffffe07,%eax
cmp    $0x0,%eax
je     1279 <checkBoxes+0x149>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0xc(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
imul   $0x3,%eax,%edx
add    $0x2,%edx
mov    -0x10(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,%ecx
xor    $0xffffffff,%ecx
call   1030 <maskRowExceptBox@plt>
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    127e <checkBoxes+0x14e>
jmp    1283 <checkBoxes+0x153>
mov    -0x18(%rbp),%eax
and    $0xdb,%eax
cmp    $0x0,%eax
jne    12dc <checkBoxes+0x1ac>
mov    -0x18(%rbp),%eax
and    $0xffffff24,%eax
cmp    $0x0,%eax
je     12dc <checkBoxes+0x1ac>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0xc(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
imul   $0x3,%edx,%edx
add    $0x0,%edx
mov    -0x10(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,%ecx
xor    $0xffffffff,%ecx
call   1050 <maskColExceptBox@plt>
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    1393 <checkBoxes+0x263>
mov    -0x18(%rbp),%eax
and    $0x16d,%eax
cmp    $0x0,%eax
jne    1335 <checkBoxes+0x205>
mov    -0x18(%rbp),%eax
and    $0xfffffe92,%eax
cmp    $0x0,%eax
je     1335 <checkBoxes+0x205>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0xc(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
imul   $0x3,%edx,%edx
add    $0x1,%edx
mov    -0x10(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,%ecx
xor    $0xffffffff,%ecx
call   1050 <maskColExceptBox@plt>
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    138e <checkBoxes+0x25e>
mov    -0x18(%rbp),%eax
and    $0x1b6,%eax
cmp    $0x0,%eax
jne    1389 <checkBoxes+0x259>
mov    -0x18(%rbp),%eax
and    $0xfffffe49,%eax
cmp    $0x0,%eax
je     1389 <checkBoxes+0x259>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0xc(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
imul   $0x3,%edx,%edx
add    $0x2,%edx
mov    -0x10(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,%ecx
xor    $0xffffffff,%ecx
call   1050 <maskColExceptBox@plt>
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    138e <checkBoxes+0x25e>
jmp    1393 <checkBoxes+0x263>
jmp    1398 <checkBoxes+0x268>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    115b <checkBoxes+0x2b>
jmp    13ab <checkBoxes+0x27b>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    114a <checkBoxes+0x1a>
mov    -0x14(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<checkBoxes>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rdi,%r14
xor    %r12d,%r12d
xor    %r15d,%r15d
jmp    1160 <checkBoxes+0x30>
nopl   0x0(%rax)
mov    0x4(%rsp),%eax
mov    %eax,%r12d
cmp    $0x9,%eax
je     128c <checkBoxes+0x15c>
mov    %r12d,%eax
mov    $0xaaaaaaab,%ecx
imul   %rcx,%rax
shr    $0x21,%rax
lea    (%rax,%rax,2),%eax
mov    %r12d,%r13d
sub    %eax,%r13d
lea    0x1(%r12),%eax
mov    %eax,0x4(%rsp)
lea    0x2(%r12),%eax
mov    %eax,0xc(%rsp)
lea    0x0(%r13,%r13,2),%eax
mov    %eax,0x14(%rsp)
lea    0x1(%r13,%r13,2),%eax
mov    %eax,0x10(%rsp)
lea    0x2(%r13,%r13,2),%eax
mov    %eax,0x8(%rsp)
xor    %ebp,%ebp
jmp    11d5 <checkBoxes+0xa5>
nopw   0x0(%rax,%rax,1)
mov    $0xfffffffe,%eax
mov    %ebp,%ecx
rol    %cl,%eax
mov    %r14,%rdi
mov    %r12d,%esi
mov    %eax,%ecx
call   1050 <maskColExceptBox@plt>
or     %eax,%r15d
add    $0x1,%ebp
cmp    $0x9,%ebp
je     1150 <checkBoxes+0x20>
mov    %r14,%rdi
mov    %ebp,%esi
mov    %r12d,%edx
call   1040 <getPosInBox@plt>
mov    %eax,%ebx
cmp    $0x40,%eax
jb     11f3 <checkBoxes+0xc3>
mov    %ebx,%eax
mov    %r12d,%edx
and    $0x3f,%eax
je     1220 <checkBoxes+0xf0>
test   $0x1c7,%ebx
jne    1208 <checkBoxes+0xd8>
mov    %ebx,%eax
mov    0x4(%rsp),%edx
and    $0xfffffe38,%eax
jne    1220 <checkBoxes+0xf0>
test   $0x1f8,%ebx
jne    123c <checkBoxes+0x10c>
mov    %ebx,%eax
mov    0xc(%rsp),%edx
and    $0xfffffe07,%eax
je     123c <checkBoxes+0x10c>
nopl   (%rax)
sub    %r13d,%edx
mov    $0xfffffffe,%eax
mov    %ebp,%ecx
rol    %cl,%eax
mov    %r14,%rdi
mov    %r12d,%esi
mov    %eax,%ecx
call   1030 <maskRowExceptBox@plt>
or     %eax,%r15d
test   $0xdb,%bl
jne    1252 <checkBoxes+0x122>
mov    %ebx,%eax
mov    0x14(%rsp),%edx
and    $0xffffff24,%eax
jne    11b0 <checkBoxes+0x80>
test   $0x16d,%ebx
jne    126b <checkBoxes+0x13b>
mov    %ebx,%eax
mov    0x10(%rsp),%edx
and    $0xfffffe92,%eax
jne    11b0 <checkBoxes+0x80>
test   $0x1b6,%ebx
jne    11c9 <checkBoxes+0x99>
mov    0x8(%rsp),%edx
and    $0xfffffe49,%ebx
jne    11b0 <checkBoxes+0x80>
jmp    11c9 <checkBoxes+0x99>
mov    %r15d,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
%struct.Board = type { i32 }
define i32 @checkBoxes(%struct.Board* %0) {
%2 = alloca %struct.Board*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
store %struct.Board* %0, %struct.Board** %2
store i32 0, i32* %5
store i32 0, i32* %3
br label %7
7: ; preds = %153, %1
%8 = load i32, i32* %3
%9 = icmp slt i32 %8, 9
br i1 %9, label %10, label %156
10: ; preds = %7
store i32 0, i32* %4
br label %11
11: ; preds = %149, %10
%12 = load i32, i32* %4
%13 = icmp slt i32 %12, 9
br i1 %13, label %14, label %152
14: ; preds = %11
%15 = load %struct.Board*, %struct.Board** %2
%16 = load i32, i32* %4
%17 = load i32, i32* %3
%18 = call i32 @getPosInBox(%struct.Board* %15, i32 %16, i32 %17)
store i32 %18, i32* %6
%19 = load i32, i32* %6
%20 = and i32 %19, 63
%21 = icmp ne i32 %20, 0
br i1 %21, label %39, label %22
22: ; preds = %14
%23 = load i32, i32* %6
%24 = and i32 %23, -64
%25 = icmp ne i32 %24, 0
br i1 %25, label %26, label %39
26: ; preds = %22
%27 = load %struct.Board*, %struct.Board** %2
%28 = load i32, i32* %3
%29 = load i32, i32* %3
%30 = sdiv i32 %29, 3
%31 = mul nsw i32 3, %30
%32 = add nsw i32 %31, 0
%33 = load i32, i32* %4
%34 = shl i32 1, %33
%35 = xor i32 %34, -1
%36 = call i32 @maskRowExceptBox(%struct.Board* %27, i32 %28, i32 %32, i32 %35)
%37 = load i32, i32* %5
%38 = or i32 %37, %36
store i32 %38, i32* %5
br label %83
39: ; preds = %22, %14
%40 = load i32, i32* %6
%41 = and i32 %40, 455
%42 = icmp ne i32 %41, 0
br i1 %42, label %60, label %43
43: ; preds = %39
%44 = load i32, i32* %6
%45 = and i32 %44, -456
%46 = icmp ne i32 %45, 0
br i1 %46, label %47, label %60
47: ; preds = %43
%48 = load %struct.Board*, %struct.Board** %2
%49 = load i32, i32* %3
%50 = load i32, i32* %3
%51 = sdiv i32 %50, 3
%52 = mul nsw i32 3, %51
%53 = add nsw i32 %52, 1
%54 = load i32, i32* %4
%55 = shl i32 1, %54
%56 = xor i32 %55, -1
%57 = call i32 @maskRowExceptBox(%struct.Board* %48, i32 %49, i32 %53, i32 %56)
%58 = load i32, i32* %5
%59 = or i32 %58, %57
store i32 %59, i32* %5
br label %82
60: ; preds = %43, %39
%61 = load i32, i32* %6
%62 = and i32 %61, 504
%63 = icmp ne i32 %62, 0
br i1 %63, label %81, label %64
64: ; preds = %60
%65 = load i32, i32* %6
%66 = and i32 %65, -505
%67 = icmp ne i32 %66, 0
br i1 %67, label %68, label %81
68: ; preds = %64
%69 = load %struct.Board*, %struct.Board** %2
%70 = load i32, i32* %3
%71 = load i32, i32* %3
%72 = sdiv i32 %71, 3
%73 = mul nsw i32 3, %72
%74 = add nsw i32 %73, 2
%75 = load i32, i32* %4
%76 = shl i32 1, %75
%77 = xor i32 %76, -1
%78 = call i32 @maskRowExceptBox(%struct.Board* %69, i32 %70, i32 %74, i32 %77)
%79 = load i32, i32* %5
%80 = or i32 %79, %78
store i32 %80, i32* %5
br label %81
81: ; preds = %68, %64, %60
br label %82
82: ; preds = %81, %47
br label %83
83: ; preds = %82, %26
%84 = load i32, i32* %6
%85 = and i32 %84, 219
%86 = icmp ne i32 %85, 0
br i1 %86, label %104, label %87
87: ; preds = %83
%88 = load i32, i32* %6
%89 = and i32 %88, -220
%90 = icmp ne i32 %89, 0
br i1 %90, label %91, label %104
91: ; preds = %87
%92 = load %struct.Board*, %struct.Board** %2
%93 = load i32, i32* %3
%94 = load i32, i32* %3
%95 = srem i32 %94, 3
%96 = mul nsw i32 3, %95
%97 = add nsw i32 %96, 0
%98 = load i32, i32* %4
%99 = shl i32 1, %98
%100 = xor i32 %99, -1
%101 = call i32 @maskColExceptBox(%struct.Board* %92, i32 %93, i32 %97, i32 %100)
%102 = load i32, i32* %5
%103 = or i32 %102, %101
store i32 %103, i32* %5
br label %148
104: ; preds = %87, %83
%105 = load i32, i32* %6
%106 = and i32 %105, 365
%107 = icmp ne i32 %106, 0
br i1 %107, label %125, label %108
108: ; preds = %104
%109 = load i32, i32* %6
%110 = and i32 %109, -366
%111 = icmp ne i32 %110, 0
br i1 %111, label %112, label %125
112: ; preds = %108
%113 = load %struct.Board*, %struct.Board** %2
%114 = load i32, i32* %3
%115 = load i32, i32* %3
%116 = srem i32 %115, 3
%117 = mul nsw i32 3, %116
%118 = add nsw i32 %117, 1
%119 = load i32, i32* %4
%120 = shl i32 1, %119
%121 = xor i32 %120, -1
%122 = call i32 @maskColExceptBox(%struct.Board* %113, i32 %114, i32 %118, i32 %121)
%123 = load i32, i32* %5
%124 = or i32 %123, %122
store i32 %124, i32* %5
br label %147
125: ; preds = %108, %104
%126 = load i32, i32* %6
%127 = and i32 %126, 438
%128 = icmp ne i32 %127, 0
br i1 %128, label %146, label %129
129: ; preds = %125
%130 = load i32, i32* %6
%131 = and i32 %130, -439
%132 = icmp ne i32 %131, 0
br i1 %132, label %133, label %146
133: ; preds = %129
%134 = load %struct.Board*, %struct.Board** %2
%135 = load i32, i32* %3
%136 = load i32, i32* %3
%137 = srem i32 %136, 3
%138 = mul nsw i32 3, %137
%139 = add nsw i32 %138, 2
%140 = load i32, i32* %4
%141 = shl i32 1, %140
%142 = xor i32 %141, -1
%143 = call i32 @maskColExceptBox(%struct.Board* %134, i32 %135, i32 %139, i32 %142)
%144 = load i32, i32* %5
%145 = or i32 %144, %143
store i32 %145, i32* %5
br label %146
146: ; preds = %133, %129, %125
br label %147
147: ; preds = %146, %112
br label %148
148: ; preds = %147, %91
br label %149
149: ; preds = %148
%150 = load i32, i32* %4
%151 = add nsw i32 %150, 1
store i32 %151, i32* %4
br label %11
152: ; preds = %11
br label %153
153: ; preds = %152
%154 = load i32, i32* %3
%155 = add nsw i32 %154, 1
store i32 %155, i32* %3
br label %7
156: ; preds = %7
%157 = load i32, i32* %5
ret i32 %157
}

LLVM IR (-O2):
%struct.Board = type { i32 }
define i32 @checkBoxes(%struct.Board* %0) {
br label %2
2: ; preds = %1, %67
%3 = phi i32 [ 0, %1 ], [ %6, %67 ]
%4 = phi i32 [ 0, %1 ], [ %64, %67 ]
%5 = urem i32 %3, 3
%6 = add nuw nsw i32 %3, 1
%7 = add nuw nsw i32 %3, 2
%8 = mul nuw nsw i32 %5, 3
%9 = add nuw nsw i32 %8, 1
%10 = add nuw nsw i32 %8, 2
br label %11
11: ; preds = %2, %63
%12 = phi i32 [ %4, %2 ], [ %64, %63 ]
%13 = phi i32 [ 0, %2 ], [ %65, %63 ]
%14 = tail call i32 @getPosInBox(%struct.Board* %0, i32 %13, i32 %3)
%15 = and i32 %14, 63
%16 = icmp ne i32 %15, 0
%17 = icmp ult i32 %14, 64
%18 = or i1 %17, %16
br i1 %18, label %19, label %31
19: ; preds = %11
%20 = and i32 %14, 455
%21 = icmp ne i32 %20, 0
%22 = and i32 %14, -456
%23 = icmp eq i32 %22, 0
%24 = or i1 %21, %23
br i1 %24, label %25, label %31
25: ; preds = %19
%26 = and i32 %14, 504
%27 = icmp ne i32 %26, 0
%28 = and i32 %14, -505
%29 = icmp eq i32 %28, 0
%30 = or i1 %27, %29
br i1 %30, label %38, label %31
31: ; preds = %25, %19, %11
%32 = phi i32 [ %3, %11 ], [ %6, %19 ], [ %7, %25 ]
%33 = sub nuw nsw i32 %32, %5
%34 = shl nuw nsw i32 1, %13
%35 = xor i32 %34, -1
%36 = tail call i32 @maskRowExceptBox(%struct.Board* %0, i32 %3, i32 %33, i32 %35)
%37 = or i32 %36, %12
br label %38
38: ; preds = %31, %25
%39 = phi i32 [ %12, %25 ], [ %37, %31 ]
%40 = and i32 %14, 219
%41 = icmp ne i32 %40, 0
%42 = and i32 %14, -220
%43 = icmp eq i32 %42, 0
%44 = or i1 %41, %43
br i1 %44, label %45, label %57
45: ; preds = %38
%46 = and i32 %14, 365
%47 = icmp ne i32 %46, 0
%48 = and i32 %14, -366
%49 = icmp eq i32 %48, 0
%50 = or i1 %47, %49
br i1 %50, label %51, label %57
51: ; preds = %45
%52 = and i32 %14, 438
%53 = icmp ne i32 %52, 0
%54 = and i32 %14, -439
%55 = icmp eq i32 %54, 0
%56 = or i1 %53, %55
br i1 %56, label %63, label %57
57: ; preds = %51, %45, %38
%58 = phi i32 [ %8, %38 ], [ %9, %45 ], [ %10, %51 ]
%59 = shl nuw nsw i32 1, %13
%60 = xor i32 %59, -1
%61 = tail call i32 @maskColExceptBox(%struct.Board* %0, i32 %3, i32 %58, i32 %60)
%62 = or i32 %61, %39
br label %63
63: ; preds = %57, %51
%64 = phi i32 [ %39, %51 ], [ %62, %57 ]
%65 = add nuw nsw i32 %13, 1
%66 = icmp eq i32 %65, 9
br i1 %66, label %67, label %11
67: ; preds = %63
%68 = icmp eq i32 %6, 9
br i1 %68, label %69, label %2
69: ; preds = %67
ret i32 %64
}