#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 */
void progenify(bool *world, int *change, int rows, int cols) {
  int neighbours;
  for (int i = 1; i < rows - 2; i++) {
    for (int j = 1; j < cols - 2; j++) {
      neighbours = 0;
      if (world[(i - 1) * cols + j - 1])
        neighbours++;
      if (world[(i - 1) * cols + j])
        neighbours++;
      if (world[(i - 1) * cols + j + 1])
        neighbours++;
      if (world[i * cols + j - 1])
        neighbours++;
      if (world[i * cols + j + 1])
        neighbours++;
      if (world[(i + 1) * cols + j - 1])
        neighbours++;
      if (world[(i + 1) * cols + j])
        neighbours++;
      if (world[(i + 1) * cols + j + 1])
        neighbours++;
      change[i * cols + j] = 0;
      if (neighbours < 2) {
        change[i * cols + j] = -1;
      }
      if (neighbours > 3) {
        change[i * cols + j] = -1;
      }
      if (neighbours == 3) {
        change[i * cols + j] = 1;
      }
    }
  }
}


x86 assembly (clang, -O0):
<progenify>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movl   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jge    1331 <progenify+0x231>
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x18(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jge    131e <progenify+0x21e>
movl   $0x0,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     1173 <progenify+0x73>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     119a <progenify+0x9a>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     11c4 <progenify+0xc4>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     11eb <progenify+0xeb>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     1212 <progenify+0x112>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     123c <progenify+0x13c>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     1263 <progenify+0x163>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     128d <progenify+0x18d>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movl   $0x0,(%rax,%rcx,4)
cmpl   $0x2,-0x1c(%rbp)
jge    12c7 <progenify+0x1c7>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movl   $0xffffffff,(%rax,%rcx,4)
cmpl   $0x3,-0x1c(%rbp)
jle    12e9 <progenify+0x1e9>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movl   $0xffffffff,(%rax,%rcx,4)
cmpl   $0x3,-0x1c(%rbp)
jne    130b <progenify+0x20b>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movl   $0x1,(%rax,%rcx,4)
jmp    1310 <progenify+0x210>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1131 <progenify+0x31>
jmp    1323 <progenify+0x223>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1119 <progenify+0x19>
pop    %rbp
ret

x86 assembly (clang, -O2):
<progenify>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rsi,-0x58(%rsp)
mov    %rdi,-0x68(%rsp)
cmp    $0x4,%edx
jl     1438 <progenify+0x338>
add    $0xfffffffe,%edx
lea    -0x2(%rcx),%edi
movslq %ecx,%rax
mov    %rax,-0x8(%rsp)
mov    -0x58(%rsp),%rax
lea    0x4(%rax),%rbp
lea    (%rax,%rdi,4),%rbx
mov    -0x68(%rsp),%rsi
lea    0x4(%rsi,%rdi,4),%rax
mov    %rdi,-0x10(%rsp)
add    $0xffffffffffffffff,%rdi
mov    %rbp,-0x20(%rsp)
mov    %rax,-0x30(%rsp)
cmp    %rax,%rbp
setb   %al
mov    %rbx,-0x28(%rsp)
cmp    %rsi,%rbx
seta   %bl
and    %al,%bl
mov    %bl,-0x69(%rsp)
mov    %rdi,-0x50(%rsp)
and    $0xfffffffffffffffc,%rdi
mov    %rdi,-0x38(%rsp)
lea    0x1(%rdi),%rax
mov    %rax,-0x40(%rsp)
lea    0x8(%rsi),%rax
mov    %rax,-0x48(%rsp)
lea    0x4(%rsi),%rax
mov    %rax,-0x18(%rsp)
mov    $0x1,%r12d
mov    $0x1,%r9d
pxor   %xmm0,%xmm0
movdqa 0xe53(%rip),%xmm1
pcmpeqd %xmm8,%xmm8
movdqa 0xe55(%rip),%xmm9
movdqa 0xe5c(%rip),%xmm10
movdqa 0xe64(%rip),%xmm5
mov    %rdx,-0x60(%rsp)
jmp    11ed <progenify+0xed>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%r12
cmp    %rdx,%r12
je     1438 <progenify+0x338>
cmp    $0x3,%ecx
jle    11e0 <progenify+0xe0>
lea    -0x1(%r12),%r10
mov    -0x8(%rsp),%rax
imul   %rax,%r10
mov    %r12,%r15
imul   %rax,%r15
add    $0x1,%r12
mov    %r12,%r14
imul   %rax,%r14
mov    $0x1,%edi
cmpq   $0x4,-0x50(%rsp)
jae    12e0 <progenify+0x1e0>
add    %rdi,%r14
mov    -0x68(%rsp),%rdx
lea    (%rdx,%r14,4),%rsi
add    %rdi,%r15
mov    -0x18(%rsp),%rax
lea    (%rax,%r15,4),%r11
mov    -0x58(%rsp),%rax
lea    (%rax,%r15,4),%r8
add    %rdi,%r10
lea    (%rdx,%r10,4),%rbp
mov    -0x10(%rsp),%r10
sub    %rdi,%r10
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nop
xor    %eax,%eax
cmpl   $0x0,-0x4(%rbp,%rdi,4)
setne  %al
lea    0x1(%rax),%ebx
cmpl   $0x0,0x0(%rbp,%rdi,4)
cmove  %eax,%ebx
cmpl   $0x1,0x4(%rbp,%rdi,4)
sbb    $0xffffffff,%ebx
cmpl   $0x1,-0x8(%r11,%rdi,4)
sbb    $0xffffffff,%ebx
cmpl   $0x1,(%r11,%rdi,4)
sbb    $0xffffffff,%ebx
cmpl   $0x1,-0x4(%rsi,%rdi,4)
sbb    $0xffffffff,%ebx
cmpl   $0x1,(%rsi,%rdi,4)
sbb    $0xffffffff,%ebx
cmpl   $0x1,0x4(%rsi,%rdi,4)
sbb    $0xffffffff,%ebx
mov    %ebx,%eax
and    $0xfffffffe,%eax
xor    %edx,%edx
cmp    $0x2,%eax
setne  %dl
neg    %edx
cmp    $0x3,%ebx
cmove  %r9d,%edx
mov    %edx,(%r8,%rdi,4)
add    $0x1,%rdi
cmp    %rdi,%r10
jne    1260 <progenify+0x160>
mov    -0x60(%rsp),%rdx
cmp    %rdx,%r12
jne    11ed <progenify+0xed>
jmp    1438 <progenify+0x338>
nopl   0x0(%rax,%rax,1)
mov    -0x20(%rsp),%rax
lea    (%rax,%r15,4),%r13
mov    -0x28(%rsp),%rax
lea    (%rax,%r15,4),%rsi
mov    -0x68(%rsp),%rbp
lea    0x0(%rbp,%r14,4),%rax
mov    -0x30(%rsp),%rbx
lea    (%rbx,%r14,4),%rdx
lea    0x0(,%r10,4),%r8
add    %rbp,%r8
lea    (%rbx,%r10,4),%rbp
cmp    %rdx,%r13
setb   %dl
cmp    %rsi,%rax
setb   %bl
and    %dl,%bl
or     -0x69(%rsp),%bl
cmp    %rbp,%r13
setb   %al
cmp    %rsi,%r8
setb   %dl
test   %bl,%bl
jne    1223 <progenify+0x123>
and    %dl,%al
jne    1223 <progenify+0x123>
mov    -0x48(%rsp),%rax
lea    (%rax,%r10,4),%r11
lea    (%rax,%r15,4),%rsi
lea    (%rax,%r14,4),%r8
xor    %ebp,%ebp
mov    -0x38(%rsp),%rax
nopw   0x0(%rax,%rax,1)
movdqu -0x8(%r11,%rbp,4),%xmm3
movdqu -0x4(%r11,%rbp,4),%xmm7
movdqu (%r11,%rbp,4),%xmm2
pcmpeqd %xmm0,%xmm3
pcmpeqd %xmm0,%xmm7
movdqa %xmm3,%xmm6
pandn  %xmm1,%xmm6
psubd  %xmm3,%xmm6
pandn  %xmm7,%xmm3
pandn  %xmm6,%xmm7
psrld  $0x1f,%xmm3
por    %xmm7,%xmm3
pcmpeqd %xmm0,%xmm2
movdqu -0x8(%rsi,%rbp,4),%xmm6
movdqu (%rsi,%rbp,4),%xmm7
pcmpeqd %xmm0,%xmm6
paddd  %xmm2,%xmm6
pcmpeqd %xmm0,%xmm7
paddd  %xmm6,%xmm7
movdqu -0x8(%r8,%rbp,4),%xmm2
movdqu -0x4(%r8,%rbp,4),%xmm6
movdqu (%r8,%rbp,4),%xmm4
pcmpeqd %xmm0,%xmm2
paddd  %xmm7,%xmm2
pcmpeqd %xmm0,%xmm6
paddd  %xmm2,%xmm6
paddd  %xmm3,%xmm6
pcmpeqd %xmm0,%xmm4
paddd  %xmm6,%xmm4
paddd  %xmm9,%xmm4
movdqa %xmm4,%xmm2
pand   %xmm10,%xmm2
pcmpeqd %xmm1,%xmm2
pcmpeqd %xmm5,%xmm4
movdqa %xmm4,%xmm3
pxor   %xmm8,%xmm3
pandn  %xmm3,%xmm2
psubd  %xmm4,%xmm2
movdqu %xmm2,0x0(%r13,%rbp,4)
add    $0x4,%rbp
cmp    %rbp,%rax
jne    1360 <progenify+0x260>
mov    -0x40(%rsp),%rdi
cmp    %rax,-0x50(%rsp)
jne    1223 <progenify+0x123>
jmp    12c8 <progenify+0x1c8>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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