void vertical(int y, char pattern[9][9], char possibilities[9][9][9]) {
  char holding[9] = "         ";
  for (int x = 0; x < 9; x++) {
    if (pattern[x][y] != ' ') {
      holding[x] = pattern[x][y];
    }
  }
  for (int x = 0; x < 9; x++) {
    if (pattern[x][y] == ' ') {
      for (int i = 0; i < 9; i++) {
        if (holding[i] != ' ') {
          possibilities[x][y][(int)(holding[i] - '0' - 1)] = ' ';
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<vertical>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    0xeea(%rip),%rax
mov    %rax,-0x21(%rbp)
mov    0xee8(%rip),%al
mov    %al,-0x19(%rbp)
movl   $0x0,-0x28(%rbp)
cmpl   $0x9,-0x28(%rbp)
jge    1185 <vertical+0x85>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
movslq -0x4(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     1172 <vertical+0x72>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
movslq -0x28(%rbp),%rax
mov    %cl,-0x21(%rbp,%rax,1)
jmp    1177 <vertical+0x77>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    112a <vertical+0x2a>
movl   $0x0,-0x2c(%rbp)
cmpl   $0x9,-0x2c(%rbp)
jge    1234 <vertical+0x134>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
movslq -0x4(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jne    1221 <vertical+0x121>
movl   $0x0,-0x30(%rbp)
cmpl   $0x9,-0x30(%rbp)
jge    121c <vertical+0x11c>
movslq -0x30(%rbp),%rax
movsbl -0x21(%rbp,%rax,1),%eax
cmp    $0x20,%eax
je     1209 <vertical+0x109>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x51,%rcx,%rcx
add    %rcx,%rax
movslq -0x4(%rbp),%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsbl -0x21(%rbp,%rcx,1),%ecx
sub    $0x30,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x20,(%rax,%rcx,1)
jmp    120e <vertical+0x10e>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11bd <vertical+0xbd>
jmp    1221 <vertical+0x121>
jmp    1226 <vertical+0x126>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    118c <vertical+0x8c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<vertical>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
movslq %edi,%rbp
movsbq (%rsi,%rbp,1),%r11
lea    0x9(%rsi,%rbp,1),%rcx
movsbq 0x9(%rsi,%rbp,1),%r8
movsbq 0x12(%rsi,%rbp,1),%r9
movsbq 0x1b(%rsi,%rbp,1),%r10
movsbq 0x24(%rsi,%rbp,1),%r14
movsbq 0x2d(%rsi,%rbp,1),%rax
movsbq 0x36(%rsi,%rbp,1),%rbx
movsbq 0x3f(%rsi,%rbp,1),%rdi
movsbq 0x48(%rsi,%rbp,1),%rsi
lea    0x0(%rbp,%rbp,8),%rbp
add    %rdx,%rbp
lea    (%r11,%rbp,1),%rdx
add    $0xffffffffffffffcf,%rdx
mov    %rdx,-0x8(%rsp)
lea    -0x31(%r8,%rbp,1),%rdx
mov    %rdx,-0x10(%rsp)
lea    -0x31(%r9,%rbp,1),%rdx
mov    %rdx,-0x18(%rsp)
lea    -0x31(%r10,%rbp,1),%rdx
mov    %rdx,-0x20(%rsp)
lea    -0x31(%r14,%rbp,1),%rdx
mov    %rdx,-0x28(%rsp)
lea    -0x31(%rax,%rbp,1),%rdx
mov    %rdx,-0x30(%rsp)
lea    -0x31(%rbx,%rbp,1),%rdx
mov    %rdx,-0x38(%rsp)
lea    (%rdi,%rbp,1),%r13
add    $0xffffffffffffffcf,%r13
lea    (%rsi,%rbp,1),%r12
add    $0xffffffffffffffcf,%r12
mov    %r11d,%r15d
xor    %ebp,%ebp
cmp    $0x20,%r15b
jne    120c <vertical+0x10c>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmp    $0x20,%r11b
jne    1230 <vertical+0x130>
cmp    $0x20,%r8b
jne    123f <vertical+0x13f>
cmp    $0x20,%r9b
jne    124e <vertical+0x14e>
cmp    $0x20,%r10b
jne    1261 <vertical+0x161>
cmp    $0x20,%r14b
jne    1274 <vertical+0x174>
cmp    $0x20,%al
jne    1285 <vertical+0x185>
cmp    $0x20,%bl
jne    1297 <vertical+0x197>
cmp    $0x20,%dil
jne    12aa <vertical+0x1aa>
cmp    $0x20,%sil
je     120c <vertical+0x10c>
movb   $0x20,(%r12,%rbp,1)
cmp    $0x288,%rbp
je     12bf <vertical+0x1bf>
movzbl (%rcx),%r15d
add    $0x51,%rbp
add    $0x9,%rcx
cmp    $0x20,%r15b
je     11c0 <vertical+0xc0>
jmp    120c <vertical+0x10c>
nopl   (%rax)
mov    -0x8(%rsp),%rdx
movb   $0x20,(%rdx,%rbp,1)
cmp    $0x20,%r8b
je     11cc <vertical+0xcc>
mov    -0x10(%rsp),%rdx
movb   $0x20,(%rdx,%rbp,1)
cmp    $0x20,%r9b
je     11d2 <vertical+0xd2>
mov    -0x18(%rsp),%rdx
movb   $0x20,(%rdx,%rbp,1)
cmp    $0x20,%r10b
je     11dc <vertical+0xdc>
mov    -0x20(%rsp),%rdx
movb   $0x20,(%rdx,%rbp,1)
cmp    $0x20,%r14b
je     11e6 <vertical+0xe6>
mov    -0x28(%rsp),%rdx
movb   $0x20,(%rdx,%rbp,1)
cmp    $0x20,%al
je     11ee <vertical+0xee>
mov    -0x30(%rsp),%rdx
movb   $0x20,(%rdx,%rbp,1)
cmp    $0x20,%bl
je     11f7 <vertical+0xf7>
mov    -0x38(%rsp),%rdx
movb   $0x20,(%rdx,%rbp,1)
cmp    $0x20,%dil
je     1201 <vertical+0x101>
movb   $0x20,0x0(%r13,%rbp,1)
cmp    $0x20,%sil
jne    1207 <vertical+0x107>
jmp    120c <vertical+0x10c>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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