#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 */

/* Variables and functions */
int /*<<< orphan*/ array_append(int **, int *, int *, int);
int /*<<< orphan*/ free(int *);
void calculate_distance_map(int width, int height, unsigned int *flags,
                            unsigned int flag, unsigned mask, int *xs, int *ys,
                            int n, int *dist_map) {
  int *src = NULL;
  int src_size = 0, src_capa = 0;
  int *dst = NULL;
  int dst_size = 0, dst_capa = 0;
  for (int i = 0; i < width * height; ++i) {
    unsigned int is_walkable = (flags[i] & mask) == (flag & mask);
    dist_map[i] = is_walkable ? (-1) : (-2);
  }
  for (int i = 0; i < n; ++i) {
    array_append(&src, &src_size, &src_capa, xs[i] + ys[i] * width);
  }
  int dist = 0;
  while (src_size > 0) {
    for (int i = 0; i < src_size; ++i) {
      int idx = src[i];
      int x = idx % width;
      int y = idx / width;
      dist_map[idx] = dist;
      for (int Y = y - 1; Y <= y + 1; ++Y) {
        if (Y < 0 || Y >= height)
          continue;
        for (int X = x - 1; X <= x + 1; ++X) {
          if (X < 0 || X >= width)
            continue;
          int IDX = X + Y * width;
          if (dist_map[IDX] == (-1)) {
            dist_map[IDX] = (-3);
            array_append(&dst, &dst_size, &dst_capa, IDX);
          }
        }
      }
    }
    int *tmp0 = src;
    src = dst;
    dst = tmp0;
    int tmp1 = src_capa;
    src_capa = dst_capa;
    dst_capa = tmp1;
    src_size = dst_size;
    dst_size = 0;
    dist += 1;
  }
  free(src);
  free(dst);
}


x86 assembly (clang, -O0):
<calculate_distance_map>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    -0x4(%rbp),%ecx
imul   -0x8(%rbp),%ecx
cmp    %ecx,%eax
jge    11dd <calculate_distance_map+0xbd>
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
and    -0x18(%rbp),%eax
mov    -0x14(%rbp),%ecx
and    -0x18(%rbp),%ecx
cmp    %ecx,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%ecx
mov    $0xfffffffe,%edx
mov    $0xffffffff,%eax
cmp    $0x0,%ecx
cmovne %eax,%edx
mov    0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    117e <calculate_distance_map+0x5e>
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    122b <calculate_distance_map+0x10b>
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%ecx
mov    0x10(%rbp),%rax
movslq -0x4c(%rbp),%rdx
mov    (%rax,%rdx,4),%eax
imul   -0x4(%rbp),%eax
add    %eax,%ecx
lea    -0x28(%rbp),%rdi
lea    -0x2c(%rbp),%rsi
lea    -0x30(%rbp),%rdx
call   1040 <array_append@plt>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    11e4 <calculate_distance_map+0xc4>
movl   $0x0,-0x50(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jle    13ab <calculate_distance_map+0x28b>
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1366 <calculate_distance_map+0x246>
mov    -0x28(%rbp),%rax
movslq -0x54(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cltd
idivl  -0x4(%rbp)
mov    %edx,-0x5c(%rbp)
mov    -0x58(%rbp),%eax
cltd
idivl  -0x4(%rbp)
mov    %eax,-0x60(%rbp)
mov    -0x50(%rbp),%edx
mov    0x20(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x60(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x64(%rbp)
mov    -0x64(%rbp),%eax
mov    -0x60(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jg     1353 <calculate_distance_map+0x233>
cmpl   $0x0,-0x64(%rbp)
jl     12af <calculate_distance_map+0x18f>
mov    -0x64(%rbp),%eax
cmp    -0x8(%rbp),%eax
jl     12b4 <calculate_distance_map+0x194>
jmp    1345 <calculate_distance_map+0x225>
mov    -0x5c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x68(%rbp)
mov    -0x68(%rbp),%eax
mov    -0x5c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jg     1340 <calculate_distance_map+0x220>
cmpl   $0x0,-0x68(%rbp)
jl     12e4 <calculate_distance_map+0x1c4>
mov    -0x68(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     12e9 <calculate_distance_map+0x1c9>
jmp    1332 <calculate_distance_map+0x212>
mov    -0x68(%rbp),%eax
mov    -0x64(%rbp),%ecx
imul   -0x4(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x6c(%rbp)
mov    0x20(%rbp),%rax
movslq -0x6c(%rbp),%rcx
cmpl   $0xffffffff,(%rax,%rcx,4)
jne    132d <calculate_distance_map+0x20d>
mov    0x20(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movl   $0xfffffffd,(%rax,%rcx,4)
mov    -0x6c(%rbp),%ecx
lea    -0x38(%rbp),%rdi
lea    -0x3c(%rbp),%rsi
lea    -0x40(%rbp),%rdx
call   1040 <array_append@plt>
jmp    1332 <calculate_distance_map+0x212>
mov    -0x68(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x68(%rbp)
jmp    12bd <calculate_distance_map+0x19d>
jmp    1345 <calculate_distance_map+0x225>
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    1288 <calculate_distance_map+0x168>
jmp    1358 <calculate_distance_map+0x238>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1243 <calculate_distance_map+0x123>
mov    -0x28(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x78(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x7c(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1232 <calculate_distance_map+0x112>
mov    -0x28(%rbp),%rdi
call   1030 <free@plt>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<calculate_distance_map>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    0xb0(%rsp),%r14
mov    0xa8(%rsp),%r15d
movq   $0x0,0x18(%rsp)
movl   $0x0,0x8(%rsp)
movl   $0x0,0x14(%rsp)
movq   $0x0,0x28(%rsp)
movl   $0x0,0x10(%rsp)
movl   $0x0,0xc(%rsp)
mov    %esi,%eax
imul   %edi,%eax
test   %eax,%eax
jle    131f <calculate_distance_map+0x1ff>
mov    %eax,%r11d
cmp    $0x8,%eax
jb     1197 <calculate_distance_map+0x77>
lea    (%rdx,%r11,4),%rax
cmp    %r14,%rax
jbe    120a <calculate_distance_map+0xea>
lea    (%r14,%r11,4),%rax
cmp    %rdx,%rax
jbe    120a <calculate_distance_map+0xea>
xor    %ebx,%ebx
mov    %rbx,%rax
not    %rax
test   $0x1,%r11b
je     11c0 <calculate_distance_map+0xa0>
mov    (%rdx,%rbx,4),%r10d
xor    %ecx,%r10d
xor    %ebp,%ebp
test   %r8d,%r10d
sete   %bpl
or     $0xfffffffe,%ebp
mov    %ebp,(%r14,%rbx,4)
or     $0x1,%rbx
add    %r11,%rax
je     131f <calculate_distance_map+0x1ff>
nopl   0x0(%rax)
mov    (%rdx,%rbx,4),%eax
xor    %ecx,%eax
xor    %ebp,%ebp
test   %r8d,%eax
sete   %bpl
or     $0xfffffffe,%ebp
mov    %ebp,(%r14,%rbx,4)
mov    0x4(%rdx,%rbx,4),%eax
xor    %ecx,%eax
xor    %ebp,%ebp
test   %r8d,%eax
sete   %bpl
or     $0xfffffffe,%ebp
mov    %ebp,0x4(%r14,%rbx,4)
add    $0x2,%rbx
cmp    %rbx,%r11
jne    11d0 <calculate_distance_map+0xb0>
jmp    131f <calculate_distance_map+0x1ff>
mov    %r11d,%ebx
and    $0xfffffff8,%ebx
movd   %ecx,%xmm0
pshufd $0x0,%xmm0,%xmm1
movd   %r8d,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x8(%rbx),%rax
mov    %rax,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rax,%rax
je     1526 <calculate_distance_map+0x406>
mov    %r10,%rax
and    $0xfffffffffffffffe,%rax
xor    %ebp,%ebp
pxor   %xmm2,%xmm2
movdqa 0xdb0(%rip),%xmm3
movdqu (%rdx,%rbp,4),%xmm4
movdqu 0x10(%rdx,%rbp,4),%xmm5
pxor   %xmm1,%xmm4
pxor   %xmm1,%xmm5
pand   %xmm0,%xmm4
pand   %xmm0,%xmm5
pcmpeqd %xmm2,%xmm4
por    %xmm3,%xmm4
pcmpeqd %xmm2,%xmm5
por    %xmm3,%xmm5
movdqu %xmm4,(%r14,%rbp,4)
movdqu %xmm5,0x10(%r14,%rbp,4)
movdqu 0x20(%rdx,%rbp,4),%xmm4
movdqu 0x30(%rdx,%rbp,4),%xmm5
pxor   %xmm1,%xmm4
pxor   %xmm1,%xmm5
pand   %xmm0,%xmm4
pand   %xmm0,%xmm5
pcmpeqd %xmm2,%xmm4
por    %xmm3,%xmm4
pcmpeqd %xmm2,%xmm5
por    %xmm3,%xmm5
movdqu %xmm4,0x20(%r14,%rbp,4)
movdqu %xmm5,0x30(%r14,%rbp,4)
add    $0x10,%rbp
add    $0xfffffffffffffffe,%rax
jne    1250 <calculate_distance_map+0x130>
test   $0x1,%r10b
je     1316 <calculate_distance_map+0x1f6>
movdqu (%rdx,%rbp,4),%xmm2
movdqu 0x10(%rdx,%rbp,4),%xmm3
pxor   %xmm1,%xmm2
pxor   %xmm1,%xmm3
pand   %xmm0,%xmm2
pand   %xmm0,%xmm3
pxor   %xmm0,%xmm0
pcmpeqd %xmm0,%xmm2
movdqa 0xd03(%rip),%xmm1
por    %xmm1,%xmm2
pcmpeqd %xmm0,%xmm3
por    %xmm1,%xmm3
movdqu %xmm2,(%r14,%rbp,4)
movdqu %xmm3,0x10(%r14,%rbp,4)
cmp    %r11,%rbx
jne    1199 <calculate_distance_map+0x79>
test   %r15d,%r15d
jle    1503 <calculate_distance_map+0x3e3>
mov    %esi,0x20(%rsp)
mov    %r15d,%ebp
mov    %edi,%ebx
xor    %r12d,%r12d
lea    0x8(%rsp),%r13
mov    %r9,%r14
lea    0x14(%rsp),%r15
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    0xa0(%rsp),%rax
mov    (%rax,%r12,4),%ecx
imul   %ebx,%ecx
add    (%r14,%r12,4),%ecx
lea    0x18(%rsp),%rdi
mov    %r13,%rsi
mov    %r15,%rdx
call   1040 <array_append@plt>
add    $0x1,%r12
cmp    %r12,%rbp
jne    1350 <calculate_distance_map+0x230>
cmpl   $0x0,0x8(%rsp)
mov    0x20(%rsp),%eax
jle    1503 <calculate_distance_map+0x3e3>
movslq %ebx,%r13
cltq
mov    %rax,0x50(%rsp)
lea    0x0(,%r13,4),%rax
mov    %rax,0x58(%rsp)
xor    %eax,%eax
mov    %rax,0x30(%rsp)
mov    %ebx,0x3c(%rsp)
jmp    13f9 <calculate_distance_map+0x2d9>
nop
mov    0x28(%rsp),%rdi
mov    0xc(%rsp),%eax
mov    0x10(%rsp),%ecx
mov    0x18(%rsp),%rdx
mov    %rdi,0x18(%rsp)
mov    %rdx,0x28(%rsp)
mov    0x14(%rsp),%edx
mov    %eax,0x14(%rsp)
mov    %edx,0xc(%rsp)
mov    %ecx,0x8(%rsp)
movl   $0x0,0x10(%rsp)
mov    0x30(%rsp),%rax
add    $0x1,%eax
mov    %rax,0x30(%rsp)
test   %ecx,%ecx
jle    1508 <calculate_distance_map+0x3e8>
xor    %ecx,%ecx
jmp    1413 <calculate_distance_map+0x2f3>
nopl   (%rax)
mov    0x40(%rsp),%rcx
add    $0x1,%rcx
movslq 0x8(%rsp),%rax
cmp    %rax,%rcx
jge    13b0 <calculate_distance_map+0x290>
mov    0x18(%rsp),%rax
mov    %rcx,0x40(%rsp)
movslq (%rax,%rcx,4),%rcx
mov    %ecx,%eax
cltd
idiv   %ebx
mov    0xb0(%rsp),%rdi
mov    0x30(%rsp),%rsi
mov    %esi,(%rdi,%rcx,4)
lea    -0x1(%rax),%ecx
lea    -0x1(%rdx),%esi
movslq %esi,%rsi
mov    %rsi,0x48(%rsp)
movslq %edx,%r15
movslq %ecx,%rcx
cltq
mov    %rax,0x60(%rsp)
mov    %r13,%rax
imul   %rcx,%rax
lea    (%rdi,%rax,4),%rbp
mov    %ecx,%eax
imul   %ebx,%eax
lea    (%r15,%rax,1),%r14d
add    $0xffffffff,%r14d
jmp    1493 <calculate_distance_map+0x373>
nopl   0x0(%rax,%rax,1)
mov    0x20(%rsp),%rcx
lea    0x1(%rcx),%rax
add    0x58(%rsp),%rbp
mov    0x3c(%rsp),%ebx
add    %ebx,%r14d
cmp    0x60(%rsp),%rcx
mov    %rax,%rcx
jg     1400 <calculate_distance_map+0x2e0>
mov    %rcx,0x20(%rsp)
test   %rcx,%rcx
js     1470 <calculate_distance_map+0x350>
mov    0x20(%rsp),%rax
cmp    0x50(%rsp),%rax
jge    1470 <calculate_distance_map+0x350>
mov    %r14d,%ebx
mov    0x48(%rsp),%r12
jmp    14d0 <calculate_distance_map+0x3b0>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    0x1(%r12),%rax
add    $0x1,%ebx
cmp    %r15,%r12
mov    %rax,%r12
jg     1470 <calculate_distance_map+0x350>
test   %r12,%r12
js     14c0 <calculate_distance_map+0x3a0>
cmp    %r13,%r12
jge    14c0 <calculate_distance_map+0x3a0>
cmpl   $0xffffffff,0x0(%rbp,%r12,4)
jne    14c0 <calculate_distance_map+0x3a0>
movl   $0xfffffffd,0x0(%rbp,%r12,4)
ff ff
lea    0x28(%rsp),%rdi
lea    0x10(%rsp),%rsi
lea    0xc(%rsp),%rdx
mov    %ebx,%ecx
call   1040 <array_append@plt>
jmp    14c0 <calculate_distance_map+0x3a0>
mov    0x18(%rsp),%rdi
call   1030 <free@plt>
mov    0x28(%rsp),%rdi
call   1030 <free@plt>
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ebp,%ebp
test   $0x1,%r10b
jne    12d2 <calculate_distance_map+0x1b2>
jmp    1316 <calculate_distance_map+0x1f6>

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

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