void DecompressGotoTable(int *source_data, int *dest_data,
                         unsigned int compressed_size,
                         unsigned int total_size) {
  unsigned int mode = 0;
  unsigned int index = 0;
  unsigned int read_index = 0;
  int lengthRep = 0;
  int copy_value = 0;
  while (read_index < compressed_size && index < total_size) {
    if (mode == 0) {
      lengthRep = source_data[read_index];
      read_index++;
      while (lengthRep && read_index < compressed_size && index < total_size) {
        dest_data[index] = source_data[read_index];
        index++;
        read_index++;
        lengthRep--;
      }
      lengthRep = 0;
      mode = 1;
    } else if (mode == 1) {
      lengthRep = source_data[read_index];
      read_index++;
      copy_value = source_data[read_index];
      read_index++;
      while (lengthRep && index < total_size) {
        dest_data[index] = copy_value;
        index++;
        lengthRep--;
      }
      lengthRep = 0;
      mode = 0;
    }
  }
}


x86 assembly (clang, -O0):
<DecompressGotoTable>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x24(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x2d(%rbp)
jae    1152 <DecompressGotoTable+0x52>
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
setb   %al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
test   $0x1,%al
jne    1162 <DecompressGotoTable+0x62>
jmp    12a2 <DecompressGotoTable+0x1a2>
cmpl   $0x0,-0x1c(%rbp)
jne    1205 <DecompressGotoTable+0x105>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x28(%rbp)
mov    %al,-0x2e(%rbp)
je     11ae <DecompressGotoTable+0xae>
mov    -0x24(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x2e(%rbp)
jae    11ae <DecompressGotoTable+0xae>
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
setb   %al
mov    %al,-0x2e(%rbp)
mov    -0x2e(%rbp),%al
test   $0x1,%al
jne    11be <DecompressGotoTable+0xbe>
jmp    11f2 <DecompressGotoTable+0xf2>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    1182 <DecompressGotoTable+0x82>
movl   $0x0,-0x28(%rbp)
movl   $0x1,-0x1c(%rbp)
jmp    129d <DecompressGotoTable+0x19d>
cmpl   $0x1,-0x1c(%rbp)
jne    1298 <DecompressGotoTable+0x198>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x28(%rbp)
mov    %al,-0x2f(%rbp)
je     1256 <DecompressGotoTable+0x156>
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
setb   %al
mov    %al,-0x2f(%rbp)
mov    -0x2f(%rbp),%al
test   $0x1,%al
jne    1266 <DecompressGotoTable+0x166>
jmp    128a <DecompressGotoTable+0x18a>
mov    -0x2c(%rbp),%edx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    123b <DecompressGotoTable+0x13b>
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x1c(%rbp)
jmp    129d <DecompressGotoTable+0x19d>
jmp    1135 <DecompressGotoTable+0x35>
pop    %rbp
ret

x86 assembly (clang, -O2):
<DecompressGotoTable>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %edx,%edx
je     14f1 <DecompressGotoTable+0x3f1>
test   %ecx,%ecx
je     14f1 <DecompressGotoTable+0x3f1>
mov    %ecx,%r10d
mov    %edx,%r15d
lea    0x4(%rsi),%rax
mov    %rax,-0x10(%rsp)
lea    0x4(%rdi),%rax
mov    %rax,-0x8(%rsp)
lea    0x70(%rsi),%rax
mov    %rax,-0x20(%rsp)
lea    0x10(%rsi),%rax
mov    %rax,-0x18(%rsp)
lea    0x30(%rsi),%rax
mov    %rax,-0x28(%rsp)
lea    0x30(%rdi),%rax
mov    %rax,-0x30(%rsp)
xor    %r13d,%r13d
mov    $0x1,%r12d
xor    %r8d,%r8d
xor    %r11d,%r11d
mov    %r15,-0x38(%rsp)
mov    %ecx,-0x3c(%rsp)
xchg   %ax,%ax
lea    0x1(%r13),%ebp
mov    %r13d,%eax
mov    (%rdi,%rax,4),%r14d
test   %r11d,%r11d
jne    1310 <DecompressGotoTable+0x210>
mov    $0x1,%r11d
test   %r14d,%r14d
je     13a0 <DecompressGotoTable+0x2a0>
cmp    %edx,%ebp
jae    13a0 <DecompressGotoTable+0x2a0>
cmp    %ecx,%r8d
jae    13a0 <DecompressGotoTable+0x2a0>
mov    %ebp,%r13d
mov    %r8d,%r8d
mov    %r13,%rbx
not    %rbx
add    %r15,%rbx
mov    %r8,%rbp
not    %rbp
add    %r10,%rbp
cmp    %rbx,%rbp
mov    %rbx,%r11
cmovb  %rbp,%r11
lea    -0x1(%r14),%eax
cmp    %rax,%r11
cmovae %rax,%r11
add    $0x1,%r11
test   %rbx,%rbx
cmove  %r12,%r11
test   %eax,%eax
cmove  %r12,%r11
cmp    $0x8,%r11
jb     14a0 <DecompressGotoTable+0x3a0>
cmp    %rbx,%rbp
cmovae %rbx,%rbp
cmp    %rax,%rbp
cmovae %rax,%rbp
test   %rbx,%rbx
cmove  %rbx,%rbp
test   %eax,%eax
mov    $0x0,%eax
cmovne %rbp,%rax
lea    (%rsi,%r8,4),%r9
lea    (%rax,%r13,1),%rbp
mov    -0x8(%rsp),%rbx
lea    (%rbx,%rbp,4),%rbp
cmp    %rbp,%r9
jae    1242 <DecompressGotoTable+0x142>
add    %r8,%rax
mov    -0x10(%rsp),%rbp
lea    0x0(,%rax,4),%rax
add    %rbp,%rax
lea    (%rdi,%r13,4),%rbp
cmp    %rax,%rbp
jb     14a0 <DecompressGotoTable+0x3a0>
mov    %r11,%r9
movabs $0x1fffffff8,%rax
and    %rax,%r9
lea    -0x8(%r9),%rax
mov    %rax,%r15
shr    $0x3,%r15
add    $0x1,%r15
test   %rax,%rax
je     14e0 <DecompressGotoTable+0x3e0>
movabs $0x3ffffffffffffffc,%rax
ff ff 3f
add    $0x2,%rax
and    %r15,%rax
mov    -0x28(%rsp),%rbx
lea    (%rbx,%r8,4),%r12
mov    -0x30(%rsp),%rbx
lea    (%rbx,%r13,4),%rbx
xor    %ebp,%ebp
nop
movups -0x30(%rbx,%rbp,4),%xmm0
movups -0x20(%rbx,%rbp,4),%xmm1
movups %xmm0,-0x30(%r12,%rbp,4)
movups %xmm1,-0x20(%r12,%rbp,4)
movdqu -0x10(%rbx,%rbp,4),%xmm0
movups (%rbx,%rbp,4),%xmm1
movdqu %xmm0,-0x10(%r12,%rbp,4)
movups %xmm1,(%r12,%rbp,4)
add    $0x10,%rbp
add    $0xfffffffffffffffe,%rax
jne    1290 <DecompressGotoTable+0x190>
test   $0x1,%r15b
je     12e7 <DecompressGotoTable+0x1e7>
lea    (%r8,%rbp,1),%rax
add    %r13,%rbp
movdqu (%rdi,%rbp,4),%xmm0
movups 0x10(%rdi,%rbp,4),%xmm1
movdqu %xmm0,(%rsi,%rax,4)
movups %xmm1,0x10(%rsi,%rax,4)
add    %r9,%r8
add    %r9,%r13
cmp    %r9,%r11
mov    -0x38(%rsp),%r15
mov    $0x1,%r12d
jne    1495 <DecompressGotoTable+0x395>
mov    $0x1,%r11d
jmp    14d0 <DecompressGotoTable+0x3d0>
nopl   0x0(%rax)
add    $0x2,%r13d
xor    %r11d,%r11d
test   %r14d,%r14d
je     14d0 <DecompressGotoTable+0x3d0>
cmp    %ecx,%r8d
jae    14d0 <DecompressGotoTable+0x3d0>
mov    %ebp,%eax
mov    (%rdi,%rax,4),%r9d
mov    %r8d,%r8d
lea    -0x1(%r14),%eax
mov    %r8,%rbx
not    %rbx
add    %r10,%rbx
cmp    %rax,%rbx
cmovae %rax,%rbx
add    $0x1,%rbx
test   %eax,%eax
cmove  %r12,%rbx
cmp    $0x8,%rbx
jb     1479 <DecompressGotoTable+0x379>
mov    %edx,%eax
mov    %rbx,%r11
movabs $0x1fffffff8,%rcx
and    %rcx,%r11
movd   %r9d,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x8(%r11),%rcx
mov    %rcx,%rbp
shr    $0x3,%rbp
add    $0x1,%rbp
mov    %ebp,%r15d
and    $0x3,%r15d
cmp    $0x18,%rcx
jae    13a8 <DecompressGotoTable+0x2a8>
xor    %r12d,%r12d
jmp    1411 <DecompressGotoTable+0x311>
nopw   0x0(%rax,%rax,1)
mov    %ebp,%r13d
jmp    14d0 <DecompressGotoTable+0x3d0>
movabs $0x3ffffffffffffffc,%rcx
ff ff 3f
and    %rcx,%rbp
mov    -0x20(%rsp),%rcx
lea    (%rcx,%r8,4),%rcx
xor    %r12d,%r12d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movdqu %xmm0,-0x70(%rcx,%r12,4)
movdqu %xmm0,-0x60(%rcx,%r12,4)
movdqu %xmm0,-0x50(%rcx,%r12,4)
movdqu %xmm0,-0x40(%rcx,%r12,4)
movdqu %xmm0,-0x30(%rcx,%r12,4)
movdqu %xmm0,-0x20(%rcx,%r12,4)
movdqu %xmm0,-0x10(%rcx,%r12,4)
movdqu %xmm0,(%rcx,%r12,4)
add    $0x20,%r12
add    $0xfffffffffffffffc,%rbp
jne    13d0 <DecompressGotoTable+0x2d0>
test   %r15,%r15
je     1444 <DecompressGotoTable+0x344>
add    %r8,%r12
mov    -0x18(%rsp),%rcx
lea    (%rcx,%r12,4),%rcx
shl    $0x5,%r15
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movdqu %xmm0,-0x10(%rcx,%rdx,1)
movdqu %xmm0,(%rcx,%rdx,1)
add    $0x20,%rdx
cmp    %rdx,%r15
jne    1430 <DecompressGotoTable+0x330>
add    %r11,%r8
cmp    %r11,%rbx
jne    1462 <DecompressGotoTable+0x362>
mov    -0x3c(%rsp),%ecx
mov    %eax,%edx
mov    -0x38(%rsp),%r15
mov    $0x1,%r12d
xor    %r11d,%r11d
jmp    14d0 <DecompressGotoTable+0x3d0>
sub    %r11d,%r14d
mov    -0x3c(%rsp),%ecx
mov    %eax,%edx
mov    -0x38(%rsp),%r15
mov    $0x1,%r12d
xor    %r11d,%r11d
add    $0xffffffff,%r14d
nopl   (%rax)
mov    %r9d,(%rsi,%r8,4)
add    $0x1,%r8
add    $0xffffffff,%r14d
jae    14d0 <DecompressGotoTable+0x3d0>
cmp    %r10,%r8
jb     1480 <DecompressGotoTable+0x380>
jmp    14d0 <DecompressGotoTable+0x3d0>
sub    %r9d,%r14d
nopl   0x0(%rax,%rax,1)
mov    $0x1,%r11d
add    $0xffffffff,%r14d
nopw   0x0(%rax,%rax,1)
mov    (%rdi,%r13,4),%eax
mov    %eax,(%rsi,%r8,4)
add    $0x1,%r8
add    $0x1,%r13
add    $0xffffffff,%r14d
jae    14d0 <DecompressGotoTable+0x3d0>
cmp    %r15,%r13
jae    14d0 <DecompressGotoTable+0x3d0>
cmp    %r10,%r8
jb     14b0 <DecompressGotoTable+0x3b0>
cmp    %edx,%r13d
jae    14f1 <DecompressGotoTable+0x3f1>
cmp    %ecx,%r8d
jb     1170 <DecompressGotoTable+0x70>
jmp    14f1 <DecompressGotoTable+0x3f1>
xor    %ebp,%ebp
test   $0x1,%r15b
jne    12cc <DecompressGotoTable+0x1cc>
jmp    12e7 <DecompressGotoTable+0x1e7>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @DecompressGotoTable(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
%12 = alloca i32
%13 = alloca i32
store i32* %0, i32** %5
store i32* %1, i32** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
store i32 0, i32* %9
store i32 0, i32* %10
store i32 0, i32* %11
store i32 0, i32* %12
store i32 0, i32* %13
br label %14
14: ; preds = %104, %4
%15 = load i32, i32* %11
%16 = load i32, i32* %7
%17 = icmp ult i32 %15, %16
br i1 %17, label %18, label %22
18: ; preds = %14
%19 = load i32, i32* %10
%20 = load i32, i32* %8
%21 = icmp ult i32 %19, %20
br label %22
22: ; preds = %18, %14
%23 = phi i1 [ false, %14 ], [ %21, %18 ]
br i1 %23, label %24, label %105
24: ; preds = %22
%25 = load i32, i32* %9
%26 = icmp eq i32 %25, 0
br i1 %26, label %27, label %65
27: ; preds = %24
%28 = load i32*, i32** %5
%29 = load i32, i32* %11
%30 = zext i32 %29 to i64
%31 = getelementptr inbounds i32, i32* %28, i64 %30
%32 = load i32, i32* %31
store i32 %32, i32* %12
%33 = load i32, i32* %11
%34 = add i32 %33, 1
store i32 %34, i32* %11
br label %35
35: ; preds = %48, %27
%36 = load i32, i32* %12
%37 = icmp ne i32 %36, 0
br i1 %37, label %38, label %46
38: ; preds = %35
%39 = load i32, i32* %11
%40 = load i32, i32* %7
%41 = icmp ult i32 %39, %40
br i1 %41, label %42, label %46
42: ; preds = %38
%43 = load i32, i32* %10
%44 = load i32, i32* %8
%45 = icmp ult i32 %43, %44
br label %46
46: ; preds = %42, %38, %35
%47 = phi i1 [ false, %38 ], [ false, %35 ], [ %45, %42 ]
br i1 %47, label %48, label %64
48: ; preds = %46
%49 = load i32*, i32** %5
%50 = load i32, i32* %11
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds i32, i32* %49, i64 %51
%53 = load i32, i32* %52
%54 = load i32*, i32** %6
%55 = load i32, i32* %10
%56 = zext i32 %55 to i64
%57 = getelementptr inbounds i32, i32* %54, i64 %56
store i32 %53, i32* %57
%58 = load i32, i32* %10
%59 = add i32 %58, 1
store i32 %59, i32* %10
%60 = load i32, i32* %11
%61 = add i32 %60, 1
store i32 %61, i32* %11
%62 = load i32, i32* %12
%63 = add nsw i32 %62, -1
store i32 %63, i32* %12
br label %35
64: ; preds = %46
store i32 0, i32* %12
store i32 1, i32* %9
br label %104
65: ; preds = %24
%66 = load i32, i32* %9
%67 = icmp eq i32 %66, 1
br i1 %67, label %68, label %103
68: ; preds = %65
%69 = load i32*, i32** %5
%70 = load i32, i32* %11
%71 = zext i32 %70 to i64
%72 = getelementptr inbounds i32, i32* %69, i64 %71
%73 = load i32, i32* %72
store i32 %73, i32* %12
%74 = load i32, i32* %11
%75 = add i32 %74, 1
store i32 %75, i32* %11
%76 = load i32*, i32** %5
%77 = load i32, i32* %11
%78 = zext i32 %77 to i64
%79 = getelementptr inbounds i32, i32* %76, i64 %78
%80 = load i32, i32* %79
store i32 %80, i32* %13
%81 = load i32, i32* %11
%82 = add i32 %81, 1
store i32 %82, i32* %11
br label %83
83: ; preds = %92, %68
%84 = load i32, i32* %12
%85 = icmp ne i32 %84, 0
br i1 %85, label %86, label %90
86: ; preds = %83
%87 = load i32, i32* %10
%88 = load i32, i32* %8
%89 = icmp ult i32 %87, %88
br label %90
90: ; preds = %86, %83
%91 = phi i1 [ false, %83 ], [ %89, %86 ]
br i1 %91, label %92, label %102
92: ; preds = %90
%93 = load i32, i32* %13
%94 = load i32*, i32** %6
%95 = load i32, i32* %10
%96 = zext i32 %95 to i64
%97 = getelementptr inbounds i32, i32* %94, i64 %96
store i32 %93, i32* %97
%98 = load i32, i32* %10
%99 = add i32 %98, 1
store i32 %99, i32* %10
%100 = load i32, i32* %12
%101 = add nsw i32 %100, -1
store i32 %101, i32* %12
br label %83
102: ; preds = %90
store i32 0, i32* %12
store i32 0, i32* %9
br label %103
103: ; preds = %102, %65
br label %104
104: ; preds = %103, %64
br label %14
105: ; preds = %22
ret void
}

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