int can_dilate(the_image, i, j, value)
int i, j;
short **the_image, value;
{
  int a, b, c, d, count, found = 0, no_neighbor, stack_pointer = -1,
                         stack_empty = 1, stack[12][2], pop_a, pop_b, one = 1,
                         zero = 0;
  short first_value, label = 2, temp[3][3];
  for (a = -1; a < 2; a++)
    for (b = -1; b < 2; b++)
      temp[a + 1][b + 1] = the_image[i + a][b + j];
  for (a = 0; a < 3; a++) {
    for (b = 0; b < 3; b++) {
      stack_empty = 1;
      stack_pointer = -1;
      if (temp[a][b] == value) {
        little_label_and_check(temp, stack, label, &stack_empty, &stack_pointer,
                               a, b, value);
        found = 1;
      }
      while (stack_empty == 0) {
        pop_a = stack[stack_pointer][0];
        pop_b = stack[stack_pointer][1];
        --stack_pointer;
        if (stack_pointer <= 0) {
          stack_pointer = 0;
          stack_empty = 1;
        }
        little_label_and_check(temp, stack, label, &stack_empty, &stack_pointer,
                               pop_a, pop_b, value);
      }
      if (found) {
        found = 0;
        label++;
      }
    }
  }
  first_value = -1;
  for (a = 0; a < 3; a++) {
    for (b = 0; b < 3; b++) {
      if (temp[a][b] != 0 && first_value == -1) {
        first_value = temp[a][b];
      }
      if (temp[a][b] != 0 && first_value != -1) {
        if (temp[a][b] != first_value) {
          return (zero);
        }
      }
    }
  }
  return (one);
}


x86 assembly (clang, -O0):
<can_dilate>:
push   %rbp
mov    %rsp,%rbp
sub    $0xe0,%rsp
mov    %cx,%ax
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ax,-0x1a(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0xffffffff,-0x3c(%rbp)
movl   $0x1,-0x40(%rbp)
movl   $0x1,-0xac(%rbp)
movl   $0x0,-0xb0(%rbp)
movw   $0x2,-0xb4(%rbp)
movl   $0xffffffff,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    11e3 <can_dilate+0xd3>
movl   $0xffffffff,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    11d0 <can_dilate+0xc0>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x24(%rbp),%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x20(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    -0xd0(%rbp),%rax
imul   $0x6,%rcx,%rcx
add    %rcx,%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1176 <can_dilate+0x66>
jmp    11d5 <can_dilate+0xc5>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1165 <can_dilate+0x55>
movl   $0x0,-0x20(%rbp)
cmpl   $0x3,-0x20(%rbp)
jge    1356 <can_dilate+0x246>
movl   $0x0,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jge    1343 <can_dilate+0x233>
movl   $0x1,-0x40(%rbp)
movl   $0xffffffff,-0x3c(%rbp)
movslq -0x20(%rbp),%rcx
lea    -0xd0(%rbp),%rax
imul   $0x6,%rcx,%rcx
add    %rcx,%rax
movslq -0x24(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
movswl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jne    1278 <can_dilate+0x168>
lea    -0xd0(%rbp),%rdi
lea    -0xa0(%rbp),%rsi
movswl -0xb4(%rbp),%edx
mov    -0x20(%rbp),%r9d
mov    -0x24(%rbp),%r10d
movswl -0x1a(%rbp),%eax
lea    -0x40(%rbp),%rcx
lea    -0x3c(%rbp),%r8
mov    %r10d,(%rsp)
mov    %eax,0x8(%rsp)
mov    $0x0,%al
call   1030 <little_label_and_check@plt>
movl   $0x1,-0x34(%rbp)
jmp    127d <can_dilate+0x16d>
cmpl   $0x0,-0x40(%rbp)
jne    130d <can_dilate+0x1fd>
movslq -0x3c(%rbp),%rax
mov    -0xa0(%rbp,%rax,8),%eax
mov    %eax,-0xa4(%rbp)
movslq -0x3c(%rbp),%rax
mov    -0x9c(%rbp,%rax,8),%eax
mov    %eax,-0xa8(%rbp)
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jg     12ca <can_dilate+0x1ba>
movl   $0x0,-0x3c(%rbp)
movl   $0x1,-0x40(%rbp)
lea    -0xd0(%rbp),%rdi
lea    -0xa0(%rbp),%rsi
movswl -0xb4(%rbp),%edx
mov    -0xa4(%rbp),%r9d
mov    -0xa8(%rbp),%r10d
movswl -0x1a(%rbp),%eax
lea    -0x40(%rbp),%rcx
lea    -0x3c(%rbp),%r8
mov    %r10d,(%rsp)
mov    %eax,0x8(%rsp)
mov    $0x0,%al
call   1030 <little_label_and_check@plt>
jmp    127d <can_dilate+0x16d>
cmpl   $0x0,-0x34(%rbp)
je     1330 <can_dilate+0x220>
movl   $0x0,-0x34(%rbp)
mov    -0xb4(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xb4(%rbp)
jmp    1335 <can_dilate+0x225>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11fb <can_dilate+0xeb>
jmp    1348 <can_dilate+0x238>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11ea <can_dilate+0xda>
movw   $0xffff,-0xb2(%rbp)
ff ff
movl   $0x0,-0x20(%rbp)
cmpl   $0x3,-0x20(%rbp)
jge    146a <can_dilate+0x35a>
movl   $0x0,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jge    1457 <can_dilate+0x347>
movslq -0x20(%rbp),%rcx
lea    -0xd0(%rbp),%rax
imul   $0x6,%rcx,%rcx
add    %rcx,%rax
movslq -0x24(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     13d5 <can_dilate+0x2c5>
movswl -0xb2(%rbp),%eax
cmp    $0xffffffff,%eax
jne    13d5 <can_dilate+0x2c5>
movslq -0x20(%rbp),%rcx
lea    -0xd0(%rbp),%rax
imul   $0x6,%rcx,%rcx
add    %rcx,%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0xb2(%rbp)
movslq -0x20(%rbp),%rcx
lea    -0xd0(%rbp),%rax
imul   $0x6,%rcx,%rcx
add    %rcx,%rax
movslq -0x24(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     1444 <can_dilate+0x334>
movswl -0xb2(%rbp),%eax
cmp    $0xffffffff,%eax
je     1444 <can_dilate+0x334>
movslq -0x20(%rbp),%rcx
lea    -0xd0(%rbp),%rax
imul   $0x6,%rcx,%rcx
add    %rcx,%rax
movslq -0x24(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
movswl -0xb2(%rbp),%ecx
cmp    %ecx,%eax
je     143f <can_dilate+0x32f>
mov    -0xb0(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1473 <can_dilate+0x363>
jmp    1444 <can_dilate+0x334>
jmp    1449 <can_dilate+0x339>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1377 <can_dilate+0x267>
jmp    145c <can_dilate+0x34c>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1366 <can_dilate+0x256>
mov    -0xac(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xe0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<can_dilate>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xa8,%rsp
movslq %edx,%rdx
movslq %esi,%rsi
mov    -0x8(%rdi,%rsi,8),%rbp
movzwl -0x2(%rbp,%rdx,2),%eax
mov    %ax,0x10(%rsp)
movzwl 0x0(%rbp,%rdx,2),%ebx
mov    %bx,0x12(%rsp)
movzwl 0x2(%rbp,%rdx,2),%ebp
mov    %bp,0x14(%rsp)
mov    (%rdi,%rsi,8),%rbp
movzwl -0x2(%rbp,%rdx,2),%ebx
mov    %bx,0x16(%rsp)
movzwl 0x0(%rbp,%rdx,2),%ebx
mov    %bx,0x18(%rsp)
movzwl 0x2(%rbp,%rdx,2),%ebp
mov    %bp,0x1a(%rsp)
mov    0x8(%rdi,%rsi,8),%rsi
movzwl -0x2(%rsi,%rdx,2),%edi
mov    %di,0x1c(%rsp)
movzwl (%rsi,%rdx,2),%edi
mov    %di,0x1e(%rsp)
movzwl 0x2(%rsi,%rdx,2),%edx
mov    %dx,0x20(%rsp)
movswl %cx,%r14d
mov    $0x2,%cx
mov    %ecx,0xc(%rsp)
lea    0x4(%rsp),%r12
lea    0x8(%rsp),%r13
xor    %r15d,%r15d
nopw   0x0(%rax,%rax,1)
movl   $0x1,0x4(%rsp)
movl   $0xffffffff,0x8(%rsp)
ff
cwtl
mov    %eax,0x30(%rsp)
cmp    %eax,%r14d
jne    1250 <can_dilate+0x140>
movswl 0xc(%rsp),%ebp
lea    0x10(%rsp),%rdi
lea    0x40(%rsp),%rsi
mov    %ebp,%edx
mov    %r12,%rcx
mov    %r13,%r8
mov    %r15d,%r9d
xor    %eax,%eax
push   %r14
push   $0x0
jmp    1207 <can_dilate+0xf7>
lea    0x10(%rsp),%rdi
lea    0x40(%rsp),%rsi
mov    %ebp,%edx
mov    %r12,%rcx
mov    %r13,%r8
xor    %eax,%eax
push   %r14
push   %rbx
call   1030 <little_label_and_check@plt>
add    $0x10,%rsp
cmpl   $0x0,0x4(%rsp)
jne    1250 <can_dilate+0x140>
movslq 0x8(%rsp),%rax
lea    -0x1(%rax),%ecx
mov    0x40(%rsp,%rax,8),%r9d
mov    0x44(%rsp,%rax,8),%ebx
mov    %ecx,0x8(%rsp)
cmp    $0x1,%rax
jg     11f0 <can_dilate+0xe0>
movl   $0x0,0x8(%rsp)
movl   $0x1,0x4(%rsp)
jmp    11f0 <can_dilate+0xe0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
xor    %eax,%eax
cmp    0x30(%rsp),%r14d
sete   %al
add    %eax,0xc(%rsp)
movl   $0x1,0x4(%rsp)
movl   $0xffffffff,0x8(%rsp)
ff
lea    (%r15,%r15,2),%rax
mov    %rax,0x30(%rsp)
movswl 0x12(%rsp,%rax,2),%eax
mov    %eax,0x3c(%rsp)
cmp    %eax,%r14d
jne    1310 <can_dilate+0x200>
movswl 0xc(%rsp),%ebp
lea    0x10(%rsp),%rdi
lea    0x40(%rsp),%rsi
mov    %ebp,%edx
mov    %r12,%rcx
mov    %r13,%r8
mov    %r15d,%r9d
xor    %eax,%eax
push   %r14
push   $0x1
jmp    12c7 <can_dilate+0x1b7>
nopl   0x0(%rax,%rax,1)
lea    0x10(%rsp),%rdi
lea    0x40(%rsp),%rsi
mov    %ebp,%edx
mov    %r12,%rcx
mov    %r13,%r8
xor    %eax,%eax
push   %r14
push   %rbx
call   1030 <little_label_and_check@plt>
add    $0x10,%rsp
cmpl   $0x0,0x4(%rsp)
jne    1310 <can_dilate+0x200>
movslq 0x8(%rsp),%rax
lea    -0x1(%rax),%ecx
mov    0x40(%rsp,%rax,8),%r9d
mov    0x44(%rsp,%rax,8),%ebx
mov    %ecx,0x8(%rsp)
cmp    $0x1,%rax
jg     12b0 <can_dilate+0x1a0>
movl   $0x0,0x8(%rsp)
movl   $0x1,0x4(%rsp)
jmp    12b0 <can_dilate+0x1a0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
xor    %eax,%eax
cmp    0x3c(%rsp),%r14d
sete   %al
add    %eax,0xc(%rsp)
movl   $0x1,0x4(%rsp)
movl   $0xffffffff,0x8(%rsp)
ff
mov    0x30(%rsp),%rax
movswl 0x14(%rsp,%rax,2),%eax
mov    %eax,0x30(%rsp)
cmp    %eax,%r14d
jne    13d0 <can_dilate+0x2c0>
movswl 0xc(%rsp),%ebp
lea    0x10(%rsp),%rdi
lea    0x40(%rsp),%rsi
mov    %ebp,%edx
mov    %r12,%rcx
mov    %r13,%r8
mov    %r15d,%r9d
xor    %eax,%eax
push   %r14
push   $0x2
jmp    1387 <can_dilate+0x277>
nopw   0x0(%rax,%rax,1)
lea    0x10(%rsp),%rdi
lea    0x40(%rsp),%rsi
mov    %ebp,%edx
mov    %r12,%rcx
mov    %r13,%r8
xor    %eax,%eax
push   %r14
push   %rbx
call   1030 <little_label_and_check@plt>
add    $0x10,%rsp
cmpl   $0x0,0x4(%rsp)
jne    13d0 <can_dilate+0x2c0>
movslq 0x8(%rsp),%rax
lea    -0x1(%rax),%ecx
mov    0x40(%rsp,%rax,8),%r9d
mov    0x44(%rsp,%rax,8),%ebx
mov    %ecx,0x8(%rsp)
cmp    $0x1,%rax
jg     1370 <can_dilate+0x260>
movl   $0x0,0x8(%rsp)
movl   $0x1,0x4(%rsp)
jmp    1370 <can_dilate+0x260>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%r15
cmp    $0x3,%r15
je     13f6 <can_dilate+0x2e6>
xor    %eax,%eax
cmp    0x30(%rsp),%r14d
sete   %al
add    %eax,0xc(%rsp)
lea    (%r15,%r15,2),%rax
movzwl 0x10(%rsp,%rax,2),%eax
jmp    11b0 <can_dilate+0xa0>
mov    0x10(%rsp),%eax
cmp    $0x1,%ax
sbb    %ecx,%ecx
or     %eax,%ecx
test   %ax,%ax
je     1416 <can_dilate+0x306>
cmp    $0xffff,%cx
je     1416 <can_dilate+0x306>
cmp    %cx,%ax
jne    152f <can_dilate+0x41f>
cmp    $0xffff,%cx
movzwl 0x12(%rsp),%edx
mov    %edx,%eax
cmovne %ecx,%eax
test   %dx,%dx
cmove  %ecx,%eax
je     143b <can_dilate+0x32b>
cmp    $0xffff,%ax
je     143b <can_dilate+0x32b>
cmp    %ax,%dx
jne    152f <can_dilate+0x41f>
cmp    $0xffff,%ax
mov    0x14(%rsp),%edx
mov    %edx,%ecx
cmovne %eax,%ecx
test   %dx,%dx
cmove  %eax,%ecx
je     145f <can_dilate+0x34f>
cmp    $0xffff,%cx
je     145f <can_dilate+0x34f>
cmp    %cx,%dx
jne    152f <can_dilate+0x41f>
cmp    $0xffff,%cx
movzwl 0x16(%rsp),%edx
mov    %edx,%eax
cmovne %ecx,%eax
test   %dx,%dx
cmove  %ecx,%eax
je     1484 <can_dilate+0x374>
cmp    $0xffff,%ax
je     1484 <can_dilate+0x374>
cmp    %ax,%dx
jne    152f <can_dilate+0x41f>
cmp    $0xffff,%ax
mov    0x18(%rsp),%edx
mov    %edx,%ecx
cmovne %eax,%ecx
test   %dx,%dx
cmove  %eax,%ecx
je     14a8 <can_dilate+0x398>
cmp    $0xffff,%cx
je     14a8 <can_dilate+0x398>
cmp    %cx,%dx
jne    152f <can_dilate+0x41f>
cmp    $0xffff,%cx
movzwl 0x1a(%rsp),%edx
mov    %edx,%eax
cmovne %ecx,%eax
test   %dx,%dx
cmove  %ecx,%eax
je     14c9 <can_dilate+0x3b9>
cmp    $0xffff,%ax
je     14c9 <can_dilate+0x3b9>
cmp    %ax,%dx
jne    152f <can_dilate+0x41f>
cmp    $0xffff,%ax
mov    0x1c(%rsp),%ecx
mov    %ecx,%edx
cmovne %eax,%edx
test   %cx,%cx
cmove  %eax,%edx
je     14e9 <can_dilate+0x3d9>
cmp    $0xffff,%dx
je     14e9 <can_dilate+0x3d9>
cmp    %dx,%cx
jne    152f <can_dilate+0x41f>
cmp    $0xffff,%dx
movzwl 0x1e(%rsp),%eax
mov    %eax,%ecx
cmovne %edx,%ecx
test   %ax,%ax
cmove  %edx,%ecx
je     150a <can_dilate+0x3fa>
cmp    $0xffff,%cx
je     150a <can_dilate+0x3fa>
cmp    %cx,%ax
jne    152f <can_dilate+0x41f>
cmp    $0xffff,%cx
mov    0x20(%rsp),%edx
mov    %edx,%esi
cmovne %ecx,%esi
mov    $0x1,%eax
test   %dx,%dx
cmove  %ecx,%esi
je     1531 <can_dilate+0x421>
cmp    $0xffff,%si
je     1531 <can_dilate+0x421>
cmp    %si,%dx
je     1531 <can_dilate+0x421>
xor    %eax,%eax
add    $0xa8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @can_dilate(i16** %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i16**
%7 = alloca i32
%8 = alloca i32
%9 = alloca i16
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca [12 x [2 x i32]]
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i16
%25 = alloca i16
%26 = alloca [3 x [3 x i16]]
%27 = trunc i32 %3 to i16
store i16** %0, i16*** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i16 %27, i16* %9
store i32 0, i32* %15
store i32 -1, i32* %17
store i32 1, i32* %18
store i32 1, i32* %22
store i32 0, i32* %23
store i16 2, i16* %25
store i32 -1, i32* %10
br label %28
28: ; preds = %61, %4
%29 = load i32, i32* %10
%30 = icmp slt i32 %29, 2
br i1 %30, label %31, label %64
31: ; preds = %28
store i32 -1, i32* %11
br label %32
32: ; preds = %57, %31
%33 = load i32, i32* %11
%34 = icmp slt i32 %33, 2
br i1 %34, label %35, label %60
35: ; preds = %32
%36 = load i16**, i16*** %6
%37 = load i32, i32* %7
%38 = load i32, i32* %10
%39 = add nsw i32 %37, %38
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i16*, i16** %36, i64 %40
%42 = load i16*, i16** %41
%43 = load i32, i32* %11
%44 = load i32, i32* %8
%45 = add nsw i32 %43, %44
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i16, i16* %42, i64 %46
%48 = load i16, i16* %47
%49 = load i32, i32* %10
%50 = add nsw i32 %49, 1
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %26, i64 0, i64 %51
%53 = load i32, i32* %11
%54 = add nsw i32 %53, 1
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [3 x i16], [3 x i16]* %52, i64 0, i64 %55
store i16 %48, i16* %56
br label %57
57: ; preds = %35
%58 = load i32, i32* %11
%59 = add nsw i32 %58, 1
store i32 %59, i32* %11
br label %32
60: ; preds = %32
br label %61
61: ; preds = %60
%62 = load i32, i32* %10
%63 = add nsw i32 %62, 1
store i32 %63, i32* %10
br label %28
64: ; preds = %28
store i32 0, i32* %10
br label %65
65: ; preds = %135, %64
%66 = load i32, i32* %10
%67 = icmp slt i32 %66, 3
br i1 %67, label %68, label %138
68: ; preds = %65
store i32 0, i32* %11
br label %69
69: ; preds = %131, %68
%70 = load i32, i32* %11
%71 = icmp slt i32 %70, 3
br i1 %71, label %72, label %134
72: ; preds = %69
store i32 1, i32* %18
store i32 -1, i32* %17
%73 = load i32, i32* %10
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %26, i64 0, i64 %74
%76 = load i32, i32* %11
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds [3 x i16], [3 x i16]* %75, i64 0, i64 %77
%79 = load i16, i16* %78
%80 = sext i16 %79 to i32
%81 = load i16, i16* %9
%82 = sext i16 %81 to i32
%83 = icmp eq i32 %80, %82
br i1 %83, label %84, label %94
84: ; preds = %72
%85 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %26, i64 0, i64 0
%86 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %19, i64 0, i64 0
%87 = load i16, i16* %25
%88 = sext i16 %87 to i32
%89 = load i32, i32* %10
%90 = load i32, i32* %11
%91 = load i16, i16* %9
%92 = sext i16 %91 to i32
%93 = call i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...) bitcast (i32 (...)* @little_label_and_check to i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...)*)([3 x i16]* %85, [2 x i32]* %86, i32 %88, i32* %18, i32* %17, i32 %89, i32 %90, i32 %92)
store i32 1, i32* %15
br label %94
94: ; preds = %84, %72
br label %95
95: ; preds = %114, %94
%96 = load i32, i32* %18
%97 = icmp eq i32 %96, 0
br i1 %97, label %98, label %124
98: ; preds = %95
%99 = load i32, i32* %17
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %19, i64 0, i64 %100
%102 = getelementptr inbounds [2 x i32], [2 x i32]* %101, i64 0, i64 0
%103 = load i32, i32* %102
store i32 %103, i32* %20
%104 = load i32, i32* %17
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %19, i64 0, i64 %105
%107 = getelementptr inbounds [2 x i32], [2 x i32]* %106, i64 0, i64 1
%108 = load i32, i32* %107
store i32 %108, i32* %21
%109 = load i32, i32* %17
%110 = add nsw i32 %109, -1
store i32 %110, i32* %17
%111 = load i32, i32* %17
%112 = icmp sle i32 %111, 0
br i1 %112, label %113, label %114
113: ; preds = %98
store i32 0, i32* %17
store i32 1, i32* %18
br label %114
114: ; preds = %113, %98
%115 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %26, i64 0, i64 0
%116 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %19, i64 0, i64 0
%117 = load i16, i16* %25
%118 = sext i16 %117 to i32
%119 = load i32, i32* %20
%120 = load i32, i32* %21
%121 = load i16, i16* %9
%122 = sext i16 %121 to i32
%123 = call i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...) bitcast (i32 (...)* @little_label_and_check to i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...)*)([3 x i16]* %115, [2 x i32]* %116, i32 %118, i32* %18, i32* %17, i32 %119, i32 %120, i32 %122)
br label %95
124: ; preds = %95
%125 = load i32, i32* %15
%126 = icmp ne i32 %125, 0
br i1 %126, label %127, label %130
127: ; preds = %124
store i32 0, i32* %15
%128 = load i16, i16* %25
%129 = add i16 %128, 1
store i16 %129, i16* %25
br label %130
130: ; preds = %127, %124
br label %131
131: ; preds = %130
%132 = load i32, i32* %11
%133 = add nsw i32 %132, 1
store i32 %133, i32* %11
br label %69
134: ; preds = %69
br label %135
135: ; preds = %134
%136 = load i32, i32* %10
%137 = add nsw i32 %136, 1
store i32 %137, i32* %10
br label %65
138: ; preds = %65
store i16 -1, i16* %24
store i32 0, i32* %10
br label %139
139: ; preds = %202, %138
%140 = load i32, i32* %10
%141 = icmp slt i32 %140, 3
br i1 %141, label %142, label %205
142: ; preds = %139
store i32 0, i32* %11
br label %143
143: ; preds = %198, %142
%144 = load i32, i32* %11
%145 = icmp slt i32 %144, 3
br i1 %145, label %146, label %201
146: ; preds = %143
%147 = load i32, i32* %10
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %26, i64 0, i64 %148
%150 = load i32, i32* %11
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds [3 x i16], [3 x i16]* %149, i64 0, i64 %151
%153 = load i16, i16* %152
%154 = sext i16 %153 to i32
%155 = icmp ne i32 %154, 0
br i1 %155, label %156, label %168
156: ; preds = %146
%157 = load i16, i16* %24
%158 = sext i16 %157 to i32
%159 = icmp eq i32 %158, -1
br i1 %159, label %160, label %168
160: ; preds = %156
%161 = load i32, i32* %10
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %26, i64 0, i64 %162
%164 = load i32, i32* %11
%165 = sext i32 %164 to i64
%166 = getelementptr inbounds [3 x i16], [3 x i16]* %163, i64 0, i64 %165
%167 = load i16, i16* %166
store i16 %167, i16* %24
br label %168
168: ; preds = %160, %156, %146
%169 = load i32, i32* %10
%170 = sext i32 %169 to i64
%171 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %26, i64 0, i64 %170
%172 = load i32, i32* %11
%173 = sext i32 %172 to i64
%174 = getelementptr inbounds [3 x i16], [3 x i16]* %171, i64 0, i64 %173
%175 = load i16, i16* %174
%176 = sext i16 %175 to i32
%177 = icmp ne i32 %176, 0
br i1 %177, label %178, label %197
178: ; preds = %168
%179 = load i16, i16* %24
%180 = sext i16 %179 to i32
%181 = icmp ne i32 %180, -1
br i1 %181, label %182, label %197
182: ; preds = %178
%183 = load i32, i32* %10
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %26, i64 0, i64 %184
%186 = load i32, i32* %11
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds [3 x i16], [3 x i16]* %185, i64 0, i64 %187
%189 = load i16, i16* %188
%190 = sext i16 %189 to i32
%191 = load i16, i16* %24
%192 = sext i16 %191 to i32
%193 = icmp ne i32 %190, %192
br i1 %193, label %194, label %196
194: ; preds = %182
%195 = load i32, i32* %23
store i32 %195, i32* %5
br label %207
196: ; preds = %182
br label %197
197: ; preds = %196, %178, %168
br label %198
198: ; preds = %197
%199 = load i32, i32* %11
%200 = add nsw i32 %199, 1
store i32 %200, i32* %11
br label %143
201: ; preds = %143
br label %202
202: ; preds = %201
%203 = load i32, i32* %10
%204 = add nsw i32 %203, 1
store i32 %204, i32* %10
br label %139
205: ; preds = %139
%206 = load i32, i32* %22
store i32 %206, i32* %5
br label %207
207: ; preds = %205, %194
%208 = load i32, i32* %5
ret i32 %208
}

LLVM IR (-O2):
define i32 @can_dilate(i16** nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca [12 x [2 x i32]]
%8 = alloca [3 x [3 x i16]]
%9 = bitcast i32* %5 to i8*
%10 = bitcast i32* %6 to i8*
%11 = bitcast [12 x [2 x i32]]* %7 to i8*
%12 = bitcast [3 x [3 x i16]]* %8 to i8*
%13 = sext i32 %2 to i64
%14 = add nsw i64 %13, -1
%15 = sext i32 %1 to i64
%16 = add nsw i64 %15, -1
%17 = getelementptr inbounds i16*, i16** %0, i64 %16
%18 = load i16*, i16** %17
%19 = getelementptr inbounds i16, i16* %18, i64 %14
%20 = load i16, i16* %19
%21 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 0, i64 0
store i16 %20, i16* %21
%22 = getelementptr inbounds i16, i16* %18, i64 %13
%23 = load i16, i16* %22
%24 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 0, i64 1
store i16 %23, i16* %24
%25 = add nsw i64 %13, 1
%26 = getelementptr inbounds i16, i16* %18, i64 %25
%27 = load i16, i16* %26
%28 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 0, i64 2
store i16 %27, i16* %28
%29 = getelementptr inbounds i16*, i16** %0, i64 %15
%30 = load i16*, i16** %29
%31 = getelementptr inbounds i16, i16* %30, i64 %14
%32 = load i16, i16* %31
%33 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 1, i64 0
store i16 %32, i16* %33
%34 = getelementptr inbounds i16, i16* %30, i64 %13
%35 = load i16, i16* %34
%36 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 1, i64 1
store i16 %35, i16* %36
%37 = getelementptr inbounds i16, i16* %30, i64 %25
%38 = load i16, i16* %37
%39 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 1, i64 2
store i16 %38, i16* %39
%40 = add nsw i64 %15, 1
%41 = getelementptr inbounds i16*, i16** %0, i64 %40
%42 = load i16*, i16** %41
%43 = getelementptr inbounds i16, i16* %42, i64 %14
%44 = load i16, i16* %43
%45 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 2, i64 0
store i16 %44, i16* %45
%46 = getelementptr inbounds i16, i16* %42, i64 %13
%47 = load i16, i16* %46
%48 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 2, i64 1
store i16 %47, i16* %48
%49 = getelementptr inbounds i16, i16* %42, i64 %25
%50 = load i16, i16* %49
%51 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 2, i64 2
store i16 %50, i16* %51
%52 = shl i32 %3, 16
%53 = ashr exact i32 %52, 16
%54 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 0
%55 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %7, i64 0, i64 0
br label %56
56: ; preds = %145, %4
%57 = phi i16 [ %20, %4 ], [ %149, %145 ]
%58 = phi i64 [ 0, %4 ], [ %143, %145 ]
%59 = phi i16 [ 2, %4 ], [ %147, %145 ]
store i32 1, i32* %6
store i32 -1, i32* %5
%60 = sext i16 %57 to i32
%61 = icmp eq i32 %53, %60
br i1 %61, label %62, label %84
62: ; preds = %56
%63 = sext i16 %59 to i32
%64 = trunc i64 %58 to i32
%65 = call i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...) bitcast (i32 (...)* @little_label_and_check to i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...)*)([3 x i16]* %54, [2 x i32]* %55, i32 %63, i32* %6, i32* %5, i32 %64, i32 0, i32 %53)
%66 = load i32, i32* %6
%67 = icmp eq i32 %66, 0
br i1 %67, label %68, label %84
68: ; preds = %62
%69 = sext i16 %59 to i32
br label %70
70: ; preds = %68, %80
%71 = load i32, i32* %5
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %7, i64 0, i64 %72, i64 0
%74 = load i32, i32* %73
%75 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %7, i64 0, i64 %72, i64 1
%76 = load i32, i32* %75
%77 = add nsw i32 %71, -1
store i32 %77, i32* %5
%78 = icmp slt i32 %71, 2
br i1 %78, label %79, label %80
79: ; preds = %70
store i32 0, i32* %5
store i32 1, i32* %6
br label %80
80: ; preds = %79, %70
%81 = call i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...) bitcast (i32 (...)* @little_label_and_check to i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...)*)([3 x i16]* %54, [2 x i32]* %55, i32 %69, i32* %6, i32* %5, i32 %74, i32 %76, i32 %53)
%82 = load i32, i32* %6
%83 = icmp eq i32 %82, 0
br i1 %83, label %70, label %84
84: ; preds = %80, %56, %62
%85 = zext i1 %61 to i16
%86 = add i16 %59, %85
store i32 1, i32* %6
store i32 -1, i32* %5
%87 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 %58, i64 1
%88 = load i16, i16* %87
%89 = sext i16 %88 to i32
%90 = icmp eq i32 %53, %89
br i1 %90, label %91, label %113
91: ; preds = %84
%92 = sext i16 %86 to i32
%93 = trunc i64 %58 to i32
%94 = call i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...) bitcast (i32 (...)* @little_label_and_check to i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...)*)([3 x i16]* %54, [2 x i32]* %55, i32 %92, i32* %6, i32* %5, i32 %93, i32 1, i32 %53)
%95 = load i32, i32* %6
%96 = icmp eq i32 %95, 0
br i1 %96, label %97, label %113
97: ; preds = %91
%98 = sext i16 %86 to i32
br label %99
99: ; preds = %109, %97
%100 = load i32, i32* %5
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %7, i64 0, i64 %101, i64 0
%103 = load i32, i32* %102
%104 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %7, i64 0, i64 %101, i64 1
%105 = load i32, i32* %104
%106 = add nsw i32 %100, -1
store i32 %106, i32* %5
%107 = icmp slt i32 %100, 2
br i1 %107, label %108, label %109
108: ; preds = %99
store i32 0, i32* %5
store i32 1, i32* %6
br label %109
109: ; preds = %108, %99
%110 = call i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...) bitcast (i32 (...)* @little_label_and_check to i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...)*)([3 x i16]* %54, [2 x i32]* %55, i32 %98, i32* %6, i32* %5, i32 %103, i32 %105, i32 %53)
%111 = load i32, i32* %6
%112 = icmp eq i32 %111, 0
br i1 %112, label %99, label %113
113: ; preds = %109, %84, %91
%114 = zext i1 %90 to i16
%115 = add i16 %86, %114
store i32 1, i32* %6
store i32 -1, i32* %5
%116 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 %58, i64 2
%117 = load i16, i16* %116
%118 = sext i16 %117 to i32
%119 = icmp eq i32 %53, %118
br i1 %119, label %120, label %142
120: ; preds = %113
%121 = sext i16 %115 to i32
%122 = trunc i64 %58 to i32
%123 = call i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...) bitcast (i32 (...)* @little_label_and_check to i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...)*)([3 x i16]* %54, [2 x i32]* %55, i32 %121, i32* %6, i32* %5, i32 %122, i32 2, i32 %53)
%124 = load i32, i32* %6
%125 = icmp eq i32 %124, 0
br i1 %125, label %126, label %142
126: ; preds = %120
%127 = sext i16 %115 to i32
br label %128
128: ; preds = %138, %126
%129 = load i32, i32* %5
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %7, i64 0, i64 %130, i64 0
%132 = load i32, i32* %131
%133 = getelementptr inbounds [12 x [2 x i32]], [12 x [2 x i32]]* %7, i64 0, i64 %130, i64 1
%134 = load i32, i32* %133
%135 = add nsw i32 %129, -1
store i32 %135, i32* %5
%136 = icmp slt i32 %129, 2
br i1 %136, label %137, label %138
137: ; preds = %128
store i32 0, i32* %5
store i32 1, i32* %6
br label %138
138: ; preds = %137, %128
%139 = call i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...) bitcast (i32 (...)* @little_label_and_check to i32 ([3 x i16]*, [2 x i32]*, i32, i32*, i32*, i32, i32, i32, ...)*)([3 x i16]* %54, [2 x i32]* %55, i32 %127, i32* %6, i32* %5, i32 %132, i32 %134, i32 %53)
%140 = load i32, i32* %6
%141 = icmp eq i32 %140, 0
br i1 %141, label %128, label %142
142: ; preds = %138, %113, %120
%143 = add nuw nsw i64 %58, 1
%144 = icmp eq i64 %143, 3
br i1 %144, label %150, label %145
145: ; preds = %142
%146 = zext i1 %119 to i16
%147 = add i16 %115, %146
%148 = getelementptr inbounds [3 x [3 x i16]], [3 x [3 x i16]]* %8, i64 0, i64 %143, i64 0
%149 = load i16, i16* %148
br label %56
150: ; preds = %142
%151 = load i16, i16* %21
%152 = icmp eq i16 %151, 0
%153 = select i1 %152, i16 -1, i16 %151
%154 = icmp eq i16 %153, -1
%155 = or i1 %152, %154
%156 = icmp eq i16 %151, %153
%157 = or i1 %155, %156
br i1 %157, label %158, label %238
158: ; preds = %150
%159 = load i16, i16* %24
%160 = icmp ne i16 %159, 0
%161 = select i1 %160, i1 %154, i1 false
%162 = select i1 %161, i16 %159, i16 %153
%163 = icmp eq i16 %162, -1
%164 = xor i1 %160, true
%165 = select i1 %164, i1 true, i1 %163
%166 = icmp eq i16 %159, %162
%167 = select i1 %165, i1 true, i1 %166
br i1 %167, label %168, label %238
168: ; preds = %158
%169 = load i16, i16* %28
%170 = icmp ne i16 %169, 0
%171 = select i1 %170, i1 %163, i1 false
%172 = select i1 %171, i16 %169, i16 %162
%173 = icmp eq i16 %172, -1
%174 = xor i1 %170, true
%175 = select i1 %174, i1 true, i1 %173
%176 = icmp eq i16 %169, %172
%177 = select i1 %175, i1 true, i1 %176
br i1 %177, label %178, label %238
178: ; preds = %168
%179 = load i16, i16* %33
%180 = icmp ne i16 %179, 0
%181 = select i1 %180, i1 %173, i1 false
%182 = select i1 %181, i16 %179, i16 %172
%183 = icmp eq i16 %182, -1
%184 = xor i1 %180, true
%185 = select i1 %184, i1 true, i1 %183
%186 = icmp eq i16 %179, %182
%187 = select i1 %185, i1 true, i1 %186
br i1 %187, label %188, label %238
188: ; preds = %178
%189 = load i16, i16* %36
%190 = icmp ne i16 %189, 0
%191 = select i1 %190, i1 %183, i1 false
%192 = select i1 %191, i16 %189, i16 %182
%193 = icmp eq i16 %192, -1
%194 = xor i1 %190, true
%195 = select i1 %194, i1 true, i1 %193
%196 = icmp eq i16 %189, %192
%197 = select i1 %195, i1 true, i1 %196
br i1 %197, label %198, label %238
198: ; preds = %188
%199 = load i16, i16* %39
%200 = icmp ne i16 %199, 0
%201 = select i1 %200, i1 %193, i1 false
%202 = select i1 %201, i16 %199, i16 %192
%203 = icmp eq i16 %202, -1
%204 = xor i1 %200, true
%205 = select i1 %204, i1 true, i1 %203
%206 = icmp eq i16 %199, %202
%207 = select i1 %205, i1 true, i1 %206
br i1 %207, label %208, label %238
208: ; preds = %198
%209 = load i16, i16* %45
%210 = icmp ne i16 %209, 0
%211 = select i1 %210, i1 %203, i1 false
%212 = select i1 %211, i16 %209, i16 %202
%213 = icmp eq i16 %212, -1
%214 = xor i1 %210, true
%215 = select i1 %214, i1 true, i1 %213
%216 = icmp eq i16 %209, %212
%217 = select i1 %215, i1 true, i1 %216
br i1 %217, label %218, label %238
218: ; preds = %208
%219 = load i16, i16* %48
%220 = icmp ne i16 %219, 0
%221 = select i1 %220, i1 %213, i1 false
%222 = select i1 %221, i16 %219, i16 %212
%223 = icmp eq i16 %222, -1
%224 = xor i1 %220, true
%225 = select i1 %224, i1 true, i1 %223
%226 = icmp eq i16 %219, %222
%227 = select i1 %225, i1 true, i1 %226
br i1 %227, label %228, label %238
228: ; preds = %218
%229 = load i16, i16* %51
%230 = icmp ne i16 %229, 0
%231 = select i1 %230, i1 %223, i1 false
%232 = select i1 %231, i16 %229, i16 %222
%233 = icmp eq i16 %232, -1
%234 = xor i1 %230, true
%235 = select i1 %234, i1 true, i1 %233
%236 = icmp eq i16 %229, %232
%237 = select i1 %235, i1 true, i1 %236
br i1 %237, label %239, label %238
238: ; preds = %228, %218, %208, %198, %188, %178, %168, %158, %150
br label %239
239: ; preds = %228, %238
%240 = phi i32 [ 0, %238 ], [ 1, %228 ]
ret i32 %240
}