int manhattan_distance_erode_2D(unsigned int **image_data_2D_uint, int width,
                                int height) {
  unsigned int i = 0, j = 0;
  for (i = 0; i < height; i++) {
    for (j = 0; j < width; j++) {
      if (image_data_2D_uint[i][j])
        image_data_2D_uint[i][j] = 0;
      else {
        image_data_2D_uint[i][j] = height + width;
        if (i > 0)
          image_data_2D_uint[i][j] =
              ((image_data_2D_uint[i][j]) <= (image_data_2D_uint[i - 1][j] + 1)
                   ? (image_data_2D_uint[i][j])
                   : (image_data_2D_uint[i - 1][j] + 1));
        if (j > 0)
          image_data_2D_uint[i][j] =
              ((image_data_2D_uint[i][j]) <= (image_data_2D_uint[i][j - 1] + 1)
                   ? (image_data_2D_uint[i][j])
                   : (image_data_2D_uint[i][j - 1] + 1));
      }
    }
  }
  for (i = (height - 1); i <= 0; i--) {
    for (j = (width - 1); j <= 0; j--) {
      if (i + 1 < height)
        image_data_2D_uint[i][j] =
            ((image_data_2D_uint[i][j]) <= (image_data_2D_uint[i + 1][j] + 1)
                 ? (image_data_2D_uint[i][j])
                 : (image_data_2D_uint[i + 1][j] + 1));
      if (j + 1 < width)
        image_data_2D_uint[i][j] =
            ((image_data_2D_uint[i][j]) <= (image_data_2D_uint[i][j + 1] + 1)
                 ? (image_data_2D_uint[i][j])
                 : (image_data_2D_uint[i][j + 1] + 1));
    }
  }
  return 1;
}


x86 assembly (clang, -O0):
<manhattan_distance_erode_2D>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jae    12c0 <manhattan_distance_erode_2D+0x1c0>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jae    12ad <manhattan_distance_erode_2D+0x1ad>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
cmpl   $0x0,(%rax,%rcx,4)
je     1174 <manhattan_distance_erode_2D+0x74>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
movl   $0x0,(%rax,%rcx,4)
jmp    129a <manhattan_distance_erode_2D+0x19a>
mov    -0x10(%rbp),%edx
add    -0xc(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
cmpl   $0x0,-0x14(%rbp)
jbe    1210 <manhattan_distance_erode_2D+0x110>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
sub    $0x1,%edx
mov    %edx,%edx
mov    (%rcx,%rdx,8),%rcx
mov    -0x18(%rbp),%edx
mov    (%rcx,%rdx,4),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
ja     11e0 <manhattan_distance_erode_2D+0xe0>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x1c(%rbp)
jmp    11fc <manhattan_distance_erode_2D+0xfc>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
cmpl   $0x0,-0x18(%rbp)
jbe    1295 <manhattan_distance_erode_2D+0x195>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
mov    (%rcx,%rdx,8),%rcx
mov    -0x18(%rbp),%edx
sub    $0x1,%edx
mov    %edx,%edx
mov    (%rcx,%rdx,4),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
ja     1265 <manhattan_distance_erode_2D+0x165>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x20(%rbp)
jmp    1281 <manhattan_distance_erode_2D+0x181>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
jmp    129a <manhattan_distance_erode_2D+0x19a>
jmp    129f <manhattan_distance_erode_2D+0x19f>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1136 <manhattan_distance_erode_2D+0x36>
jmp    12b2 <manhattan_distance_erode_2D+0x1b2>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1123 <manhattan_distance_erode_2D+0x23>
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
ja     1420 <manhattan_distance_erode_2D+0x320>
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
ja     140d <manhattan_distance_erode_2D+0x30d>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
cmp    -0x10(%rbp),%eax
jae    1370 <manhattan_distance_erode_2D+0x270>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
add    $0x1,%edx
mov    %edx,%edx
mov    (%rcx,%rdx,8),%rcx
mov    -0x18(%rbp),%edx
mov    (%rcx,%rdx,4),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
ja     1340 <manhattan_distance_erode_2D+0x240>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
jmp    135c <manhattan_distance_erode_2D+0x25c>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
cmp    -0xc(%rbp),%eax
jae    13fa <manhattan_distance_erode_2D+0x2fa>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
mov    (%rcx,%rdx,8),%rcx
mov    -0x18(%rbp),%edx
add    $0x1,%edx
mov    %edx,%edx
mov    (%rcx,%rdx,4),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
ja     13ca <manhattan_distance_erode_2D+0x2ca>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x28(%rbp)
jmp    13e6 <manhattan_distance_erode_2D+0x2e6>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x18(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
jmp    13ff <manhattan_distance_erode_2D+0x2ff>
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    12dc <manhattan_distance_erode_2D+0x1dc>
jmp    1412 <manhattan_distance_erode_2D+0x312>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    12c9 <manhattan_distance_erode_2D+0x1c9>
mov    $0x1,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<manhattan_distance_erode_2D>:
push   %rbp
push   %rbx
test   %edx,%edx
je     11ac <manhattan_distance_erode_2D+0xac>
mov    %edx,%r8d
add    %esi,%edx
mov    %esi,%r9d
xor    %r11d,%r11d
jmp    112d <manhattan_distance_erode_2D+0x2d>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r11
cmp    %r8,%r11
je     11ac <manhattan_distance_erode_2D+0xac>
test   %esi,%esi
je     1120 <manhattan_distance_erode_2D+0x20>
mov    (%rdi,%r11,8),%rcx
lea    -0x1(%r11),%r10d
xor    %eax,%eax
cmpl   $0x0,(%rcx)
jne    1157 <manhattan_distance_erode_2D+0x57>
mov    %edx,(%rcx)
mov    %edx,%eax
test   %r11,%r11
je     1159 <manhattan_distance_erode_2D+0x59>
mov    (%rdi,%r10,8),%rax
mov    (%rax),%eax
add    $0x1,%eax
cmp    %eax,%edx
cmovbe %edx,%eax
mov    %eax,(%rcx)
cmp    $0x1,%esi
je     1120 <manhattan_distance_erode_2D+0x20>
mov    $0x1,%ebx
jmp    1188 <manhattan_distance_erode_2D+0x88>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x1,%eax
cmp    %eax,%ebp
cmovbe %ebp,%eax
mov    %eax,%ebp
mov    %ebp,(%rcx,%rbx,4)
add    $0x1,%rbx
mov    %ebp,%eax
cmp    %rbx,%r9
je     1120 <manhattan_distance_erode_2D+0x20>
xor    %ebp,%ebp
cmpl   $0x0,(%rcx,%rbx,4)
jne    117a <manhattan_distance_erode_2D+0x7a>
mov    %edx,(%rcx,%rbx,4)
mov    %edx,%ebp
test   %r11,%r11
je     1170 <manhattan_distance_erode_2D+0x70>
mov    (%rdi,%r10,8),%rbp
mov    0x0(%rbp,%rbx,4),%ebp
add    $0x1,%ebp
cmp    %ebp,%edx
cmovbe %edx,%ebp
jmp    1170 <manhattan_distance_erode_2D+0x70>
mov    $0x1,%eax
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define i32 @manhattan_distance_erode_2D(i32** %0, i32 %1, i32 %2) {
%4 = alloca i32**
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i32** %0, i32*** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
store i32 0, i32* %7
store i32 0, i32* %8
store i32 0, i32* %7
br label %9
9: ; preds = %169, %3
%10 = load i32, i32* %7
%11 = load i32, i32* %6
%12 = icmp ult i32 %10, %11
br i1 %12, label %13, label %172
13: ; preds = %9
store i32 0, i32* %8
br label %14
14: ; preds = %165, %13
%15 = load i32, i32* %8
%16 = load i32, i32* %5
%17 = icmp ult i32 %15, %16
br i1 %17, label %18, label %168
18: ; preds = %14
%19 = load i32**, i32*** %4
%20 = load i32, i32* %7
%21 = zext i32 %20 to i64
%22 = getelementptr inbounds i32*, i32** %19, i64 %21
%23 = load i32*, i32** %22
%24 = load i32, i32* %8
%25 = zext i32 %24 to i64
%26 = getelementptr inbounds i32, i32* %23, i64 %25
%27 = load i32, i32* %26
%28 = icmp ne i32 %27, 0
br i1 %28, label %29, label %38
29: ; preds = %18
%30 = load i32**, i32*** %4
%31 = load i32, i32* %7
%32 = zext i32 %31 to i64
%33 = getelementptr inbounds i32*, i32** %30, i64 %32
%34 = load i32*, i32** %33
%35 = load i32, i32* %8
%36 = zext i32 %35 to i64
%37 = getelementptr inbounds i32, i32* %34, i64 %36
store i32 0, i32* %37
br label %164
38: ; preds = %18
%39 = load i32, i32* %6
%40 = load i32, i32* %5
%41 = add nsw i32 %39, %40
%42 = load i32**, i32*** %4
%43 = load i32, i32* %7
%44 = zext i32 %43 to i64
%45 = getelementptr inbounds i32*, i32** %42, i64 %44
%46 = load i32*, i32** %45
%47 = load i32, i32* %8
%48 = zext i32 %47 to i64
%49 = getelementptr inbounds i32, i32* %46, i64 %48
store i32 %41, i32* %49
%50 = load i32, i32* %7
%51 = icmp ugt i32 %50, 0
br i1 %51, label %52, label %106
52: ; preds = %38
%53 = load i32**, i32*** %4
%54 = load i32, i32* %7
%55 = zext i32 %54 to i64
%56 = getelementptr inbounds i32*, i32** %53, i64 %55
%57 = load i32*, i32** %56
%58 = load i32, i32* %8
%59 = zext i32 %58 to i64
%60 = getelementptr inbounds i32, i32* %57, i64 %59
%61 = load i32, i32* %60
%62 = load i32**, i32*** %4
%63 = load i32, i32* %7
%64 = sub i32 %63, 1
%65 = zext i32 %64 to i64
%66 = getelementptr inbounds i32*, i32** %62, i64 %65
%67 = load i32*, i32** %66
%68 = load i32, i32* %8
%69 = zext i32 %68 to i64
%70 = getelementptr inbounds i32, i32* %67, i64 %69
%71 = load i32, i32* %70
%72 = add i32 %71, 1
%73 = icmp ule i32 %61, %72
br i1 %73, label %74, label %84
74: ; preds = %52
%75 = load i32**, i32*** %4
%76 = load i32, i32* %7
%77 = zext i32 %76 to i64
%78 = getelementptr inbounds i32*, i32** %75, i64 %77
%79 = load i32*, i32** %78
%80 = load i32, i32* %8
%81 = zext i32 %80 to i64
%82 = getelementptr inbounds i32, i32* %79, i64 %81
%83 = load i32, i32* %82
br label %96
84: ; preds = %52
%85 = load i32**, i32*** %4
%86 = load i32, i32* %7
%87 = sub i32 %86, 1
%88 = zext i32 %87 to i64
%89 = getelementptr inbounds i32*, i32** %85, i64 %88
%90 = load i32*, i32** %89
%91 = load i32, i32* %8
%92 = zext i32 %91 to i64
%93 = getelementptr inbounds i32, i32* %90, i64 %92
%94 = load i32, i32* %93
%95 = add i32 %94, 1
br label %96
96: ; preds = %84, %74
%97 = phi i32 [ %83, %74 ], [ %95, %84 ]
%98 = load i32**, i32*** %4
%99 = load i32, i32* %7
%100 = zext i32 %99 to i64
%101 = getelementptr inbounds i32*, i32** %98, i64 %100
%102 = load i32*, i32** %101
%103 = load i32, i32* %8
%104 = zext i32 %103 to i64
%105 = getelementptr inbounds i32, i32* %102, i64 %104
store i32 %97, i32* %105
br label %106
106: ; preds = %96, %38
%107 = load i32, i32* %8
%108 = icmp ugt i32 %107, 0
br i1 %108, label %109, label %163
109: ; preds = %106
%110 = load i32**, i32*** %4
%111 = load i32, i32* %7
%112 = zext i32 %111 to i64
%113 = getelementptr inbounds i32*, i32** %110, i64 %112
%114 = load i32*, i32** %113
%115 = load i32, i32* %8
%116 = zext i32 %115 to i64
%117 = getelementptr inbounds i32, i32* %114, i64 %116
%118 = load i32, i32* %117
%119 = load i32**, i32*** %4
%120 = load i32, i32* %7
%121 = zext i32 %120 to i64
%122 = getelementptr inbounds i32*, i32** %119, i64 %121
%123 = load i32*, i32** %122
%124 = load i32, i32* %8
%125 = sub i32 %124, 1
%126 = zext i32 %125 to i64
%127 = getelementptr inbounds i32, i32* %123, i64 %126
%128 = load i32, i32* %127
%129 = add i32 %128, 1
%130 = icmp ule i32 %118, %129
br i1 %130, label %131, label %141
131: ; preds = %109
%132 = load i32**, i32*** %4
%133 = load i32, i32* %7
%134 = zext i32 %133 to i64
%135 = getelementptr inbounds i32*, i32** %132, i64 %134
%136 = load i32*, i32** %135
%137 = load i32, i32* %8
%138 = zext i32 %137 to i64
%139 = getelementptr inbounds i32, i32* %136, i64 %138
%140 = load i32, i32* %139
br label %153
141: ; preds = %109
%142 = load i32**, i32*** %4
%143 = load i32, i32* %7
%144 = zext i32 %143 to i64
%145 = getelementptr inbounds i32*, i32** %142, i64 %144
%146 = load i32*, i32** %145
%147 = load i32, i32* %8
%148 = sub i32 %147, 1
%149 = zext i32 %148 to i64
%150 = getelementptr inbounds i32, i32* %146, i64 %149
%151 = load i32, i32* %150
%152 = add i32 %151, 1
br label %153
153: ; preds = %141, %131
%154 = phi i32 [ %140, %131 ], [ %152, %141 ]
%155 = load i32**, i32*** %4
%156 = load i32, i32* %7
%157 = zext i32 %156 to i64
%158 = getelementptr inbounds i32*, i32** %155, i64 %157
%159 = load i32*, i32** %158
%160 = load i32, i32* %8
%161 = zext i32 %160 to i64
%162 = getelementptr inbounds i32, i32* %159, i64 %161
store i32 %154, i32* %162
br label %163
163: ; preds = %153, %106
br label %164
164: ; preds = %163, %29
br label %165
165: ; preds = %164
%166 = load i32, i32* %8
%167 = add i32 %166, 1
store i32 %167, i32* %8
br label %14
168: ; preds = %14
br label %169
169: ; preds = %168
%170 = load i32, i32* %7
%171 = add i32 %170, 1
store i32 %171, i32* %7
br label %9
172: ; preds = %9
%173 = load i32, i32* %6
%174 = sub nsw i32 %173, 1
store i32 %174, i32* %7
br label %175
175: ; preds = %307, %172
%176 = load i32, i32* %7
%177 = icmp ule i32 %176, 0
br i1 %177, label %178, label %310
178: ; preds = %175
%179 = load i32, i32* %5
%180 = sub nsw i32 %179, 1
store i32 %180, i32* %8
br label %181
181: ; preds = %303, %178
%182 = load i32, i32* %8
%183 = icmp ule i32 %182, 0
br i1 %183, label %184, label %306
184: ; preds = %181
%185 = load i32, i32* %7
%186 = add i32 %185, 1
%187 = load i32, i32* %6
%188 = icmp ult i32 %186, %187
br i1 %188, label %189, label %243
189: ; preds = %184
%190 = load i32**, i32*** %4
%191 = load i32, i32* %7
%192 = zext i32 %191 to i64
%193 = getelementptr inbounds i32*, i32** %190, i64 %192
%194 = load i32*, i32** %193
%195 = load i32, i32* %8
%196 = zext i32 %195 to i64
%197 = getelementptr inbounds i32, i32* %194, i64 %196
%198 = load i32, i32* %197
%199 = load i32**, i32*** %4
%200 = load i32, i32* %7
%201 = add i32 %200, 1
%202 = zext i32 %201 to i64
%203 = getelementptr inbounds i32*, i32** %199, i64 %202
%204 = load i32*, i32** %203
%205 = load i32, i32* %8
%206 = zext i32 %205 to i64
%207 = getelementptr inbounds i32, i32* %204, i64 %206
%208 = load i32, i32* %207
%209 = add i32 %208, 1
%210 = icmp ule i32 %198, %209
br i1 %210, label %211, label %221
211: ; preds = %189
%212 = load i32**, i32*** %4
%213 = load i32, i32* %7
%214 = zext i32 %213 to i64
%215 = getelementptr inbounds i32*, i32** %212, i64 %214
%216 = load i32*, i32** %215
%217 = load i32, i32* %8
%218 = zext i32 %217 to i64
%219 = getelementptr inbounds i32, i32* %216, i64 %218
%220 = load i32, i32* %219
br label %233
221: ; preds = %189
%222 = load i32**, i32*** %4
%223 = load i32, i32* %7
%224 = add i32 %223, 1
%225 = zext i32 %224 to i64
%226 = getelementptr inbounds i32*, i32** %222, i64 %225
%227 = load i32*, i32** %226
%228 = load i32, i32* %8
%229 = zext i32 %228 to i64
%230 = getelementptr inbounds i32, i32* %227, i64 %229
%231 = load i32, i32* %230
%232 = add i32 %231, 1
br label %233
233: ; preds = %221, %211
%234 = phi i32 [ %220, %211 ], [ %232, %221 ]
%235 = load i32**, i32*** %4
%236 = load i32, i32* %7
%237 = zext i32 %236 to i64
%238 = getelementptr inbounds i32*, i32** %235, i64 %237
%239 = load i32*, i32** %238
%240 = load i32, i32* %8
%241 = zext i32 %240 to i64
%242 = getelementptr inbounds i32, i32* %239, i64 %241
store i32 %234, i32* %242
br label %243
243: ; preds = %233, %184
%244 = load i32, i32* %8
%245 = add i32 %244, 1
%246 = load i32, i32* %5
%247 = icmp ult i32 %245, %246
br i1 %247, label %248, label %302
248: ; preds = %243
%249 = load i32**, i32*** %4
%250 = load i32, i32* %7
%251 = zext i32 %250 to i64
%252 = getelementptr inbounds i32*, i32** %249, i64 %251
%253 = load i32*, i32** %252
%254 = load i32, i32* %8
%255 = zext i32 %254 to i64
%256 = getelementptr inbounds i32, i32* %253, i64 %255
%257 = load i32, i32* %256
%258 = load i32**, i32*** %4
%259 = load i32, i32* %7
%260 = zext i32 %259 to i64
%261 = getelementptr inbounds i32*, i32** %258, i64 %260
%262 = load i32*, i32** %261
%263 = load i32, i32* %8
%264 = add i32 %263, 1
%265 = zext i32 %264 to i64
%266 = getelementptr inbounds i32, i32* %262, i64 %265
%267 = load i32, i32* %266
%268 = add i32 %267, 1
%269 = icmp ule i32 %257, %268
br i1 %269, label %270, label %280
270: ; preds = %248
%271 = load i32**, i32*** %4
%272 = load i32, i32* %7
%273 = zext i32 %272 to i64
%274 = getelementptr inbounds i32*, i32** %271, i64 %273
%275 = load i32*, i32** %274
%276 = load i32, i32* %8
%277 = zext i32 %276 to i64
%278 = getelementptr inbounds i32, i32* %275, i64 %277
%279 = load i32, i32* %278
br label %292
280: ; preds = %248
%281 = load i32**, i32*** %4
%282 = load i32, i32* %7
%283 = zext i32 %282 to i64
%284 = getelementptr inbounds i32*, i32** %281, i64 %283
%285 = load i32*, i32** %284
%286 = load i32, i32* %8
%287 = add i32 %286, 1
%288 = zext i32 %287 to i64
%289 = getelementptr inbounds i32, i32* %285, i64 %288
%290 = load i32, i32* %289
%291 = add i32 %290, 1
br label %292
292: ; preds = %280, %270
%293 = phi i32 [ %279, %270 ], [ %291, %280 ]
%294 = load i32**, i32*** %4
%295 = load i32, i32* %7
%296 = zext i32 %295 to i64
%297 = getelementptr inbounds i32*, i32** %294, i64 %296
%298 = load i32*, i32** %297
%299 = load i32, i32* %8
%300 = zext i32 %299 to i64
%301 = getelementptr inbounds i32, i32* %298, i64 %300
store i32 %293, i32* %301
br label %302
302: ; preds = %292, %243
br label %303
303: ; preds = %302
%304 = load i32, i32* %8
%305 = add i32 %304, -1
store i32 %305, i32* %8
br label %181
306: ; preds = %181
br label %307
307: ; preds = %306
%308 = load i32, i32* %7
%309 = add i32 %308, -1
store i32 %309, i32* %7
br label %175
310: ; preds = %175
ret i32 1
}

LLVM IR (-O2):
define i32 @manhattan_distance_erode_2D(i32** nocapture %0, i32 %1, i32 %2) {
%4 = icmp eq i32 %2, 0
br i1 %4, label %59, label %5
5: ; preds = %3
%6 = icmp eq i32 %1, 0
%7 = add nsw i32 %2, %1
%8 = zext i32 %2 to i64
%9 = zext i32 %1 to i64
%10 = icmp eq i32 %1, 1
br label %11
11: ; preds = %5, %56
%12 = phi i64 [ 0, %5 ], [ %57, %56 ]
br i1 %6, label %56, label %13
13: ; preds = %11
%14 = getelementptr inbounds i32*, i32** %0, i64 %12
%15 = load i32*, i32** %14
%16 = icmp eq i64 %12, 0
%17 = add nuw i64 %12, 4294967295
%18 = and i64 %17, 4294967295
%19 = getelementptr inbounds i32*, i32** %0, i64 %18
%20 = load i32, i32* %15
%21 = icmp eq i32 %20, 0
br i1 %21, label %22, label %29
22: ; preds = %13
store i32 %7, i32* %15
br i1 %16, label %31, label %23
23: ; preds = %22
%24 = load i32*, i32** %19
%25 = load i32, i32* %24
%26 = add i32 %25, 1
%27 = icmp ugt i32 %7, %26
%28 = select i1 %27, i32 %26, i32 %7
br label %29
29: ; preds = %13, %23
%30 = phi i32 [ %28, %23 ], [ 0, %13 ]
store i32 %30, i32* %15
br label %31
31: ; preds = %29, %22
%32 = phi i32 [ %7, %22 ], [ %30, %29 ]
br i1 %10, label %56, label %33
33: ; preds = %31, %52
%34 = phi i32 [ %53, %52 ], [ %32, %31 ]
%35 = phi i64 [ %54, %52 ], [ 1, %31 ]
%36 = getelementptr inbounds i32, i32* %15, i64 %35
%37 = load i32, i32* %36
%38 = icmp eq i32 %37, 0
br i1 %38, label %39, label %52
39: ; preds = %33
store i32 %7, i32* %36
br i1 %16, label %47, label %40
40: ; preds = %39
%41 = load i32*, i32** %19
%42 = getelementptr inbounds i32, i32* %41, i64 %35
%43 = load i32, i32* %42
%44 = add i32 %43, 1
%45 = icmp ugt i32 %7, %44
%46 = select i1 %45, i32 %44, i32 %7
br label %47
47: ; preds = %39, %40
%48 = phi i32 [ %46, %40 ], [ %7, %39 ]
%49 = add i32 %34, 1
%50 = icmp ugt i32 %48, %49
%51 = select i1 %50, i32 %49, i32 %48
br label %52
52: ; preds = %33, %47
%53 = phi i32 [ %51, %47 ], [ 0, %33 ]
store i32 %53, i32* %36
%54 = add nuw nsw i64 %35, 1
%55 = icmp eq i64 %54, %9
br i1 %55, label %56, label %33
56: ; preds = %52, %31, %11
%57 = add nuw nsw i64 %12, 1
%58 = icmp eq i64 %57, %8
br i1 %58, label %59, label %11
59: ; preds = %56, %3
ret i32 1
}