int suberase(sudoku, d, e)
int sudoku[];
int d;
int e;
{
  int a = e;
  int b;
  int c = 0;
  if (d % 3 == 0) {
    return (0);
  }
  while (c < 85) {
    if (sudoku[a] > 0) {
      b = sudoku[a];
      sudoku[a] = 0;
      if (moveable(sudoku, a) == b) {
        c = 0;
      } else {
        sudoku[a] = b;
        c++;
      }
    }
    a = (a + d) % 81;
  }
  c = 0;
  for (a = 0; a < 81; a++) {
    if (sudoku[a] == 0) {
      c++;
    }
  }
  return (c);
}


x86 assembly (clang, -O0):
<suberase>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    114f <suberase+0x3f>
movl   $0x0,-0x4(%rbp)
jmp    122e <suberase+0x11e>
jmp    1154 <suberase+0x44>
cmpl   $0x55,-0x24(%rbp)
jge    11e2 <suberase+0xd2>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jle    11cc <suberase+0xbc>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rdi
mov    -0x1c(%rbp),%esi
mov    $0x0,%al
call   1030 <moveable@plt>
cmp    -0x20(%rbp),%eax
jne    11b0 <suberase+0xa0>
movl   $0x0,-0x24(%rbp)
jmp    11c7 <suberase+0xb7>
mov    -0x20(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11cc <suberase+0xbc>
mov    -0x1c(%rbp),%eax
add    -0x14(%rbp),%eax
mov    $0x51,%ecx
cltd
idiv   %ecx
mov    %edx,-0x1c(%rbp)
jmp    1154 <suberase+0x44>
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x51,-0x1c(%rbp)
jge    1228 <suberase+0x118>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jne    1215 <suberase+0x105>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    121a <suberase+0x10a>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11f0 <suberase+0xe0>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<suberase>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %esi,0x4(%rsp)
imul   $0xaaaaaaab,%esi,%eax
add    $0x2aaaaaaa,%eax
cmp    $0x55555555,%eax
jb     1304 <suberase+0x1f4>
mov    %edx,%ebx
mov    %rdi,%r14
xor    %r13d,%r13d
jmp    116f <suberase+0x5f>
nop
mov    %r13d,%r12d
add    0x4(%rsp),%ebx
movslq %ebx,%rbx
imul   $0x1948b0fd,%rbx,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
sar    $0x23,%rax
add    %ecx,%eax
lea    (%rax,%rax,8),%eax
lea    (%rax,%rax,8),%eax
sub    %eax,%ebx
mov    %r12d,%r13d
cmp    $0x55,%r12d
jge    11a1 <suberase+0x91>
movslq %ebx,%rbp
mov    (%r14,%rbp,4),%r15d
test   %r15d,%r15d
jle    1140 <suberase+0x30>
movl   $0x0,(%r14,%rbp,4)
xor    %r12d,%r12d
mov    %r14,%rdi
mov    %ebp,%esi
xor    %eax,%eax
call   1030 <moveable@plt>
cmp    %r15d,%eax
je     1143 <suberase+0x33>
mov    %r15d,(%r14,%rbp,4)
add    $0x1,%r13d
jmp    1140 <suberase+0x30>
pxor   %xmm1,%xmm1
movdqu (%r14),%xmm0
movdqu 0x10(%r14),%xmm2
movdqu 0x20(%r14),%xmm3
movdqu 0x30(%r14),%xmm4
pcmpeqd %xmm1,%xmm0
psrld  $0x1f,%xmm0
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
pcmpeqd %xmm1,%xmm3
psubd  %xmm3,%xmm0
pcmpeqd %xmm1,%xmm4
psubd  %xmm4,%xmm0
movdqu 0x40(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x50(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x60(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x70(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x80(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x90(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xa0(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xb0(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xc0(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xd0(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xe0(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xf0(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x100(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x110(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x120(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x130(%r14),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddd  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddd  %xmm1,%xmm0
movd   %xmm0,%eax
cmpl   $0x1,0x140(%r14)
01
adc    $0x0,%eax
jmp    1306 <suberase+0x1f6>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @suberase(i32* %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i32* %0, i32** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%11 = load i32, i32* %7
store i32 %11, i32* %8
store i32 0, i32* %10
%12 = load i32, i32* %6
%13 = srem i32 %12, 3
%14 = icmp eq i32 %13, 0
br i1 %14, label %15, label %16
15: ; preds = %3
store i32 0, i32* %4
br label %77
16: ; preds = %3
br label %17
17: ; preds = %52, %16
%18 = load i32, i32* %10
%19 = icmp slt i32 %18, 85
br i1 %19, label %20, label %57
20: ; preds = %17
%21 = load i32*, i32** %5
%22 = load i32, i32* %8
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds i32, i32* %21, i64 %23
%25 = load i32, i32* %24
%26 = icmp sgt i32 %25, 0
br i1 %26, label %27, label %52
27: ; preds = %20
%28 = load i32*, i32** %5
%29 = load i32, i32* %8
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i32, i32* %28, i64 %30
%32 = load i32, i32* %31
store i32 %32, i32* %9
%33 = load i32*, i32** %5
%34 = load i32, i32* %8
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i32, i32* %33, i64 %35
store i32 0, i32* %36
%37 = load i32*, i32** %5
%38 = load i32, i32* %8
%39 = call i32 (i32*, i32, ...) bitcast (i32 (...)* @moveable to i32 (i32*, i32, ...)*)(i32* %37, i32 %38)
%40 = load i32, i32* %9
%41 = icmp eq i32 %39, %40
br i1 %41, label %42, label %43
42: ; preds = %27
store i32 0, i32* %10
br label %51
43: ; preds = %27
%44 = load i32, i32* %9
%45 = load i32*, i32** %5
%46 = load i32, i32* %8
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i32, i32* %45, i64 %47
store i32 %44, i32* %48
%49 = load i32, i32* %10
%50 = add nsw i32 %49, 1
store i32 %50, i32* %10
br label %51
51: ; preds = %43, %42
br label %52
52: ; preds = %51, %20
%53 = load i32, i32* %8
%54 = load i32, i32* %6
%55 = add nsw i32 %53, %54
%56 = srem i32 %55, 81
store i32 %56, i32* %8
br label %17
57: ; preds = %17
store i32 0, i32* %10
store i32 0, i32* %8
br label %58
58: ; preds = %72, %57
%59 = load i32, i32* %8
%60 = icmp slt i32 %59, 81
br i1 %60, label %61, label %75
61: ; preds = %58
%62 = load i32*, i32** %5
%63 = load i32, i32* %8
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds i32, i32* %62, i64 %64
%66 = load i32, i32* %65
%67 = icmp eq i32 %66, 0
br i1 %67, label %68, label %71
68: ; preds = %61
%69 = load i32, i32* %10
%70 = add nsw i32 %69, 1
store i32 %70, i32* %10
br label %71
71: ; preds = %68, %61
br label %72
72: ; preds = %71
%73 = load i32, i32* %8
%74 = add nsw i32 %73, 1
store i32 %74, i32* %8
br label %58
75: ; preds = %58
%76 = load i32, i32* %10
store i32 %76, i32* %4
br label %77
77: ; preds = %75, %15
%78 = load i32, i32* %4
ret i32 %78
}

LLVM IR (-O2):
define i32 @suberase(i32* %0, i32 %1, i32 %2) {
%4 = srem i32 %1, 3
%5 = icmp eq i32 %4, 0
br i1 %5, label %148, label %6
6: ; preds = %3, %18
%7 = phi i32 [ %19, %18 ], [ 0, %3 ]
%8 = phi i32 [ %21, %18 ], [ %2, %3 ]
%9 = sext i32 %8 to i64
%10 = getelementptr inbounds i32, i32* %0, i64 %9
%11 = load i32, i32* %10
%12 = icmp sgt i32 %11, 0
br i1 %12, label %13, label %18
13: ; preds = %6
store i32 0, i32* %10
%14 = tail call i32 (i32*, i32, ...) bitcast (i32 (...)* @moveable to i32 (i32*, i32, ...)*)(i32* %0, i32 %8)
%15 = icmp eq i32 %14, %11
br i1 %15, label %18, label %16
16: ; preds = %13
store i32 %11, i32* %10
%17 = add nsw i32 %7, 1
br label %18
18: ; preds = %13, %16, %6
%19 = phi i32 [ %17, %16 ], [ %7, %6 ], [ 0, %13 ]
%20 = add nsw i32 %8, %1
%21 = srem i32 %20, 81
%22 = icmp slt i32 %19, 85
br i1 %22, label %6, label %23
23: ; preds = %18
%24 = bitcast i32* %0 to <4 x i32>*
%25 = load <4 x i32>, <4 x i32>* %24
%26 = icmp eq <4 x i32> %25, zeroinitializer
%27 = zext <4 x i1> %26 to <4 x i32>
%28 = getelementptr inbounds i32, i32* %0, i64 4
%29 = bitcast i32* %28 to <4 x i32>*
%30 = load <4 x i32>, <4 x i32>* %29
%31 = icmp eq <4 x i32> %30, zeroinitializer
%32 = zext <4 x i1> %31 to <4 x i32>
%33 = add nuw nsw <4 x i32> %27, %32
%34 = getelementptr inbounds i32, i32* %0, i64 8
%35 = bitcast i32* %34 to <4 x i32>*
%36 = load <4 x i32>, <4 x i32>* %35
%37 = icmp eq <4 x i32> %36, zeroinitializer
%38 = zext <4 x i1> %37 to <4 x i32>
%39 = add nuw nsw <4 x i32> %33, %38
%40 = getelementptr inbounds i32, i32* %0, i64 12
%41 = bitcast i32* %40 to <4 x i32>*
%42 = load <4 x i32>, <4 x i32>* %41
%43 = icmp eq <4 x i32> %42, zeroinitializer
%44 = zext <4 x i1> %43 to <4 x i32>
%45 = add nuw nsw <4 x i32> %39, %44
%46 = getelementptr inbounds i32, i32* %0, i64 16
%47 = bitcast i32* %46 to <4 x i32>*
%48 = load <4 x i32>, <4 x i32>* %47
%49 = icmp eq <4 x i32> %48, zeroinitializer
%50 = zext <4 x i1> %49 to <4 x i32>
%51 = add nuw nsw <4 x i32> %45, %50
%52 = getelementptr inbounds i32, i32* %0, i64 20
%53 = bitcast i32* %52 to <4 x i32>*
%54 = load <4 x i32>, <4 x i32>* %53
%55 = icmp eq <4 x i32> %54, zeroinitializer
%56 = zext <4 x i1> %55 to <4 x i32>
%57 = add nuw nsw <4 x i32> %51, %56
%58 = getelementptr inbounds i32, i32* %0, i64 24
%59 = bitcast i32* %58 to <4 x i32>*
%60 = load <4 x i32>, <4 x i32>* %59
%61 = icmp eq <4 x i32> %60, zeroinitializer
%62 = zext <4 x i1> %61 to <4 x i32>
%63 = add nuw nsw <4 x i32> %57, %62
%64 = getelementptr inbounds i32, i32* %0, i64 28
%65 = bitcast i32* %64 to <4 x i32>*
%66 = load <4 x i32>, <4 x i32>* %65
%67 = icmp eq <4 x i32> %66, zeroinitializer
%68 = zext <4 x i1> %67 to <4 x i32>
%69 = add <4 x i32> %63, %68
%70 = getelementptr inbounds i32, i32* %0, i64 32
%71 = bitcast i32* %70 to <4 x i32>*
%72 = load <4 x i32>, <4 x i32>* %71
%73 = icmp eq <4 x i32> %72, zeroinitializer
%74 = zext <4 x i1> %73 to <4 x i32>
%75 = add <4 x i32> %69, %74
%76 = getelementptr inbounds i32, i32* %0, i64 36
%77 = bitcast i32* %76 to <4 x i32>*
%78 = load <4 x i32>, <4 x i32>* %77
%79 = icmp eq <4 x i32> %78, zeroinitializer
%80 = zext <4 x i1> %79 to <4 x i32>
%81 = add <4 x i32> %75, %80
%82 = getelementptr inbounds i32, i32* %0, i64 40
%83 = bitcast i32* %82 to <4 x i32>*
%84 = load <4 x i32>, <4 x i32>* %83
%85 = icmp eq <4 x i32> %84, zeroinitializer
%86 = zext <4 x i1> %85 to <4 x i32>
%87 = add <4 x i32> %81, %86
%88 = getelementptr inbounds i32, i32* %0, i64 44
%89 = bitcast i32* %88 to <4 x i32>*
%90 = load <4 x i32>, <4 x i32>* %89
%91 = icmp eq <4 x i32> %90, zeroinitializer
%92 = zext <4 x i1> %91 to <4 x i32>
%93 = add <4 x i32> %87, %92
%94 = getelementptr inbounds i32, i32* %0, i64 48
%95 = bitcast i32* %94 to <4 x i32>*
%96 = load <4 x i32>, <4 x i32>* %95
%97 = icmp eq <4 x i32> %96, zeroinitializer
%98 = zext <4 x i1> %97 to <4 x i32>
%99 = add <4 x i32> %93, %98
%100 = getelementptr inbounds i32, i32* %0, i64 52
%101 = bitcast i32* %100 to <4 x i32>*
%102 = load <4 x i32>, <4 x i32>* %101
%103 = icmp eq <4 x i32> %102, zeroinitializer
%104 = zext <4 x i1> %103 to <4 x i32>
%105 = add <4 x i32> %99, %104
%106 = getelementptr inbounds i32, i32* %0, i64 56
%107 = bitcast i32* %106 to <4 x i32>*
%108 = load <4 x i32>, <4 x i32>* %107
%109 = icmp eq <4 x i32> %108, zeroinitializer
%110 = zext <4 x i1> %109 to <4 x i32>
%111 = add <4 x i32> %105, %110
%112 = getelementptr inbounds i32, i32* %0, i64 60
%113 = bitcast i32* %112 to <4 x i32>*
%114 = load <4 x i32>, <4 x i32>* %113
%115 = icmp eq <4 x i32> %114, zeroinitializer
%116 = zext <4 x i1> %115 to <4 x i32>
%117 = add <4 x i32> %111, %116
%118 = getelementptr inbounds i32, i32* %0, i64 64
%119 = bitcast i32* %118 to <4 x i32>*
%120 = load <4 x i32>, <4 x i32>* %119
%121 = icmp eq <4 x i32> %120, zeroinitializer
%122 = zext <4 x i1> %121 to <4 x i32>
%123 = add <4 x i32> %117, %122
%124 = getelementptr inbounds i32, i32* %0, i64 68
%125 = bitcast i32* %124 to <4 x i32>*
%126 = load <4 x i32>, <4 x i32>* %125
%127 = icmp eq <4 x i32> %126, zeroinitializer
%128 = zext <4 x i1> %127 to <4 x i32>
%129 = add <4 x i32> %123, %128
%130 = getelementptr inbounds i32, i32* %0, i64 72
%131 = bitcast i32* %130 to <4 x i32>*
%132 = load <4 x i32>, <4 x i32>* %131
%133 = icmp eq <4 x i32> %132, zeroinitializer
%134 = zext <4 x i1> %133 to <4 x i32>
%135 = add <4 x i32> %129, %134
%136 = getelementptr inbounds i32, i32* %0, i64 76
%137 = bitcast i32* %136 to <4 x i32>*
%138 = load <4 x i32>, <4 x i32>* %137
%139 = icmp eq <4 x i32> %138, zeroinitializer
%140 = zext <4 x i1> %139 to <4 x i32>
%141 = add <4 x i32> %135, %140
%142 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %141)
%143 = getelementptr inbounds i32, i32* %0, i64 80
%144 = load i32, i32* %143
%145 = icmp eq i32 %144, 0
%146 = zext i1 %145 to i32
%147 = add nuw nsw i32 %142, %146
br label %148
148: ; preds = %23, %3
%149 = phi i32 [ 0, %3 ], [ %147, %23 ]
ret i32 %149
}