void guessed(char oldgrid[9][9][10], char newgrid[9][9][10], char m, char n,
             char o) {
  char i, j, k;
  for (i = 0; i < 9; ++i)
    for (j = 0; j < 9; ++j)
      for (k = 0; k < 10; ++k)
        newgrid[i][j][k] = oldgrid[i][j][k];
  newgrid[m][n][0] = o;
  for (k = 1; k < 10; ++k)
    if (k != o)
      newgrid[m][n][k] = 0;
}


x86 assembly (clang, -O0):
<guessed>:
push   %rbp
mov    %rsp,%rbp
mov    %r8b,%al
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %dl,-0x11(%rbp)
mov    %cl,-0x12(%rbp)
mov    %al,-0x13(%rbp)
movb   $0x0,-0x14(%rbp)
movsbl -0x14(%rbp),%eax
cmp    $0x9,%eax
jge    11c4 <guessed+0xc4>
movb   $0x0,-0x15(%rbp)
movsbl -0x15(%rbp),%eax
cmp    $0x9,%eax
jge    11b2 <guessed+0xb2>
movb   $0x0,-0x16(%rbp)
movsbl -0x16(%rbp),%eax
cmp    $0xa,%eax
jge    11a0 <guessed+0xa0>
mov    -0x8(%rbp),%rax
movsbq -0x14(%rbp),%rcx
imul   $0x5a,%rcx,%rcx
add    %rcx,%rax
movsbq -0x15(%rbp),%rcx
imul   $0xa,%rcx,%rcx
add    %rcx,%rax
movsbq -0x16(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movsbq -0x14(%rbp),%rcx
imul   $0x5a,%rcx,%rcx
add    %rcx,%rax
movsbq -0x15(%rbp),%rcx
imul   $0xa,%rcx,%rcx
add    %rcx,%rax
movsbq -0x16(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x16(%rbp),%al
add    $0x1,%al
mov    %al,-0x16(%rbp)
jmp    113e <guessed+0x3e>
jmp    11a5 <guessed+0xa5>
mov    -0x15(%rbp),%al
add    $0x1,%al
mov    %al,-0x15(%rbp)
jmp    112d <guessed+0x2d>
jmp    11b7 <guessed+0xb7>
mov    -0x14(%rbp),%al
add    $0x1,%al
mov    %al,-0x14(%rbp)
jmp    111c <guessed+0x1c>
mov    -0x13(%rbp),%cl
mov    -0x10(%rbp),%rax
movsbq -0x11(%rbp),%rdx
imul   $0x5a,%rdx,%rdx
add    %rdx,%rax
movsbq -0x12(%rbp),%rdx
imul   $0xa,%rdx,%rdx
add    %rdx,%rax
mov    %cl,(%rax)
movb   $0x1,-0x16(%rbp)
movsbl -0x16(%rbp),%eax
cmp    $0xa,%eax
jge    123d <guessed+0x13d>
movsbl -0x16(%rbp),%eax
movsbl -0x13(%rbp),%ecx
cmp    %ecx,%eax
je     122b <guessed+0x12b>
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
movsbq -0x16(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1230 <guessed+0x130>
mov    -0x16(%rbp),%al
add    $0x1,%al
mov    %al,-0x16(%rbp)
jmp    11e9 <guessed+0xe9>
pop    %rbp
ret

x86 assembly (clang, -O2):
<guessed>:
add    $0x9,%rdi
lea    0x9(%rsi),%r10
xor    %r9d,%r9d
nopl   0x0(%rax,%rax,1)
xor    %r11d,%r11d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl -0x9(%rdi,%r11,1),%eax
mov    %al,-0x9(%r10,%r11,1)
movzbl -0x8(%rdi,%r11,1),%eax
mov    %al,-0x8(%r10,%r11,1)
movzbl -0x7(%rdi,%r11,1),%eax
mov    %al,-0x7(%r10,%r11,1)
movzbl -0x6(%rdi,%r11,1),%eax
mov    %al,-0x6(%r10,%r11,1)
movzbl -0x5(%rdi,%r11,1),%eax
mov    %al,-0x5(%r10,%r11,1)
movzbl -0x4(%rdi,%r11,1),%eax
mov    %al,-0x4(%r10,%r11,1)
movzbl -0x3(%rdi,%r11,1),%eax
mov    %al,-0x3(%r10,%r11,1)
movzbl -0x2(%rdi,%r11,1),%eax
mov    %al,-0x2(%r10,%r11,1)
movzbl -0x1(%rdi,%r11,1),%eax
mov    %al,-0x1(%r10,%r11,1)
movzbl (%rdi,%r11,1),%eax
mov    %al,(%r10,%r11,1)
add    $0xa,%r11
cmp    $0x5a,%r11
jne    1120 <guessed+0x20>
add    $0x1,%r9
add    $0x5a,%rdi
add    $0x5a,%r10
cmp    $0x9,%r9
jne    1110 <guessed+0x10>
movsbq %dl,%rax
movsbq %cl,%rcx
imul   $0x5a,%rax,%rax
add    %rax,%rsi
lea    (%rcx,%rcx,4),%rax
mov    %r8b,(%rsi,%rax,2)
cmp    $0x1,%r8b
jne    11d0 <guessed+0xd0>
movb   $0x0,0x2(%rsi,%rax,2)
jmp    11db <guessed+0xdb>
movb   $0x0,0x1(%rsi,%rax,2)
cmp    $0x2,%r8b
jne    11ff <guessed+0xff>
movb   $0x0,0x3(%rsi,%rax,2)
movb   $0x0,0x4(%rsi,%rax,2)
movb   $0x0,0x5(%rsi,%rax,2)
movb   $0x0,0x6(%rsi,%rax,2)
movb   $0x0,0x7(%rsi,%rax,2)
movb   $0x0,0x8(%rsi,%rax,2)
movb   $0x0,0x9(%rsi,%rax,2)
ret
movb   $0x0,0x2(%rsi,%rax,2)
cmp    $0x3,%r8b
je     11e0 <guessed+0xe0>
movb   $0x0,0x3(%rsi,%rax,2)
cmp    $0x4,%r8b
je     11e5 <guessed+0xe5>
movb   $0x0,0x4(%rsi,%rax,2)
cmp    $0x5,%r8b
je     11ea <guessed+0xea>
movb   $0x0,0x5(%rsi,%rax,2)
cmp    $0x6,%r8b
je     11ef <guessed+0xef>
movb   $0x0,0x6(%rsi,%rax,2)
cmp    $0x7,%r8b
je     11f4 <guessed+0xf4>
movb   $0x0,0x7(%rsi,%rax,2)
cmp    $0x8,%r8b
je     11f9 <guessed+0xf9>
movb   $0x0,0x8(%rsi,%rax,2)
cmp    $0x9,%r8b
jne    11f9 <guessed+0xf9>
jmp    11fe <guessed+0xfe>

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

LLVM IR (-O2):
define void @guessed([9 x [10 x i8]]* nocapture %0, [9 x [10 x i8]]* nocapture writeonly %1, i8 signext %2, i8 signext %3, i8 signext %4) {
br label %6
6: ; preds = %5, %42
%7 = phi i64 [ 0, %5 ], [ %43, %42 ]
br label %8
8: ; preds = %6, %8
%9 = phi i64 [ 0, %6 ], [ %40, %8 ]
%10 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 0
%11 = load i8, i8* %10
%12 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 0
store i8 %11, i8* %12
%13 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 1
%14 = load i8, i8* %13
%15 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 1
store i8 %14, i8* %15
%16 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 2
%17 = load i8, i8* %16
%18 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 2
store i8 %17, i8* %18
%19 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 3
%20 = load i8, i8* %19
%21 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 3
store i8 %20, i8* %21
%22 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 4
%23 = load i8, i8* %22
%24 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 4
store i8 %23, i8* %24
%25 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 5
%26 = load i8, i8* %25
%27 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 5
store i8 %26, i8* %27
%28 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 6
%29 = load i8, i8* %28
%30 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 6
store i8 %29, i8* %30
%31 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 7
%32 = load i8, i8* %31
%33 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 7
store i8 %32, i8* %33
%34 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 8
%35 = load i8, i8* %34
%36 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 8
store i8 %35, i8* %36
%37 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %0, i64 %7, i64 %9, i64 9
%38 = load i8, i8* %37
%39 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %7, i64 %9, i64 9
store i8 %38, i8* %39
%40 = add nuw nsw i64 %9, 1
%41 = icmp eq i64 %40, 9
br i1 %41, label %42, label %8
42: ; preds = %8
%43 = add nuw nsw i64 %7, 1
%44 = icmp eq i64 %43, 9
br i1 %44, label %45, label %6
45: ; preds = %42
%46 = sext i8 %2 to i64
%47 = sext i8 %3 to i64
%48 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 0
store i8 %4, i8* %48
%49 = icmp eq i8 %4, 1
br i1 %49, label %50, label %52
50: ; preds = %45
%51 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 2
store i8 0, i8* %51
br label %58
52: ; preds = %45
%53 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 1
store i8 0, i8* %53
%54 = icmp eq i8 %4, 2
br i1 %54, label %58, label %55
55: ; preds = %52
%56 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 2
store i8 0, i8* %56
%57 = icmp eq i8 %4, 3
br i1 %57, label %63, label %60
58: ; preds = %50, %52
%59 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 3
store i8 0, i8* %59
br label %63
60: ; preds = %55
%61 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 3
store i8 0, i8* %61
%62 = icmp eq i8 %4, 4
br i1 %62, label %68, label %65
63: ; preds = %58, %55
%64 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 4
store i8 0, i8* %64
br label %68
65: ; preds = %60
%66 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 4
store i8 0, i8* %66
%67 = icmp eq i8 %4, 5
br i1 %67, label %73, label %70
68: ; preds = %63, %60
%69 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 5
store i8 0, i8* %69
br label %73
70: ; preds = %65
%71 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 5
store i8 0, i8* %71
%72 = icmp eq i8 %4, 6
br i1 %72, label %78, label %75
73: ; preds = %68, %65
%74 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 6
store i8 0, i8* %74
br label %78
75: ; preds = %70
%76 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 6
store i8 0, i8* %76
%77 = icmp eq i8 %4, 7
br i1 %77, label %83, label %80
78: ; preds = %73, %70
%79 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 7
store i8 0, i8* %79
br label %83
80: ; preds = %75
%81 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 7
store i8 0, i8* %81
%82 = icmp eq i8 %4, 8
br i1 %82, label %88, label %85
83: ; preds = %78, %75
%84 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 8
store i8 0, i8* %84
br label %88
85: ; preds = %80
%86 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 8
store i8 0, i8* %86
%87 = icmp eq i8 %4, 9
br i1 %87, label %90, label %88
88: ; preds = %80, %83, %85
%89 = getelementptr inbounds [9 x [10 x i8]], [9 x [10 x i8]]* %1, i64 %46, i64 %47, i64 9
store i8 0, i8* %89
br label %90
90: ; preds = %88, %85
ret void
}