void merge(int *array, int *left, int left_len, int *right, int right_len) {
  int i, j, k;
  i = j = k = 0;
  while (i < left_len && j < right_len) {
    if (left[i] <= right[j])
      array[k++] = left[i++];
    else
      array[k++] = right[j++];
  }
  while (i < left_len)
    array[k++] = left[i++];
  while (j < right_len)
    array[k++] = right[j++];
}


x86 assembly (clang, -O0):
<merge>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x31(%rbp)
jge    1149 <merge+0x49>
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
setl   %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    1159 <merge+0x59>
jmp    11d3 <merge+0xd3>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x20(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jg     11a4 <merge+0xa4>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x30(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    11ce <merge+0xce>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x2c(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x30(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    112c <merge+0x2c>
jmp    11d8 <merge+0xd8>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1213 <merge+0x113>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x30(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    11d8 <merge+0xd8>
jmp    1218 <merge+0x118>
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1253 <merge+0x153>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x2c(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x30(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1218 <merge+0x118>
pop    %rbp
ret

x86 assembly (clang, -O2):
<merge>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
xor    %ebx,%ebx
test   %edx,%edx
jle    12dd <merge+0x1dd>
mov    $0x0,%r15d
mov    $0x0,%r9d
test   %r8d,%r8d
jle    1169 <merge+0x69>
xor    %r9d,%r9d
xor    %r15d,%r15d
xor    %ebx,%ebx
nopl   (%rax)
mov    %ebx,%r11d
mov    %r15d,%r10d
mov    %ebx,%ebx
mov    (%rsi,%rbx,4),%eax
mov    %r15d,%ebx
mov    (%rcx,%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,(%rdi,%r9,4)
add    $0x1,%r9
cmp    %edx,%ebx
jge    1169 <merge+0x69>
cmp    %r8d,%r15d
jl     1130 <merge+0x30>
cmp    %edx,%ebx
jge    12eb <merge+0x1eb>
mov    %r9d,%r9d
movslq %ebx,%r11
movslq %edx,%r10
mov    %r10,%r12
sub    %r11,%r12
cmp    $0x8,%r12
jb     1256 <merge+0x156>
lea    (%rdi,%r9,4),%rbx
lea    (%rsi,%r10,4),%rbp
cmp    %rbp,%rbx
jae    11af <merge+0xaf>
lea    (%r10,%r9,1),%rbx
sub    %r11,%rbx
lea    (%rdi,%rbx,4),%rbx
lea    (%rsi,%r11,4),%rbp
cmp    %rbx,%rbp
jb     1256 <merge+0x156>
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    (%rsi,%r11,4),%rbp
add    $0x30,%rbp
lea    (%rdi,%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     1242 <merge+0x142>
lea    (%rbx,%r11,1),%rbp
add    %r9,%rbx
movups (%rsi,%rbp,4),%xmm0
movups 0x10(%rsi,%rbp,4),%xmm1
movups %xmm0,(%rdi,%rbx,4)
movups %xmm1,0x10(%rdi,%rbx,4)
mov    -0x8(%rsp),%rax
add    %rax,%r9
cmp    %rax,%r12
je     12eb <merge+0x1eb>
add    %rax,%r11
sub    %r11d,%edx
mov    %r11,%rbx
not    %rbx
add    %r10,%rbx
and    $0x3,%rdx
je     1286 <merge+0x186>
nopl   0x0(%rax,%rax,1)
mov    (%rsi,%r11,4),%ebp
add    $0x1,%r11
mov    %ebp,(%rdi,%r9,4)
add    $0x1,%r9
add    $0xffffffffffffffff,%rdx
jne    1270 <merge+0x170>
cmp    $0x3,%rbx
jb     12eb <merge+0x1eb>
sub    %r11,%r10
lea    (%rsi,%r11,4),%rsi
add    $0xc,%rsi
lea    (%rdi,%r9,4),%rbp
add    $0xc,%rbp
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    -0xc(%rsi,%rdx,4),%eax
mov    %eax,-0xc(%rbp,%rdx,4)
mov    -0x8(%rsi,%rdx,4),%eax
mov    %eax,-0x8(%rbp,%rdx,4)
mov    -0x4(%rsi,%rdx,4),%eax
mov    %eax,-0x4(%rbp,%rdx,4)
mov    (%rsi,%rdx,4),%eax
mov    %eax,0x0(%rbp,%rdx,4)
add    $0x4,%rdx
cmp    %rdx,%r10
jne    12b0 <merge+0x1b0>
add    %rdx,%r9
jmp    12eb <merge+0x1eb>
xor    %r15d,%r15d
xor    %r9d,%r9d
cmp    %edx,%ebx
jl     1171 <merge+0x71>
cmp    %r8d,%r15d
jge    1447 <merge+0x347>
mov    %r9d,%edx
movslq %r15d,%rsi
movslq %r8d,%r14
mov    %r14,%r11
sub    %rsi,%r11
cmp    $0x8,%r11
jb     13cf <merge+0x2cf>
lea    (%rdi,%rdx,4),%rax
lea    (%rcx,%r14,4),%rbp
cmp    %rbp,%rax
jae    1332 <merge+0x232>
lea    (%r14,%rdx,1),%rax
sub    %rsi,%rax
lea    (%rdi,%rax,4),%rax
lea    (%rcx,%rsi,4),%rbp
cmp    %rax,%rbp
jb     13cf <merge+0x2cf>
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    (%rcx,%rsi,4),%r15
add    $0x30,%r15
lea    (%rdi,%rdx,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     13c4 <merge+0x2c4>
lea    (%rbx,%rsi,1),%rax
add    %rdx,%rbx
movups (%rcx,%rax,4),%xmm0
movups 0x10(%rcx,%rax,4),%xmm1
movups %xmm0,(%rdi,%rbx,4)
movups %xmm1,0x10(%rdi,%rbx,4)
cmp    %r9,%r11
je     1447 <merge+0x347>
add    %r9,%rsi
add    %r9,%rdx
sub    %esi,%r8d
mov    %rsi,%rbx
not    %rbx
add    %r14,%rbx
and    $0x3,%r8
je     1404 <merge+0x304>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rcx,%rsi,4),%eax
add    $0x1,%rsi
mov    %eax,(%rdi,%rdx,4)
add    $0x1,%rdx
add    $0xffffffffffffffff,%r8
jne    13f0 <merge+0x2f0>
cmp    $0x3,%rbx
jb     1447 <merge+0x347>
sub    %rsi,%r14
lea    (%rcx,%rsi,4),%rax
add    $0xc,%rax
lea    (%rdi,%rdx,4),%rcx
add    $0xc,%rcx
xor    %edx,%edx
nop
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    1242 <merge+0x142>
xor    %ebx,%ebx
test   $0x1,%r10b
jne    13ab <merge+0x2ab>
jmp    13c4 <merge+0x2c4>

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* %13
store i32 0, i32* %12
store i32 0, i32* %11
br label %14
14: ; preds = %60, %5
%15 = load i32, i32* %11
%16 = load i32, i32* %8
%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* %10
%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 %61
24: ; preds = %22
%25 = load i32*, i32** %7
%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** %9
%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 %48
36: ; preds = %24
%37 = load i32*, i32** %7
%38 = load i32, i32* %11
%39 = add nsw i32 %38, 1
store i32 %39, i32* %11
%40 = sext i32 %38 to i64
%41 = getelementptr inbounds i32, i32* %37, i64 %40
%42 = load i32, i32* %41
%43 = load i32*, i32** %6
%44 = load i32, i32* %13
%45 = add nsw i32 %44, 1
store i32 %45, i32* %13
%46 = sext i32 %44 to i64
%47 = getelementptr inbounds i32, i32* %43, i64 %46
store i32 %42, i32* %47
br label %60
48: ; preds = %24
%49 = load i32*, i32** %9
%50 = load i32, i32* %12
%51 = add nsw i32 %50, 1
store i32 %51, i32* %12
%52 = sext i32 %50 to i64
%53 = getelementptr inbounds i32, i32* %49, i64 %52
%54 = load i32, i32* %53
%55 = load i32*, i32** %6
%56 = load i32, i32* %13
%57 = add nsw i32 %56, 1
store i32 %57, i32* %13
%58 = sext i32 %56 to i64
%59 = getelementptr inbounds i32, i32* %55, i64 %58
store i32 %54, i32* %59
br label %60
60: ; preds = %48, %36
br label %14
61: ; preds = %22
br label %62
62: ; preds = %66, %61
%63 = load i32, i32* %11
%64 = load i32, i32* %8
%65 = icmp slt i32 %63, %64
br i1 %65, label %66, label %78
66: ; preds = %62
%67 = load i32*, i32** %7
%68 = load i32, i32* %11
%69 = add nsw i32 %68, 1
store i32 %69, i32* %11
%70 = sext i32 %68 to i64
%71 = getelementptr inbounds i32, i32* %67, i64 %70
%72 = load i32, i32* %71
%73 = load i32*, i32** %6
%74 = load i32, i32* %13
%75 = add nsw i32 %74, 1
store i32 %75, i32* %13
%76 = sext i32 %74 to i64
%77 = getelementptr inbounds i32, i32* %73, i64 %76
store i32 %72, i32* %77
br label %62
78: ; preds = %62
br label %79
79: ; preds = %83, %78
%80 = load i32, i32* %12
%81 = load i32, i32* %10
%82 = icmp slt i32 %80, %81
br i1 %82, label %83, label %95
83: ; preds = %79
%84 = load i32*, i32** %9
%85 = load i32, i32* %12
%86 = add nsw i32 %85, 1
store i32 %86, i32* %12
%87 = sext i32 %85 to i64
%88 = getelementptr inbounds i32, i32* %84, i64 %87
%89 = load i32, i32* %88
%90 = load i32*, i32** %6
%91 = load i32, i32* %13
%92 = add nsw i32 %91, 1
store i32 %92, i32* %13
%93 = sext i32 %91 to i64
%94 = getelementptr inbounds i32, i32* %90, i64 %93
store i32 %89, i32* %94
br label %79
95: ; preds = %79
ret void
}

LLVM IR (-O2):
define void @merge(i32* nocapture writeonly %0, i32* nocapture %1, i32 %2, i32* nocapture %3, i32 %4) {
%6 = icmp sgt i32 %2, 0
%7 = icmp sgt i32 %4, 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, %2
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 %2 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* %0, i64 %17
%24 = add nsw i64 %19, %17
%25 = sub nsw i64 %24, %18
%26 = getelementptr i32, i32* %0, i64 %25
%27 = getelementptr i32, i32* %1, i64 %18
%28 = getelementptr i32, i32* %1, 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* %1, 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* %0, 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* %1, 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* %0, 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* %1, 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* %0, 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 [ %104, %100 ], [ %93, %92 ]
%102 = phi i64 [ %107, %100 ], [ %94, %92 ]
%103 = phi i64 [ %109, %100 ], [ 0, %92 ]
%104 = add nsw i64 %101, 1
%105 = getelementptr inbounds i32, i32* %1, i64 %101
%106 = load i32, i32* %105
%107 = add nuw nsw i64 %102, 1
%108 = getelementptr inbounds i32, i32* %0, i64 %102
store i32 %106, i32* %108
%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 ], [ %107, %100 ]
%113 = phi i64 [ %93, %92 ], [ %104, %100 ]
%114 = phi i64 [ %94, %92 ], [ %107, %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* %1, i64 %120
%122 = load i32, i32* %121
%123 = zext i32 %118 to i64
%124 = getelementptr inbounds i32, i32* %3, 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* %0, i64 %117
store i32 %127, i32* %133
%134 = add nuw i64 %117, 1
%135 = icmp slt i32 %130, %2
%136 = icmp slt i32 %132, %4
%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 ], [ %264, %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, %4
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 %4 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* %0, i64 %145
%152 = add nsw i64 %147, %145
%153 = sub nsw i64 %152, %146
%154 = getelementptr i32, i32* %0, i64 %153
%155 = getelementptr i32, i32* %3, i64 %146
%156 = getelementptr i32, i32* %3, 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* %3, 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* %0, 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* %3, 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* %0, 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* %3, 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* %0, 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 [ %232, %228 ], [ %221, %220 ]
%230 = phi i64 [ %235, %228 ], [ %222, %220 ]
%231 = phi i64 [ %237, %228 ], [ 0, %220 ]
%232 = add nsw i64 %229, 1
%233 = getelementptr inbounds i32, i32* %3, i64 %229
%234 = load i32, i32* %233
%235 = add nuw nsw i64 %230, 1
%236 = getelementptr inbounds i32, i32* %0, i64 %230
store i32 %234, i32* %236
%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 ], [ %232, %228 ]
%241 = phi i64 [ %222, %220 ], [ %235, %228 ]
%242 = icmp ult i64 %225, 3
br i1 %242, label %291, label %267
243: ; preds = %111, %243
%244 = phi i64 [ %261, %243 ], [ %113, %111 ]
%245 = phi i64 [ %264, %243 ], [ %114, %111 ]
%246 = add nsw i64 %244, 1
%247 = getelementptr inbounds i32, i32* %1, i64 %244
%248 = load i32, i32* %247
%249 = add nuw nsw i64 %245, 1
%250 = getelementptr inbounds i32, i32* %0, i64 %245
store i32 %248, i32* %250
%251 = add nsw i64 %244, 2
%252 = getelementptr inbounds i32, i32* %1, i64 %246
%253 = load i32, i32* %252
%254 = add nuw nsw i64 %245, 2
%255 = getelementptr inbounds i32, i32* %0, i64 %249
store i32 %253, i32* %255
%256 = add nsw i64 %244, 3
%257 = getelementptr inbounds i32, i32* %1, i64 %251
%258 = load i32, i32* %257
%259 = add nuw nsw i64 %245, 3
%260 = getelementptr inbounds i32, i32* %0, i64 %254
store i32 %258, i32* %260
%261 = add nsw i64 %244, 4
%262 = getelementptr inbounds i32, i32* %1, i64 %256
%263 = load i32, i32* %262
%264 = add nuw nsw i64 %245, 4
%265 = getelementptr inbounds i32, i32* %0, i64 %259
store i32 %263, i32* %265
%266 = icmp eq i64 %261, %19
br i1 %266, label %138, label %243
267: ; preds = %239, %267
%268 = phi i64 [ %285, %267 ], [ %240, %239 ]
%269 = phi i64 [ %288, %267 ], [ %241, %239 ]
%270 = add nsw i64 %268, 1
%271 = getelementptr inbounds i32, i32* %3, i64 %268
%272 = load i32, i32* %271
%273 = add nuw nsw i64 %269, 1
%274 = getelementptr inbounds i32, i32* %0, i64 %269
store i32 %272, i32* %274
%275 = add nsw i64 %268, 2
%276 = getelementptr inbounds i32, i32* %3, i64 %270
%277 = load i32, i32* %276
%278 = add nuw nsw i64 %269, 2
%279 = getelementptr inbounds i32, i32* %0, i64 %273
store i32 %277, i32* %279
%280 = add nsw i64 %268, 3
%281 = getelementptr inbounds i32, i32* %3, i64 %275
%282 = load i32, i32* %281
%283 = add nuw nsw i64 %269, 3
%284 = getelementptr inbounds i32, i32* %0, i64 %278
store i32 %282, i32* %284
%285 = add nsw i64 %268, 4
%286 = getelementptr inbounds i32, i32* %3, i64 %280
%287 = load i32, i32* %286
%288 = add nuw nsw i64 %269, 4
%289 = getelementptr inbounds i32, i32* %0, i64 %283
store i32 %287, i32* %289
%290 = icmp eq i64 %285, %147
br i1 %290, label %291, label %267
291: ; preds = %239, %267, %218, %141
ret void
}