void merge(int *a1, int n1, int *a2, int n2, int *a) {
  int i = 0;
  int j = 0;
  int k = 0;
  while (i < n1 && j < n2) {
    if (a1[i] <= a2[j]) {
      a[k] = a1[i];
      i++;
      k++;
    } else {
      a[k] = a2[j];
      j++;
      k++;
    }
  }
  while (i < n1) {
    a[k] = a1[i];
    i++;
    k++;
  }
  while (j < n2) {
    a[k] = a2[j];
    j++;
    k++;
  }
}


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    %r8,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x2c(%rbp),%ecx
xor    %eax,%eax
cmp    -0xc(%rbp),%ecx
mov    %al,-0x35(%rbp)
jge    1148 <merge+0x48>
mov    -0x30(%rbp),%eax
cmp    -0x1c(%rbp),%eax
setl   %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    1158 <merge+0x58>
jmp    11ce <merge+0xce>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x18(%rbp),%rcx
movslq -0x30(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jg     11a1 <merge+0xa1>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11c9 <merge+0xc9>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    112b <merge+0x2b>
jmp    11d3 <merge+0xd3>
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    120c <merge+0x10c>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11d3 <merge+0xd3>
jmp    1211 <merge+0x111>
mov    -0x30(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    124a <merge+0x14a>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1211 <merge+0x111>
pop    %rbp
ret

x86 assembly (clang, -O2):
<merge>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
xor    %ebx,%ebx
test   %esi,%esi
jle    12dd <merge+0x1dd>
mov    $0x0,%r15d
mov    $0x0,%r9d
test   %ecx,%ecx
jle    1169 <merge+0x69>
xor    %r9d,%r9d
xor    %r15d,%r15d
xor    %ebx,%ebx
nopl   0x0(%rax)
mov    %ebx,%r11d
mov    %r15d,%r10d
mov    %ebx,%ebx
mov    (%rdi,%rbx,4),%eax
mov    %r15d,%ebx
mov    (%rdx,%rbx,4),%ebp
xor    %r15d,%r15d
xor    %ebx,%ebx
cmp    %ebp,%eax
setg   %r15b
setle  %bl
cmovg  %ebp,%eax
add    %r11d,%ebx
add    %r10d,%r15d
mov    %eax,(%r8,%r9,4)
add    $0x1,%r9
cmp    %esi,%ebx
jge    1169 <merge+0x69>
cmp    %ecx,%r15d
jl     1130 <merge+0x30>
cmp    %esi,%ebx
jge    12eb <merge+0x1eb>
mov    %r9d,%r9d
movslq %ebx,%r11
movslq %esi,%r10
mov    %r10,%r12
sub    %r11,%r12
cmp    $0x8,%r12
jb     1258 <merge+0x158>
lea    (%r8,%r9,4),%rbx
lea    (%rdi,%r10,4),%rbp
cmp    %rbp,%rbx
jae    11af <merge+0xaf>
lea    (%r10,%r9,1),%rbx
sub    %r11,%rbx
lea    (%r8,%rbx,4),%rbx
lea    (%rdi,%r11,4),%rbp
cmp    %rbx,%rbp
jb     1258 <merge+0x158>
mov    %r12,%rbp
and    $0xfffffffffffffff8,%rbp
lea    -0x8(%rbp),%rbx
mov    %rbx,%rax
shr    $0x3,%rax
add    $0x1,%rax
test   %rbx,%rbx
mov    %rbp,-0x8(%rsp)
je     1452 <merge+0x352>
mov    %rax,%r13
and    $0xfffffffffffffffe,%r13
lea    (%rdi,%r11,4),%rbp
add    $0x30,%rbp
lea    (%r8,%r9,4),%r14
add    $0x30,%r14
xor    %ebx,%ebx
nopl   0x0(%rax)
movups -0x30(%rbp,%rbx,4),%xmm0
movups -0x20(%rbp,%rbx,4),%xmm1
movups %xmm0,-0x30(%r14,%rbx,4)
movups %xmm1,-0x20(%r14,%rbx,4)
movups -0x10(%rbp,%rbx,4),%xmm0
movups 0x0(%rbp,%rbx,4),%xmm1
movups %xmm0,-0x10(%r14,%rbx,4)
movups %xmm1,(%r14,%rbx,4)
add    $0x10,%rbx
add    $0xfffffffffffffffe,%r13
jne    11f0 <merge+0xf0>
test   $0x1,%al
je     1244 <merge+0x144>
lea    (%rbx,%r11,1),%rbp
add    %r9,%rbx
movups (%rdi,%rbp,4),%xmm0
movups 0x10(%rdi,%rbp,4),%xmm1
movups %xmm0,(%r8,%rbx,4)
movups %xmm1,0x10(%r8,%rbx,4)
mov    -0x8(%rsp),%rax
add    %rax,%r9
cmp    %rax,%r12
je     12eb <merge+0x1eb>
add    %rax,%r11
sub    %r11d,%esi
mov    %r11,%rbx
not    %rbx
add    %r10,%rbx
and    $0x3,%rsi
je     1286 <merge+0x186>
nopw   0x0(%rax,%rax,1)
mov    (%rdi,%r11,4),%ebp
mov    %ebp,(%r8,%r9,4)
add    $0x1,%r11
add    $0x1,%r9
add    $0xffffffffffffffff,%rsi
jne    1270 <merge+0x170>
cmp    $0x3,%rbx
jb     12eb <merge+0x1eb>
sub    %r11,%r10
lea    (%rdi,%r11,4),%rdi
add    $0xc,%rdi
lea    (%r8,%r9,4),%rbp
add    $0xc,%rbp
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    -0xc(%rdi,%rsi,4),%eax
mov    %eax,-0xc(%rbp,%rsi,4)
mov    -0x8(%rdi,%rsi,4),%eax
mov    %eax,-0x8(%rbp,%rsi,4)
mov    -0x4(%rdi,%rsi,4),%eax
mov    %eax,-0x4(%rbp,%rsi,4)
mov    (%rdi,%rsi,4),%eax
mov    %eax,0x0(%rbp,%rsi,4)
add    $0x4,%rsi
cmp    %rsi,%r10
jne    12b0 <merge+0x1b0>
add    %rsi,%r9
jmp    12eb <merge+0x1eb>
xor    %r15d,%r15d
xor    %r9d,%r9d
cmp    %esi,%ebx
jl     1171 <merge+0x71>
cmp    %ecx,%r15d
jge    1447 <merge+0x347>
mov    %r9d,%esi
movslq %r15d,%rdi
movslq %ecx,%r14
mov    %r14,%r11
sub    %rdi,%r11
cmp    $0x8,%r11
jb     13d1 <merge+0x2d1>
lea    (%r8,%rsi,4),%rax
lea    (%rdx,%r14,4),%rbp
cmp    %rbp,%rax
jae    1332 <merge+0x232>
lea    (%r14,%rsi,1),%rax
sub    %rdi,%rax
lea    (%r8,%rax,4),%rax
lea    (%rdx,%rdi,4),%rbp
cmp    %rax,%rbp
jb     13d1 <merge+0x2d1>
mov    %r11,%r9
and    $0xfffffffffffffff8,%r9
lea    -0x8(%r9),%rax
mov    %rax,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rax,%rax
je     1461 <merge+0x361>
mov    %r10,%rax
and    $0xfffffffffffffffe,%rax
lea    (%rdx,%rdi,4),%r15
add    $0x30,%r15
lea    (%r8,%rsi,4),%rbp
add    $0x30,%rbp
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movups -0x30(%r15,%rbx,4),%xmm0
movups -0x20(%r15,%rbx,4),%xmm1
movups %xmm0,-0x30(%rbp,%rbx,4)
movups %xmm1,-0x20(%rbp,%rbx,4)
movups -0x10(%r15,%rbx,4),%xmm0
movups (%r15,%rbx,4),%xmm1
movups %xmm0,-0x10(%rbp,%rbx,4)
movups %xmm1,0x0(%rbp,%rbx,4)
add    $0x10,%rbx
add    $0xfffffffffffffffe,%rax
jne    1370 <merge+0x270>
test   $0x1,%r10b
je     13c6 <merge+0x2c6>
lea    (%rbx,%rdi,1),%rax
add    %rsi,%rbx
movups (%rdx,%rax,4),%xmm0
movups 0x10(%rdx,%rax,4),%xmm1
movups %xmm0,(%r8,%rbx,4)
movups %xmm1,0x10(%r8,%rbx,4)
cmp    %r9,%r11
je     1447 <merge+0x347>
add    %r9,%rdi
add    %r9,%rsi
sub    %edi,%ecx
mov    %rdi,%rbx
not    %rbx
add    %r14,%rbx
and    $0x3,%rcx
je     1405 <merge+0x305>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    (%rdx,%rdi,4),%eax
mov    %eax,(%r8,%rsi,4)
add    $0x1,%rdi
add    $0x1,%rsi
add    $0xffffffffffffffff,%rcx
jne    13f0 <merge+0x2f0>
cmp    $0x3,%rbx
jb     1447 <merge+0x347>
sub    %rdi,%r14
lea    (%rdx,%rdi,4),%rax
add    $0xc,%rax
lea    (%r8,%rsi,4),%rcx
add    $0xc,%rcx
xor    %edx,%edx
mov    -0xc(%rax,%rdx,4),%esi
mov    %esi,-0xc(%rcx,%rdx,4)
mov    -0x8(%rax,%rdx,4),%esi
mov    %esi,-0x8(%rcx,%rdx,4)
mov    -0x4(%rax,%rdx,4),%esi
mov    %esi,-0x4(%rcx,%rdx,4)
mov    (%rax,%rdx,4),%esi
mov    %esi,(%rcx,%rdx,4)
add    $0x4,%rdx
cmp    %rdx,%r14
jne    1420 <merge+0x320>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ebx,%ebx
test   $0x1,%al
jne    1229 <merge+0x129>
jmp    1244 <merge+0x144>
xor    %ebx,%ebx
test   $0x1,%r10b
jne    13ab <merge+0x2ab>
jmp    13c6 <merge+0x2c6>

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

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