int lz77_memcpy(unsigned char *src, int src_len, unsigned char *dst,
                int dst_len) {
  int ret = src_len > dst_len ? dst_len : src_len;
  if (ret) {
    int len = ret & (~0x03);
    unsigned char *d = dst;
    unsigned char *s = src;
    if (ret >= 10) {
      if ((((unsigned long)(dst - src)) & 0x03) == 0) {
        while ((unsigned long)d & 0x03)
          *d++ = *s++;
        while (d < (dst + len)) {
          *(unsigned long *)d = *(unsigned long *)s;
          d += 4;
          s += 4;
        }
      } else if ((((unsigned long)(dst - src)) & 0x01) == 0) {
        while ((unsigned long)d & 0x01)
          *d++ = *s++;
        while (d < (dst + len)) {
          *(unsigned short *)d = *(unsigned short *)s;
          d += 2;
          s += 2;
        }
      }
    }
    while (d < (dst + ret))
      *d++ = *s++;
  }
  return ret;
}


x86 assembly (clang, -O0):
<lz77_memcpy>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jle    1129 <lz77_memcpy+0x29>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    112f <lz77_memcpy+0x2f>
mov    -0xc(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     12fd <lz77_memcpy+0x1fd>
mov    -0x20(%rbp),%eax
and    $0xfffffffc,%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
cmpl   $0xa,-0x20(%rbp)
jl     12b4 <lz77_memcpy+0x1b4>
mov    -0x18(%rbp),%rax
mov    -0x8(%rbp),%rcx
sub    %rcx,%rax
and    $0x3,%rax
cmp    $0x0,%rax
jne    1206 <lz77_memcpy+0x106>
jmp    1180 <lz77_memcpy+0x80>
mov    -0x30(%rbp),%rax
and    $0x3,%rax
cmp    $0x0,%rax
je     11b9 <lz77_memcpy+0xb9>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
jmp    1180 <lz77_memcpy+0x80>
jmp    11be <lz77_memcpy+0xbe>
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x24(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jae    1201 <lz77_memcpy+0x101>
mov    -0x38(%rbp),%rax
mov    (%rax),%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
jmp    11be <lz77_memcpy+0xbe>
jmp    12af <lz77_memcpy+0x1af>
mov    -0x18(%rbp),%rax
mov    -0x8(%rbp),%rcx
sub    %rcx,%rax
and    $0x1,%rax
cmp    $0x0,%rax
jne    12aa <lz77_memcpy+0x1aa>
jmp    1224 <lz77_memcpy+0x124>
mov    -0x30(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     125d <lz77_memcpy+0x15d>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
jmp    1224 <lz77_memcpy+0x124>
jmp    1262 <lz77_memcpy+0x162>
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x24(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jae    12a5 <lz77_memcpy+0x1a5>
mov    -0x38(%rbp),%rax
mov    (%rax),%cx
mov    -0x30(%rbp),%rax
mov    %cx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
jmp    1262 <lz77_memcpy+0x162>
jmp    12aa <lz77_memcpy+0x1aa>
jmp    12af <lz77_memcpy+0x1af>
jmp    12b4 <lz77_memcpy+0x1b4>
jmp    12b9 <lz77_memcpy+0x1b9>
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x20(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jae    12f8 <lz77_memcpy+0x1f8>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
jmp    12b9 <lz77_memcpy+0x1b9>
jmp    12fd <lz77_memcpy+0x1fd>
mov    -0x20(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<lz77_memcpy>:
push   %r14
push   %rbx
mov    %esi,%eax
cmp    %ecx,%esi
cmovg  %ecx,%eax
test   %eax,%eax
je     1322 <lz77_memcpy+0x222>
cmp    $0xa,%eax
jl     1136 <lz77_memcpy+0x36>
mov    %eax,%esi
and    $0xfffffffc,%esi
mov    %rdx,%rcx
sub    %rdi,%rcx
test   $0x3,%cl
je     113e <lz77_memcpy+0x3e>
test   $0x1,%cl
jne    1136 <lz77_memcpy+0x36>
test   $0x1,%dl
jne    1194 <lz77_memcpy+0x94>
mov    %rdx,%r10
jmp    11a0 <lz77_memcpy+0xa0>
mov    %rdx,%r10
jmp    12e4 <lz77_memcpy+0x1e4>
test   $0x3,%dl
je     1266 <lz77_memcpy+0x166>
mov    (%rdi),%cl
lea    0x1(%rdx),%r10
mov    %cl,(%rdx)
test   $0x3,%r10b
je     126b <lz77_memcpy+0x16b>
mov    0x1(%rdi),%cl
lea    0x2(%rdx),%r10
mov    %cl,0x1(%rdx)
test   $0x3,%r10b
je     1271 <lz77_memcpy+0x171>
mov    0x2(%rdi),%cl
lea    0x3(%rdx),%r10
mov    %cl,0x2(%rdx)
test   $0x3,%r10b
je     1277 <lz77_memcpy+0x177>
mov    0x3(%rdi),%cl
add    $0x4,%rdi
lea    0x4(%rdx),%r10
mov    %cl,0x3(%rdx)
jmp    127b <lz77_memcpy+0x17b>
lea    0x1(%rdx),%r10
mov    (%rdi),%cl
add    $0x1,%rdi
mov    %cl,(%rdx)
movslq %esi,%rsi
add    %rdx,%rsi
cmp    %rsi,%r10
jae    12e4 <lz77_memcpy+0x1e4>
lea    0x2(%r10),%rcx
cmp    %rcx,%rsi
mov    %rcx,%r8
cmova  %rsi,%r8
mov    %r10,%rbx
not    %rbx
add    %rbx,%r8
cmp    $0x1e,%r8
jb     12d0 <lz77_memcpy+0x1d0>
cmp    %rcx,%rsi
cmova  %rsi,%rcx
add    %rbx,%rcx
add    $0x2,%rcx
and    $0xfffffffffffffffe,%rcx
lea    (%rdi,%rcx,1),%rbx
cmp    %rbx,%r10
jae    11f7 <lz77_memcpy+0xf7>
add    %r10,%rcx
cmp    %rcx,%rdi
jb     12d0 <lz77_memcpy+0x1d0>
shr    %r8
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffff0,%r9
lea    -0x10(%r9),%rcx
mov    %rcx,%r11
shr    $0x4,%r11
add    $0x1,%r11
test   %rcx,%rcx
je     12a5 <lz77_memcpy+0x1a5>
mov    %r11,%rcx
and    $0xfffffffffffffffe,%rcx
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
movups (%rdi,%rbx,1),%xmm0
movups 0x10(%rdi,%rbx,1),%xmm1
movups %xmm0,(%r10,%rbx,1)
movups %xmm1,0x10(%r10,%rbx,1)
movups 0x20(%rdi,%rbx,1),%xmm0
movups 0x30(%rdi,%rbx,1),%xmm1
movups %xmm0,0x20(%r10,%rbx,1)
movups %xmm1,0x30(%r10,%rbx,1)
add    $0x40,%rbx
add    $0xfffffffffffffffe,%rcx
jne    1230 <lz77_memcpy+0x130>
jmp    12a7 <lz77_memcpy+0x1a7>
mov    %rdx,%r10
jmp    127b <lz77_memcpy+0x17b>
add    $0x1,%rdi
jmp    127b <lz77_memcpy+0x17b>
add    $0x2,%rdi
jmp    127b <lz77_memcpy+0x17b>
add    $0x3,%rdi
movslq %esi,%rcx
add    %rdx,%rcx
cmp    %rcx,%r10
jae    12e4 <lz77_memcpy+0x1e4>
cs nopw 0x0(%rax,%rax,1)
mov    (%rdi),%rsi
mov    %rsi,(%r10)
add    $0x4,%r10
add    $0x4,%rdi
cmp    %rcx,%r10
jb     1290 <lz77_memcpy+0x190>
jmp    12e4 <lz77_memcpy+0x1e4>
xor    %ebx,%ebx
test   $0x1,%r11b
je     12c1 <lz77_memcpy+0x1c1>
movups (%rdi,%rbx,1),%xmm0
movups 0x10(%rdi,%rbx,1),%xmm1
movups %xmm0,(%r10,%rbx,1)
movups %xmm1,0x10(%r10,%rbx,1)
lea    (%rdi,%r9,2),%rdi
lea    (%r10,%r9,2),%r10
cmp    %r9,%r8
je     12e4 <lz77_memcpy+0x1e4>
xchg   %ax,%ax
movzwl (%rdi),%ecx
mov    %cx,(%r10)
add    $0x2,%r10
add    $0x2,%rdi
cmp    %rsi,%r10
jb     12d0 <lz77_memcpy+0x1d0>
movslq %eax,%rcx
add    %rcx,%rdx
cmp    %rdx,%r10
jae    1322 <lz77_memcpy+0x222>
mov    %rdx,%r8
sub    %r10,%r8
cmp    $0x8,%r8
jb     1309 <lz77_memcpy+0x209>
lea    (%rdi,%r8,1),%rcx
cmp    %rcx,%r10
jae    1326 <lz77_memcpy+0x226>
cmp    %rdx,%rdi
jae    1326 <lz77_memcpy+0x226>
mov    %rdi,%rcx
mov    %r10,%rsi
nop
movzbl (%rcx),%ebx
add    $0x1,%rcx
mov    %bl,(%rsi)
add    $0x1,%rsi
cmp    %rdx,%rsi
jb     1310 <lz77_memcpy+0x210>
pop    %rbx
pop    %r14
ret
cmp    $0x20,%r8
jae    1334 <lz77_memcpy+0x234>
xor    %r14d,%r14d
jmp    141c <lz77_memcpy+0x31c>
mov    %r8,%r14
and    $0xffffffffffffffe0,%r14
lea    -0x20(%r14),%rcx
mov    %rcx,%r11
shr    $0x5,%r11
add    $0x1,%r11
mov    %r11d,%r9d
and    $0x3,%r9d
cmp    $0x60,%rcx
jae    135b <lz77_memcpy+0x25b>
xor    %ecx,%ecx
jmp    13d0 <lz77_memcpy+0x2d0>
and    $0xfffffffffffffffc,%r11
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movups (%rdi,%rcx,1),%xmm0
movups 0x10(%rdi,%rcx,1),%xmm1
movups %xmm0,(%r10,%rcx,1)
movups %xmm1,0x10(%r10,%rcx,1)
movups 0x20(%rdi,%rcx,1),%xmm0
movups 0x30(%rdi,%rcx,1),%xmm1
movups %xmm0,0x20(%r10,%rcx,1)
movups %xmm1,0x30(%r10,%rcx,1)
movups 0x40(%rdi,%rcx,1),%xmm0
movups 0x50(%rdi,%rcx,1),%xmm1
movups %xmm0,0x40(%r10,%rcx,1)
movups %xmm1,0x50(%r10,%rcx,1)
movups 0x60(%rdi,%rcx,1),%xmm0
movups 0x70(%rdi,%rcx,1),%xmm1
movups %xmm0,0x60(%r10,%rcx,1)
movups %xmm1,0x70(%r10,%rcx,1)
sub    $0xffffffffffffff80,%rcx
add    $0xfffffffffffffffc,%r11
jne    1370 <lz77_memcpy+0x270>
test   %r9,%r9
je     140d <lz77_memcpy+0x30d>
lea    (%r10,%rcx,1),%r11
add    $0x10,%r11
add    %rdi,%rcx
add    $0x10,%rcx
shl    $0x5,%r9
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movups -0x10(%rcx,%rsi,1),%xmm0
movups (%rcx,%rsi,1),%xmm1
movups %xmm0,-0x10(%r11,%rsi,1)
movups %xmm1,(%r11,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%r9
jne    13f0 <lz77_memcpy+0x2f0>
cmp    %r14,%r8
je     1322 <lz77_memcpy+0x222>
test   $0x18,%r8b
je     144f <lz77_memcpy+0x34f>
mov    %r8,%r9
and    $0xfffffffffffffff8,%r9
lea    (%rdi,%r9,1),%rcx
lea    (%r10,%r9,1),%rsi
nopl   0x0(%rax,%rax,1)
mov    (%rdi,%r14,1),%rbx
mov    %rbx,(%r10,%r14,1)
add    $0x8,%r14
cmp    %r14,%r9
jne    1430 <lz77_memcpy+0x330>
cmp    %r9,%r8
jne    1310 <lz77_memcpy+0x210>
jmp    1322 <lz77_memcpy+0x222>
add    %r14,%r10
add    %r14,%rdi
jmp    1309 <lz77_memcpy+0x209>

LLVM IR (-O0):
define i32 @lz77_memcpy(i8* %0, i32 %1, i8* %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8*
%12 = alloca i8*
store i8* %0, i8** %5
store i32 %1, i32* %6
store i8* %2, i8** %7
store i32 %3, i32* %8
%13 = load i32, i32* %6
%14 = load i32, i32* %8
%15 = icmp sgt i32 %13, %14
br i1 %15, label %16, label %18
16: ; preds = %4
%17 = load i32, i32* %8
br label %20
18: ; preds = %4
%19 = load i32, i32* %6
br label %20
20: ; preds = %18, %16
%21 = phi i32 [ %17, %16 ], [ %19, %18 ]
store i32 %21, i32* %9
%22 = load i32, i32* %9
%23 = icmp ne i32 %22, 0
br i1 %23, label %24, label %126
24: ; preds = %20
%25 = load i32, i32* %9
%26 = and i32 %25, -4
store i32 %26, i32* %10
%27 = load i8*, i8** %7
store i8* %27, i8** %11
%28 = load i8*, i8** %5
store i8* %28, i8** %12
%29 = load i32, i32* %9
%30 = icmp sge i32 %29, 10
br i1 %30, label %31, label %111
31: ; preds = %24
%32 = load i8*, i8** %7
%33 = load i8*, i8** %5
%34 = ptrtoint i8* %32 to i64
%35 = ptrtoint i8* %33 to i64
%36 = sub i64 %34, %35
%37 = and i64 %36, 3
%38 = icmp eq i64 %37, 0
br i1 %38, label %39, label %70
39: ; preds = %31
br label %40
40: ; preds = %45, %39
%41 = load i8*, i8** %11
%42 = ptrtoint i8* %41 to i64
%43 = and i64 %42, 3
%44 = icmp ne i64 %43, 0
br i1 %44, label %45, label %51
45: ; preds = %40
%46 = load i8*, i8** %12
%47 = getelementptr inbounds i8, i8* %46, i32 1
store i8* %47, i8** %12
%48 = load i8, i8* %46
%49 = load i8*, i8** %11
%50 = getelementptr inbounds i8, i8* %49, i32 1
store i8* %50, i8** %11
store i8 %48, i8* %49
br label %40
51: ; preds = %40
br label %52
52: ; preds = %59, %51
%53 = load i8*, i8** %11
%54 = load i8*, i8** %7
%55 = load i32, i32* %10
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i8, i8* %54, i64 %56
%58 = icmp ult i8* %53, %57
br i1 %58, label %59, label %69
59: ; preds = %52
%60 = load i8*, i8** %12
%61 = bitcast i8* %60 to i64*
%62 = load i64, i64* %61
%63 = load i8*, i8** %11
%64 = bitcast i8* %63 to i64*
store i64 %62, i64* %64
%65 = load i8*, i8** %11
%66 = getelementptr inbounds i8, i8* %65, i64 4
store i8* %66, i8** %11
%67 = load i8*, i8** %12
%68 = getelementptr inbounds i8, i8* %67, i64 4
store i8* %68, i8** %12
br label %52
69: ; preds = %52
br label %110
70: ; preds = %31
%71 = load i8*, i8** %7
%72 = load i8*, i8** %5
%73 = ptrtoint i8* %71 to i64
%74 = ptrtoint i8* %72 to i64
%75 = sub i64 %73, %74
%76 = and i64 %75, 1
%77 = icmp eq i64 %76, 0
br i1 %77, label %78, label %109
78: ; preds = %70
br label %79
79: ; preds = %84, %78
%80 = load i8*, i8** %11
%81 = ptrtoint i8* %80 to i64
%82 = and i64 %81, 1
%83 = icmp ne i64 %82, 0
br i1 %83, label %84, label %90
84: ; preds = %79
%85 = load i8*, i8** %12
%86 = getelementptr inbounds i8, i8* %85, i32 1
store i8* %86, i8** %12
%87 = load i8, i8* %85
%88 = load i8*, i8** %11
%89 = getelementptr inbounds i8, i8* %88, i32 1
store i8* %89, i8** %11
store i8 %87, i8* %88
br label %79
90: ; preds = %79
br label %91
91: ; preds = %98, %90
%92 = load i8*, i8** %11
%93 = load i8*, i8** %7
%94 = load i32, i32* %10
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds i8, i8* %93, i64 %95
%97 = icmp ult i8* %92, %96
br i1 %97, label %98, label %108
98: ; preds = %91
%99 = load i8*, i8** %12
%100 = bitcast i8* %99 to i16*
%101 = load i16, i16* %100
%102 = load i8*, i8** %11
%103 = bitcast i8* %102 to i16*
store i16 %101, i16* %103
%104 = load i8*, i8** %11
%105 = getelementptr inbounds i8, i8* %104, i64 2
store i8* %105, i8** %11
%106 = load i8*, i8** %12
%107 = getelementptr inbounds i8, i8* %106, i64 2
store i8* %107, i8** %12
br label %91
108: ; preds = %91
br label %109
109: ; preds = %108, %70
br label %110
110: ; preds = %109, %69
br label %111
111: ; preds = %110, %24
br label %112
112: ; preds = %119, %111
%113 = load i8*, i8** %11
%114 = load i8*, i8** %7
%115 = load i32, i32* %9
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds i8, i8* %114, i64 %116
%118 = icmp ult i8* %113, %117
br i1 %118, label %119, label %125
119: ; preds = %112
%120 = load i8*, i8** %12
%121 = getelementptr inbounds i8, i8* %120, i32 1
store i8* %121, i8** %12
%122 = load i8, i8* %120
%123 = load i8*, i8** %11
%124 = getelementptr inbounds i8, i8* %123, i32 1
store i8* %124, i8** %11
store i8 %122, i8* %123
br label %112
125: ; preds = %112
br label %126
126: ; preds = %125, %20
%127 = load i32, i32* %9
ret i32 %127
}

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