void merge(int A[], int m, int B[], int n) {
  int ia = m - 1;
  int ib = n - 1;
  int i = m + n - 1;
  while ((ia >= 0) && (ib >= 0)) {
    A[i--] = A[ia] > B[ib] ? A[ia--] : B[ib--];
  }
  while (ia >= 0) {
    A[i--] = A[ia--];
  }
  while (ib >= 0) {
    A[i--] = B[ib--];
  }
}


x86 assembly (clang, -O0):
<merge>:
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
sub    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0xc(%rbp),%eax
add    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x20(%rbp)
mov    %al,-0x29(%rbp)
jl     1149 <merge+0x49>
cmpl   $0x0,-0x24(%rbp)
setge  %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    1159 <merge+0x59>
jmp    11c7 <merge+0xc7>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x18(%rbp),%rcx
movslq -0x24(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jle    1192 <merge+0x92>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x30(%rbp)
jmp    11aa <merge+0xaa>
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x24(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0xffffffff,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1130 <merge+0x30>
jmp    11cc <merge+0xcc>
cmpl   $0x0,-0x20(%rbp)
jl     1205 <merge+0x105>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0xffffffff,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    11cc <merge+0xcc>
jmp    120a <merge+0x10a>
cmpl   $0x0,-0x24(%rbp)
jl     1243 <merge+0x143>
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x24(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0xffffffff,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    120a <merge+0x10a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<merge>:
push   %r15
push   %r14
push   %rbx
lea    -0x1(%rsi),%r10d
lea    -0x1(%rcx),%r8d
lea    (%rcx,%rsi,1),%r9d
add    $0xffffffff,%r9d
test   %esi,%esi
jle    1166 <merge+0x66>
test   %ecx,%ecx
jle    1166 <merge+0x66>
movslq %r9d,%rcx
lea    (%rdi,%rcx,4),%rcx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r10d,%esi
mov    (%rdi,%rsi,4),%r11d
mov    %r8d,%ebx
mov    (%rdx,%rbx,4),%ebx
xor    %eax,%eax
xor    %esi,%esi
cmp    %ebx,%r11d
setle  %al
setg   %sil
cmovg  %r11d,%ebx
sub    %eax,%r8d
add    $0xffffffff,%r9d
sub    %esi,%r10d
mov    %ebx,(%rcx)
js     1166 <merge+0x66>
add    $0xfffffffffffffffc,%rcx
test   %r8d,%r8d
jns    1130 <merge+0x30>
test   %r10d,%r10d
js     1300 <merge+0x200>
movslq %r9d,%r9
mov    %r10d,%r15d
cmp    $0x7,%r10d
jae    11bd <merge+0xbd>
lea    0x1(%r15),%eax
and    $0x3,%rax
je     12b9 <merge+0x1b9>
xor    %ecx,%ecx
mov    %rdi,%rsi
xchg   %ax,%ax
mov    (%rsi,%r15,4),%ebx
mov    %ebx,(%rsi,%r9,4)
add    $0x1,%rcx
add    $0xfffffffffffffffc,%rsi
cmp    %rcx,%rax
jne    1190 <merge+0x90>
mov    %r15,%rax
sub    %rcx,%rax
sub    %rcx,%r9
cmp    $0x3,%r15
jae    12d0 <merge+0x1d0>
jmp    1300 <merge+0x200>
lea    (%rdi,%r9,4),%rax
lea    0x0(,%r15,4),%rcx
mov    %rax,%rsi
sub    %rcx,%rsi
cmp    %rax,%rsi
ja     117b <merge+0x7b>
lea    (%rdi,%r15,4),%rax
cmp    %rdi,%rax
jb     117b <merge+0x7b>
mov    %r9,%rax
sub    %r15,%rax
lea    (%rdi,%rax,4),%rax
lea    (%rdi,%r15,4),%rcx
add    $0x4,%rcx
cmp    %rcx,%rax
jae    1205 <merge+0x105>
lea    (%rdi,%r9,4),%rax
add    $0x4,%rax
cmp    %rdi,%rax
ja     117b <merge+0x7b>
lea    0x1(%r15),%r10
mov    %r10,%r11
and    $0xfffffffffffffff8,%r11
lea    -0x8(%r11),%rax
mov    %rax,%r14
shr    $0x3,%r14
add    $0x1,%r14
test   %rax,%rax
je     146e <merge+0x36e>
mov    %r14,%rbx
and    $0xfffffffffffffffe,%rbx
lea    (%rdi,%r15,4),%rsi
add    $0xfffffffffffffff4,%rsi
lea    (%rdi,%r9,4),%rcx
add    $0xfffffffffffffff4,%rcx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movups -0x10(%rsi,%rax,4),%xmm0
movups (%rsi,%rax,4),%xmm1
movups %xmm1,(%rcx,%rax,4)
movups %xmm0,-0x10(%rcx,%rax,4)
movups -0x30(%rsi,%rax,4),%xmm0
movups -0x20(%rsi,%rax,4),%xmm1
movups %xmm1,-0x20(%rcx,%rax,4)
movups %xmm0,-0x30(%rcx,%rax,4)
add    $0xfffffffffffffff0,%rax
add    $0xfffffffffffffffe,%rbx
jne    1250 <merge+0x150>
neg    %rax
test   $0x1,%r14b
je     12a9 <merge+0x1a9>
mov    %r15,%rcx
sub    %rax,%rcx
mov    %r9,%rsi
sub    %rax,%rsi
movups -0x1c(%rdi,%rcx,4),%xmm0
movups -0xc(%rdi,%rcx,4),%xmm1
movups %xmm1,-0xc(%rdi,%rsi,4)
movups %xmm0,-0x1c(%rdi,%rsi,4)
sub    %r11,%r9
cmp    %r11,%r10
je     1300 <merge+0x200>
sub    %r11,%r15
jmp    117b <merge+0x7b>
mov    %r15,%rax
cmp    $0x3,%r15
jb     1300 <merge+0x200>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    (%rdi,%rax,4),%ecx
mov    %ecx,(%rdi,%r9,4)
mov    -0x4(%rdi,%rax,4),%ecx
mov    %ecx,-0x4(%rdi,%r9,4)
mov    -0x8(%rdi,%rax,4),%ecx
mov    %ecx,-0x8(%rdi,%r9,4)
mov    -0xc(%rdi,%rax,4),%ecx
add    $0xfffffffffffffffc,%rax
mov    %ecx,-0xc(%rdi,%r9,4)
add    $0xfffffffffffffffc,%r9
cmp    $0xffffffffffffffff,%rax
jne    12d0 <merge+0x1d0>
test   %r8d,%r8d
js     1457 <merge+0x357>
movslq %r9d,%rax
mov    %r8d,%r11d
cmp    $0x7,%r8d
jb     13e8 <merge+0x2e8>
mov    %rax,%rcx
sub    %r11,%rcx
lea    (%rdi,%rcx,4),%rcx
lea    (%rdx,%r11,4),%rsi
add    $0x4,%rsi
cmp    %rsi,%rcx
jae    1341 <merge+0x241>
lea    (%rdi,%rax,4),%rcx
add    $0x4,%rcx
cmp    %rdx,%rcx
ja     13e8 <merge+0x2e8>
lea    0x1(%r11),%r8
mov    %r8,%r9
and    $0xfffffffffffffff8,%r9
lea    -0x8(%r9),%rcx
mov    %rcx,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rcx,%rcx
je     145d <merge+0x35d>
mov    %r10,%rcx
and    $0xfffffffffffffffe,%rcx
lea    (%rdx,%r11,4),%r14
add    $0xfffffffffffffff4,%r14
lea    (%rdi,%rax,4),%rbx
add    $0xfffffffffffffff4,%rbx
xor    %esi,%esi
nopl   (%rax)
movups -0x10(%r14,%rsi,4),%xmm0
movups (%r14,%rsi,4),%xmm1
movups %xmm1,(%rbx,%rsi,4)
movups %xmm0,-0x10(%rbx,%rsi,4)
movups -0x30(%r14,%rsi,4),%xmm0
movups -0x20(%r14,%rsi,4),%xmm1
movups %xmm1,-0x20(%rbx,%rsi,4)
movups %xmm0,-0x30(%rbx,%rsi,4)
add    $0xfffffffffffffff0,%rsi
add    $0xfffffffffffffffe,%rcx
jne    1380 <merge+0x280>
neg    %rsi
test   $0x1,%r10b
je     13dd <merge+0x2dd>
mov    %r11,%rcx
sub    %rsi,%rcx
mov    %rax,%rbx
sub    %rsi,%rbx
movups -0x1c(%rdx,%rcx,4),%xmm0
movups -0xc(%rdx,%rcx,4),%xmm1
movups %xmm1,-0xc(%rdi,%rbx,4)
movups %xmm0,-0x1c(%rdi,%rbx,4)
cmp    %r9,%r8
je     1457 <merge+0x357>
sub    %r9,%r11
sub    %r9,%rax
lea    0x1(%r11),%ecx
mov    %r11,%rsi
and    $0x3,%rcx
je     1414 <merge+0x314>
cs nopw 0x0(%rax,%rax,1)
nop
mov    (%rdx,%rsi,4),%ebx
add    $0xffffffffffffffff,%rsi
mov    %ebx,(%rdi,%rax,4)
add    $0xffffffffffffffff,%rax
add    $0xffffffffffffffff,%rcx
jne    1400 <merge+0x300>
cmp    $0x3,%r11
jb     1457 <merge+0x357>
lea    (%rdx,%rsi,4),%rcx
not    %rsi
lea    (%rdi,%rax,4),%rax
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
mov    (%rcx,%rdx,4),%edi
mov    %edi,(%rax,%rdx,4)
mov    -0x4(%rcx,%rdx,4),%edi
mov    %edi,-0x4(%rax,%rdx,4)
mov    -0x8(%rcx,%rdx,4),%edi
mov    %edi,-0x8(%rax,%rdx,4)
mov    -0xc(%rcx,%rdx,4),%edi
mov    %edi,-0xc(%rax,%rdx,4)
add    $0xfffffffffffffffc,%rdx
cmp    %rdx,%rsi
jne    1430 <merge+0x330>
pop    %rbx
pop    %r14
pop    %r15
ret
xor    %esi,%esi
test   $0x1,%r10b
jne    13bd <merge+0x2bd>
jmp    13dd <merge+0x2dd>
xor    %eax,%eax
test   $0x1,%r14b
jne    1289 <merge+0x189>
jmp    12a9 <merge+0x1a9>

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

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