unsigned long int merge(unsigned long int arr[], unsigned long int temp[],
                        unsigned long int left, unsigned long int mid,
                        unsigned long int right) {
  unsigned long int i, j, k;
  unsigned long int inv_count = 0;
  i = left;
  j = mid;
  k = left;
  while ((i <= mid - 1) && (j <= right)) {
    if (arr[i] <= arr[j]) {
      temp[k++] = arr[i++];
    } else {
      temp[k++] = arr[j++];
      inv_count = inv_count + (mid - i);
    }
  }
  while (i <= mid - 1)
    temp[k++] = arr[i++];
  while (j <= right)
    temp[k++] = arr[j++];
  for (i = left; i <= right; i++)
    arr[i] = temp[i];
  return inv_count;
}


x86 assembly (clang, -O0):
<merge>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movq   $0x0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x30(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x1,%rdx
xor    %eax,%eax
cmp    %rdx,%rcx
mov    %al,-0x49(%rbp)
ja     1160 <merge+0x60>
mov    -0x38(%rbp),%rax
cmp    -0x28(%rbp),%rax
setbe  %al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%al
test   $0x1,%al
jne    1170 <merge+0x70>
jmp    1207 <merge+0x107>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x8(%rbp),%rcx
mov    -0x38(%rbp),%rdx
cmp    (%rcx,%rdx,8),%rax
ja     11c1 <merge+0xc1>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %rdx,(%rax,%rcx,8)
jmp    1202 <merge+0x102>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %rdx,(%rax,%rcx,8)
mov    -0x48(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    -0x30(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
jmp    1138 <merge+0x38>
jmp    120c <merge+0x10c>
mov    -0x30(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
ja     1254 <merge+0x154>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %rdx,(%rax,%rcx,8)
jmp    120c <merge+0x10c>
jmp    1259 <merge+0x159>
mov    -0x38(%rbp),%rax
cmp    -0x28(%rbp),%rax
ja     129a <merge+0x19a>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %rdx,(%rax,%rcx,8)
jmp    1259 <merge+0x159>
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x28(%rbp),%rax
ja     12d9 <merge+0x1d9>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    12a2 <merge+0x1a2>
mov    -0x48(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<merge>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdx,%r11
lea    -0x1(%rcx),%r12
xor    %eax,%eax
cmp    %rdx,%r12
jb     1297 <merge+0x197>
mov    %r11,%rdx
mov    %rcx,%r9
mov    %r11,%r10
cmp    %r8,%rcx
ja     1176 <merge+0x76>
xor    %eax,%eax
mov    %r11,%r10
mov    %rcx,%r9
mov    %r11,%rdx
cs nopw 0x0(%rax,%rax,1)
nop
mov    (%rdi,%rdx,8),%rbp
mov    (%rdi,%r9,8),%rbx
cmp    %rbx,%rbp
jbe    1160 <merge+0x60>
add    $0x1,%r9
mov    %rcx,%rbp
sub    %rdx,%rbp
add    %rbp,%rax
mov    %rbx,%rbp
jmp    1164 <merge+0x64>
nop
add    $0x1,%rdx
mov    %rbp,(%rsi,%r10,8)
add    $0x1,%r10
cmp    %r12,%rdx
ja     1176 <merge+0x76>
cmp    %r8,%r9
jbe    1140 <merge+0x40>
cmp    %r12,%rdx
ja     12a9 <merge+0x1a9>
lea    0x1(%rdx),%rbp
cmp    %rbp,%rcx
mov    %rbp,%r14
cmova  %rcx,%r14
sub    %rdx,%r14
cmp    $0x4,%r14
jb     1280 <merge+0x180>
cmp    %rbp,%rcx
cmova  %rcx,%rbp
lea    (%rsi,%r10,8),%rcx
lea    (%rdi,%rbp,8),%rbx
cmp    %rbx,%rcx
jae    11c5 <merge+0xc5>
add    %r10,%rbp
sub    %rdx,%rbp
lea    (%rsi,%rbp,8),%rcx
lea    (%rdi,%rdx,8),%rbx
cmp    %rcx,%rbx
jb     1280 <merge+0x180>
mov    %r14,%rbp
and    $0xfffffffffffffffc,%rbp
lea    -0x4(%rbp),%rcx
mov    %rcx,%rbx
shr    $0x2,%rbx
add    $0x1,%rbx
test   %rcx,%rcx
mov    %rbp,-0x8(%rsp)
je     152c <merge+0x42c>
mov    %rbx,%r13
and    $0xfffffffffffffffe,%r13
lea    (%rsi,%r10,8),%rbp
add    $0x30,%rbp
lea    (%rdi,%rdx,8),%r15
add    $0x30,%r15
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups -0x30(%r15,%rcx,8),%xmm0
movups -0x20(%r15,%rcx,8),%xmm1
movups %xmm0,-0x30(%rbp,%rcx,8)
movups %xmm1,-0x20(%rbp,%rcx,8)
movups -0x10(%r15,%rcx,8),%xmm0
movups (%r15,%rcx,8),%xmm1
movups %xmm0,-0x10(%rbp,%rcx,8)
movups %xmm1,0x0(%rbp,%rcx,8)
add    $0x8,%rcx
add    $0xfffffffffffffffe,%r13
jne    1210 <merge+0x110>
test   $0x1,%bl
je     1263 <merge+0x163>
lea    (%r10,%rcx,1),%rbx
add    %rdx,%rcx
movups (%rdi,%rcx,8),%xmm0
movups 0x10(%rdi,%rcx,8),%xmm1
movups %xmm0,(%rsi,%rbx,8)
movups %xmm1,0x10(%rsi,%rbx,8)
mov    -0x8(%rsp),%rcx
add    %rcx,%r10
cmp    %rcx,%r14
je     12a9 <merge+0x1a9>
add    %rcx,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%rdi,%rdx,8),%rcx
add    $0x1,%rdx
mov    %rcx,(%rsi,%r10,8)
add    $0x1,%r10
cmp    %r12,%rdx
jbe    1280 <merge+0x180>
jmp    12a9 <merge+0x1a9>
mov    %r11,%rdx
mov    %rcx,%r9
mov    %r11,%r10
cmp    %r12,%rdx
jbe    117f <merge+0x7f>
cmp    %r8,%r9
ja     13c4 <merge+0x2c4>
lea    0x1(%r9),%rbp
lea    0x1(%r8),%rcx
cmp    %rcx,%rbp
mov    %rcx,%r15
cmova  %rbp,%r15
sub    %r9,%r15
cmp    $0x4,%r15
jb     139f <merge+0x29f>
cmp    %rcx,%rbp
cmova  %rbp,%rcx
lea    (%rsi,%r10,8),%rdx
lea    (%rdi,%rcx,8),%rbx
cmp    %rbx,%rdx
jae    12fc <merge+0x1fc>
add    %r10,%rcx
sub    %r9,%rcx
lea    (%rsi,%rcx,8),%rcx
lea    (%rdi,%r9,8),%rdx
cmp    %rcx,%rdx
jb     139f <merge+0x29f>
mov    %r15,%rdx
and    $0xfffffffffffffffc,%rdx
lea    -0x4(%rdx),%rcx
mov    %rcx,%r14
shr    $0x2,%r14
add    $0x1,%r14
test   %rcx,%rcx
je     153c <merge+0x43c>
mov    %r14,%rcx
and    $0xfffffffffffffffe,%rcx
lea    (%rsi,%r10,8),%r12
add    $0x30,%r12
lea    (%rdi,%r9,8),%rbp
add    $0x30,%rbp
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups -0x30(%rbp,%rbx,8),%xmm0
movups -0x20(%rbp,%rbx,8),%xmm1
movups %xmm0,-0x30(%r12,%rbx,8)
movups %xmm1,-0x20(%r12,%rbx,8)
movups -0x10(%rbp,%rbx,8),%xmm0
movups 0x0(%rbp,%rbx,8),%xmm1
movups %xmm0,-0x10(%r12,%rbx,8)
movups %xmm1,(%r12,%rbx,8)
add    $0x8,%rbx
add    $0xfffffffffffffffe,%rcx
jne    1340 <merge+0x240>
test   $0x1,%r14b
je     1394 <merge+0x294>
lea    (%r10,%rbx,1),%rcx
add    %r9,%rbx
movups (%rdi,%rbx,8),%xmm0
movups 0x10(%rdi,%rbx,8),%xmm1
movups %xmm0,(%rsi,%rcx,8)
movups %xmm1,0x10(%rsi,%rcx,8)
cmp    %rdx,%r15
je     13c4 <merge+0x2c4>
add    %rdx,%r10
add    %rdx,%r9
lea    (%rsi,%r10,8),%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%rdi,%r9,8),%rdx
add    $0x1,%r9
mov    %rdx,(%rcx)
add    $0x8,%rcx
cmp    %r8,%r9
jbe    13b0 <merge+0x2b0>
cmp    %r8,%r11
ja     1521 <merge+0x421>
lea    0x1(%r8),%rbp
lea    0x1(%r11),%rcx
cmp    %rcx,%rbp
mov    %rcx,%r10
cmova  %rbp,%r10
sub    %r11,%r10
cmp    $0x4,%r10
jb     1510 <merge+0x410>
cmp    %rcx,%rbp
cmova  %rbp,%rcx
lea    (%rdi,%r11,8),%rdx
lea    (%rsi,%rcx,8),%rbp
cmp    %rbp,%rdx
jae    1411 <merge+0x311>
lea    (%rdi,%rcx,8),%rcx
lea    (%rsi,%r11,8),%rdx
cmp    %rcx,%rdx
jb     1510 <merge+0x410>
mov    %r10,%r9
and    $0xfffffffffffffffc,%r9
lea    -0x4(%r9),%rcx
mov    %rcx,%r14
shr    $0x2,%r14
add    $0x1,%r14
mov    %r14d,%edx
and    $0x3,%edx
cmp    $0xc,%rcx
jae    143a <merge+0x33a>
xor    %ecx,%ecx
jmp    14c0 <merge+0x3c0>
movabs $0x7ffffffffffffffe,%rcx
ff ff 7f
add    $0xfffffffffffffffe,%rcx
and    %rcx,%r14
lea    (%rdi,%r11,8),%r15
add    $0x70,%r15
lea    (%rsi,%r11,8),%rbx
add    $0x70,%rbx
xor    %ecx,%ecx
nopl   (%rax)
movups -0x70(%rbx,%rcx,8),%xmm0
movups -0x60(%rbx,%rcx,8),%xmm1
movups %xmm0,-0x70(%r15,%rcx,8)
movups %xmm1,-0x60(%r15,%rcx,8)
movups -0x50(%rbx,%rcx,8),%xmm0
movups -0x40(%rbx,%rcx,8),%xmm1
movups %xmm0,-0x50(%r15,%rcx,8)
movups %xmm1,-0x40(%r15,%rcx,8)
movups -0x30(%rbx,%rcx,8),%xmm0
movups -0x20(%rbx,%rcx,8),%xmm1
movups %xmm0,-0x30(%r15,%rcx,8)
movups %xmm1,-0x20(%r15,%rcx,8)
movups -0x10(%rbx,%rcx,8),%xmm0
movups (%rbx,%rcx,8),%xmm1
movups %xmm0,-0x10(%r15,%rcx,8)
movups %xmm1,(%r15,%rcx,8)
add    $0x10,%rcx
add    $0xfffffffffffffffc,%r14
jne    1460 <merge+0x360>
test   %rdx,%rdx
je     14fb <merge+0x3fb>
add    %r11,%rcx
lea    (%rdi,%rcx,8),%rbx
add    $0x10,%rbx
lea    (%rsi,%rcx,8),%rcx
add    $0x10,%rcx
shl    $0x5,%rdx
xor    %ebp,%ebp
xchg   %ax,%ax
movups -0x10(%rcx,%rbp,1),%xmm0
movups (%rcx,%rbp,1),%xmm1
movups %xmm0,-0x10(%rbx,%rbp,1)
movups %xmm1,(%rbx,%rbp,1)
add    $0x20,%rbp
cmp    %rbp,%rdx
jne    14e0 <merge+0x3e0>
cmp    %r9,%r10
je     1521 <merge+0x421>
add    %r9,%r11
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%rsi,%r11,8),%rcx
mov    %rcx,(%rdi,%r11,8)
add    $0x1,%r11
cmp    %r8,%r11
jbe    1510 <merge+0x410>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ecx,%ecx
test   $0x1,%bl
jne    124a <merge+0x14a>
jmp    1263 <merge+0x163>
xor    %ebx,%ebx
test   $0x1,%r14b
jne    137b <merge+0x27b>
jmp    1394 <merge+0x294>

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

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