#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int sc_strlen(char *);
void sc_strcat_ex(char *A, char *B, char *C) {
  int walker = 0;
  int length_of_A = sc_strlen(A);
  int length_of_B = sc_strlen(B);
  if (!A || !B)
    return;
  for (walker = 0; walker < length_of_A; walker++)
    C[walker] = A[walker];
  for (; walker < length_of_A + length_of_B; walker++)
    C[walker] = B[walker - length_of_A];
  C[walker] = '\0';
}


x86 assembly (clang, -O0):
<sc_strcat_ex>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <sc_strlen@plt>
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <sc_strlen@plt>
mov    %eax,-0x24(%rbp)
cmpq   $0x0,-0x8(%rbp)
je     1159 <sc_strcat_ex+0x49>
cmpq   $0x0,-0x10(%rbp)
jne    115e <sc_strcat_ex+0x4e>
jmp    11e0 <sc_strcat_ex+0xd0>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1195 <sc_strcat_ex+0x85>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1165 <sc_strcat_ex+0x55>
jmp    119a <sc_strcat_ex+0x8a>
mov    -0x1c(%rbp),%eax
mov    -0x20(%rbp),%ecx
add    -0x24(%rbp),%ecx
cmp    %ecx,%eax
jge    11d4 <sc_strcat_ex+0xc4>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    119a <sc_strcat_ex+0x8a>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sc_strcat_ex>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %rdx,%rbx
mov    %rsi,%r14
mov    %rdi,%rbp
call   1030 <sc_strlen@plt>
mov    %eax,%r15d
mov    %r14,%rdi
call   1030 <sc_strlen@plt>
test   %rbp,%rbp
je     14b6 <sc_strcat_ex+0x3a6>
test   %r14,%r14
je     14b6 <sc_strcat_ex+0x3a6>
test   %r15d,%r15d
jle    11e1 <sc_strcat_ex+0xd1>
mov    %r15d,%r9d
cmp    $0x8,%r15d
jb     116f <sc_strcat_ex+0x5f>
lea    (%r9,%rbp,1),%rcx
cmp    %rbx,%rcx
jbe    123b <sc_strcat_ex+0x12b>
lea    (%rbx,%r9,1),%rcx
cmp    %rbp,%rcx
jbe    123b <sc_strcat_ex+0x12b>
xor    %edx,%edx
mov    %rdx,%rsi
not    %rsi
add    %r9,%rsi
mov    %r9,%rdi
and    $0x3,%rdi
je     11a2 <sc_strcat_ex+0x92>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl 0x0(%rbp,%rdx,1),%ecx
mov    %cl,(%rbx,%rdx,1)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rdi
jne    1190 <sc_strcat_ex+0x80>
cmp    $0x3,%rsi
jb     11dc <sc_strcat_ex+0xcc>
nopl   0x0(%rax,%rax,1)
movzbl 0x0(%rbp,%rdx,1),%ecx
mov    %cl,(%rbx,%rdx,1)
movzbl 0x1(%rbp,%rdx,1),%ecx
mov    %cl,0x1(%rbx,%rdx,1)
movzbl 0x2(%rbp,%rdx,1),%ecx
mov    %cl,0x2(%rbx,%rdx,1)
movzbl 0x3(%rbp,%rdx,1),%ecx
mov    %cl,0x3(%rbx,%rdx,1)
add    $0x4,%rdx
cmp    %rdx,%r9
jne    11b0 <sc_strcat_ex+0xa0>
mov    %r15d,%edx
jmp    11e3 <sc_strcat_ex+0xd3>
xor    %edx,%edx
add    %r15d,%eax
mov    %edx,%ecx
cmp    %eax,%edx
jge    14b2 <sc_strcat_ex+0x3a2>
movslq %r15d,%r8
mov    %eax,%r12d
mov    %r12,%r10
sub    %rcx,%r10
cmp    $0x8,%r10
jb     143b <sc_strcat_ex+0x32b>
lea    (%rbx,%rcx,1),%r11
mov    %rcx,%r15
sub    %r8,%r15
add    %r14,%r15
mov    %r12,%rax
sub    %r8,%rax
add    %r14,%rax
cmp    %rax,%r11
jae    122e <sc_strcat_ex+0x11e>
lea    (%rbx,%r12,1),%rax
cmp    %rax,%r15
jb     143b <sc_strcat_ex+0x32b>
cmp    $0x20,%r10
jae    1275 <sc_strcat_ex+0x165>
xor    %esi,%esi
jmp    1414 <sc_strcat_ex+0x304>
cmp    $0x20,%r15d
jae    1248 <sc_strcat_ex+0x138>
xor    %edx,%edx
jmp    13ae <sc_strcat_ex+0x29e>
mov    %r9d,%edx
and    $0xffffffe0,%edx
lea    -0x20(%rdx),%rcx
mov    %rcx,%rdi
shr    $0x5,%rdi
add    $0x1,%rdi
mov    %edi,%r8d
and    $0x3,%r8d
cmp    $0x60,%rcx
jae    12f6 <sc_strcat_ex+0x1e6>
xor    %esi,%esi
jmp    1359 <sc_strcat_ex+0x249>
mov    %r10,%rsi
and    $0xffffffffffffffe0,%rsi
lea    -0x20(%rsi),%rax
mov    %rax,%r9
shr    $0x5,%r9
add    $0x1,%r9
test   %rax,%rax
je     13e0 <sc_strcat_ex+0x2d0>
movabs $0xffffffffffffffc,%rdi
ff ff 0f
or     $0x2,%rdi
and    %r9,%rdi
lea    (%rbx,%rcx,1),%rbp
add    $0x30,%rbp
mov    %r8,%rax
neg    %rax
add    %rcx,%rax
add    $0x30,%rax
add    %r14,%rax
xor    %edx,%edx
nop
movups -0x30(%rax,%rdx,1),%xmm0
movups -0x20(%rax,%rdx,1),%xmm1
movups %xmm0,-0x30(%rbp,%rdx,1)
movups %xmm1,-0x20(%rbp,%rdx,1)
movups -0x10(%rax,%rdx,1),%xmm0
movups (%rax,%rdx,1),%xmm1
movups %xmm0,-0x10(%rbp,%rdx,1)
movups %xmm1,0x0(%rbp,%rdx,1)
add    $0x40,%rdx
add    $0xfffffffffffffffe,%rdi
jne    12c0 <sc_strcat_ex+0x1b0>
jmp    13e2 <sc_strcat_ex+0x2d2>
and    $0xfffffffffffffffc,%rdi
xor    %esi,%esi
nopl   0x0(%rax)
movups 0x0(%rbp,%rsi,1),%xmm0
movups 0x10(%rbp,%rsi,1),%xmm1
movups %xmm0,(%rbx,%rsi,1)
movups %xmm1,0x10(%rbx,%rsi,1)
movups 0x20(%rbp,%rsi,1),%xmm0
movups 0x30(%rbp,%rsi,1),%xmm1
movups %xmm0,0x20(%rbx,%rsi,1)
movups %xmm1,0x30(%rbx,%rsi,1)
movups 0x40(%rbp,%rsi,1),%xmm0
movups 0x50(%rbp,%rsi,1),%xmm1
movups %xmm0,0x40(%rbx,%rsi,1)
movups %xmm1,0x50(%rbx,%rsi,1)
movups 0x60(%rbp,%rsi,1),%xmm0
movups 0x70(%rbp,%rsi,1),%xmm1
movups %xmm0,0x60(%rbx,%rsi,1)
movups %xmm1,0x70(%rbx,%rsi,1)
sub    $0xffffffffffffff80,%rsi
add    $0xfffffffffffffffc,%rdi
jne    1300 <sc_strcat_ex+0x1f0>
test   %r8,%r8
je     139b <sc_strcat_ex+0x28b>
lea    (%rbx,%rsi,1),%rdi
add    $0x10,%rdi
add    %rbp,%rsi
add    $0x10,%rsi
shl    $0x5,%r8
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x10(%rsi,%rcx,1),%xmm0
movups (%rsi,%rcx,1),%xmm1
movups %xmm0,-0x10(%rdi,%rcx,1)
movups %xmm1,(%rdi,%rcx,1)
add    $0x20,%rcx
cmp    %rcx,%r8
jne    1380 <sc_strcat_ex+0x270>
cmp    %r9,%rdx
je     11dc <sc_strcat_ex+0xcc>
test   $0x18,%r9b
je     1171 <sc_strcat_ex+0x61>
mov    %rdx,%rsi
mov    %r9d,%edx
and    $0xfffffff8,%edx
nopw   0x0(%rax,%rax,1)
mov    0x0(%rbp,%rsi,1),%rcx
mov    %rcx,(%rbx,%rsi,1)
add    $0x8,%rsi
cmp    %rsi,%rdx
jne    13c0 <sc_strcat_ex+0x2b0>
cmp    %r9,%rdx
jne    1171 <sc_strcat_ex+0x61>
jmp    11dc <sc_strcat_ex+0xcc>
xor    %edx,%edx
test   $0x1,%r9b
je     1405 <sc_strcat_ex+0x2f5>
add    %rcx,%rdx
mov    %rdx,%rax
sub    %r8,%rax
movups (%r14,%rax,1),%xmm0
movups 0x10(%r14,%rax,1),%xmm1
movups %xmm0,(%rbx,%rdx,1)
movups %xmm1,0x10(%rbx,%rdx,1)
cmp    %rsi,%r10
je     14af <sc_strcat_ex+0x39f>
test   $0x18,%r10b
je     1438 <sc_strcat_ex+0x328>
mov    %r10,%rax
and    $0xfffffffffffffff8,%rax
add    %rax,%rcx
xchg   %ax,%ax
mov    (%r15,%rsi,1),%rdx
mov    %rdx,(%r11,%rsi,1)
add    $0x8,%rsi
cmp    %rsi,%rax
jne    1420 <sc_strcat_ex+0x310>
cmp    %rax,%r10
jne    143b <sc_strcat_ex+0x32b>
jmp    14af <sc_strcat_ex+0x39f>
add    %rsi,%rcx
mov    %r12d,%esi
sub    %ecx,%esi
mov    %rcx,%rdi
not    %rdi
add    %r12,%rdi
and    $0x3,%rsi
je     1471 <sc_strcat_ex+0x361>
mov    %r14,%rax
sub    %r8,%rax
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rax,%rcx,1),%edx
mov    %dl,(%rbx,%rcx,1)
add    $0x1,%rcx
add    $0xffffffffffffffff,%rsi
jne    1460 <sc_strcat_ex+0x350>
cmp    $0x3,%rdi
jb     14af <sc_strcat_ex+0x39f>
sub    %r8,%r14
add    $0x3,%r14
xchg   %ax,%ax
movzbl -0x3(%r14,%rcx,1),%eax
mov    %al,(%rbx,%rcx,1)
movzbl -0x2(%r14,%rcx,1),%eax
mov    %al,0x1(%rbx,%rcx,1)
movzbl -0x1(%r14,%rcx,1),%eax
mov    %al,0x2(%rbx,%rcx,1)
movzbl (%r14,%rcx,1),%eax
mov    %al,0x3(%rbx,%rcx,1)
add    $0x4,%rcx
cmp    %rcx,%r12
jne    1480 <sc_strcat_ex+0x370>
mov    %r12,%rcx
movb   $0x0,(%rbx,%rcx,1)
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @sc_strcat_ex(i8* %0, i8* %1, i8* %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %4
store i8* %1, i8** %5
store i8* %2, i8** %6
store i32 0, i32* %7
%10 = load i8*, i8** %4
%11 = call i32 @sc_strlen(i8* %10)
store i32 %11, i32* %8
%12 = load i8*, i8** %5
%13 = call i32 @sc_strlen(i8* %12)
store i32 %13, i32* %9
%14 = load i8*, i8** %4
%15 = icmp ne i8* %14, null
br i1 %15, label %16, label %19
16: ; preds = %3
%17 = load i8*, i8** %5
%18 = icmp ne i8* %17, null
br i1 %18, label %20, label %19
19: ; preds = %16, %3
br label %65
20: ; preds = %16
store i32 0, i32* %7
br label %21
21: ; preds = %35, %20
%22 = load i32, i32* %7
%23 = load i32, i32* %8
%24 = icmp slt i32 %22, %23
br i1 %24, label %25, label %38
25: ; preds = %21
%26 = load i8*, i8** %4
%27 = load i32, i32* %7
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds i8, i8* %26, i64 %28
%30 = load i8, i8* %29
%31 = load i8*, i8** %6
%32 = load i32, i32* %7
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i8, i8* %31, i64 %33
store i8 %30, i8* %34
br label %35
35: ; preds = %25
%36 = load i32, i32* %7
%37 = add nsw i32 %36, 1
store i32 %37, i32* %7
br label %21
38: ; preds = %21
br label %39
39: ; preds = %57, %38
%40 = load i32, i32* %7
%41 = load i32, i32* %8
%42 = load i32, i32* %9
%43 = add nsw i32 %41, %42
%44 = icmp slt i32 %40, %43
br i1 %44, label %45, label %60
45: ; preds = %39
%46 = load i8*, i8** %5
%47 = load i32, i32* %7
%48 = load i32, i32* %8
%49 = sub nsw i32 %47, %48
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %46, i64 %50
%52 = load i8, i8* %51
%53 = load i8*, i8** %6
%54 = load i32, i32* %7
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i8, i8* %53, i64 %55
store i8 %52, i8* %56
br label %57
57: ; preds = %45
%58 = load i32, i32* %7
%59 = add nsw i32 %58, 1
store i32 %59, i32* %7
br label %39
60: ; preds = %39
%61 = load i8*, i8** %6
%62 = load i32, i32* %7
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds i8, i8* %61, i64 %63
store i8 0, i8* %64
br label %65
65: ; preds = %60, %19
ret void
}

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