void merge(int A[], int start, int end) {
  int l, r, val, i, j, k, reml, remr, temp;
  reml = (start + end) / 2 - start + 1;
  remr = end - start + 1 - reml;
  val = start;
  l = start;
  r = (start + end) / 2 + 1;
  while (reml > 0 && remr > 0) {
    if (A[l] < A[r]) {
      A[val++] = A[l++];
      reml--;
    } else {
      temp = A[r];
      remr--;
      for (j = r - 1; j >= l; j--)
        A[j + 1] = A[j];
      l++;
      r++;
      A[val++] = temp;
    }
  }
  while (reml > 0) {
    A[val++] = A[l++];
    reml--;
  }
  while (remr > 0) {
    A[val++] = A[r++];
    remr--;
  }
  return;
}


x86 assembly (clang, -O0):
<merge>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
sub    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%eax
sub    -0xc(%rbp),%eax
add    $0x1,%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x2c(%rbp)
mov    %al,-0x35(%rbp)
jle    116d <merge+0x6d>
cmpl   $0x0,-0x30(%rbp)
setg   %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    117d <merge+0x7d>
jmp    1255 <merge+0x155>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x18(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jge    11d1 <merge+0xd1>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x2c(%rbp)
jmp    1250 <merge+0x150>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     1226 <merge+0x126>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    11f1 <merge+0xf1>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x34(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1154 <merge+0x54>
jmp    125a <merge+0x15a>
cmpl   $0x0,-0x2c(%rbp)
jle    129c <merge+0x19c>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x2c(%rbp)
jmp    125a <merge+0x15a>
jmp    12a1 <merge+0x1a1>
cmpl   $0x0,-0x30(%rbp)
jle    12e3 <merge+0x1e3>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x18(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
jmp    12a1 <merge+0x1a1>
pop    %rbp
ret

x86 assembly (clang, -O2):
<merge>:
push   %r14
push   %rbx
lea    (%rdx,%rsi,1),%eax
mov    %eax,%r11d
shr    $0x1f,%r11d
add    %eax,%r11d
sar    %r11d
mov    %r11d,%r14d
sub    %esi,%r14d
add    $0x1,%r14d
sub    %r11d,%edx
add    $0x1,%r11d
test   %r14d,%r14d
jle    118a <merge+0x8a>
test   %edx,%edx
jle    118a <merge+0x8a>
movslq %esi,%rsi
movslq %r11d,%rax
mov    (%rdi,%rax,4),%ebx
cmp    %ebx,(%rdi,%rsi,4)
jge    1150 <merge+0x50>
add    $0xffffffff,%r14d
jmp    117d <merge+0x7d>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmp    %rax,%rsi
jge    1173 <merge+0x73>
cs nopw 0x0(%rax,%rax,1)
nop
mov    -0x4(%rdi,%rax,4),%ecx
mov    %ecx,(%rdi,%rax,4)
lea    -0x1(%rax),%rcx
mov    %rcx,%rax
cmp    %rsi,%rcx
jg     1160 <merge+0x60>
add    $0xffffffff,%edx
add    $0x1,%r11d
mov    %ebx,(%rdi,%rsi,4)
add    $0x1,%rsi
test   %r14d,%r14d
jle    118a <merge+0x8a>
test   %edx,%edx
jg     1130 <merge+0x30>
test   %r14d,%r14d
jle    1208 <merge+0x108>
movslq %esi,%rsi
lea    -0x1(%r14),%r8d
cmp    $0x7,%r8d
jb     11e9 <merge+0xe9>
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffff8,%r9
lea    -0x8(%r9),%rax
mov    %rax,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rax,%rax
je     11da <merge+0xda>
mov    %r10,%rax
and    $0xfffffffffffffffe,%rax
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x10,%rbx
add    $0xfffffffffffffffe,%rax
jne    11d0 <merge+0xd0>
add    %r9,%rsi
test   $0x1,%r10b
cmp    %r9,%r8
je     1208 <merge+0x108>
sub    %r9d,%r14d
add    $0x1,%r14d
mov    %rsi,%rbx
mov    (%rdi,%rbx,4),%eax
add    $0x1,%rbx
mov    %eax,(%rdi,%rsi,4)
add    $0x1,%rsi
add    $0xffffffff,%r14d
cmp    $0x1,%r14d
ja     11f0 <merge+0xf0>
test   %edx,%edx
jle    1304 <merge+0x204>
movslq %r11d,%r11
movslq %esi,%r14
lea    -0x1(%rdx),%r10d
cmp    $0x7,%r10d
jb     12ed <merge+0x1ed>
lea    (%rdi,%r14,4),%rax
lea    (%r11,%r10,1),%rcx
lea    (%rdi,%rcx,4),%rcx
add    $0x4,%rcx
cmp    %rcx,%rax
jae    1252 <merge+0x152>
lea    (%r14,%r10,1),%rax
lea    (%rdi,%rax,4),%rax
add    $0x4,%rax
lea    (%rdi,%r11,4),%rcx
cmp    %rax,%rcx
jb     12ed <merge+0x1ed>
add    $0x1,%r10
mov    %r10,%r8
and    $0xfffffffffffffff8,%r8
lea    -0x8(%r8),%rax
mov    %rax,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rax,%rax
je     1308 <merge+0x208>
mov    %r9,%rax
and    $0xfffffffffffffffe,%rax
lea    (%rdi,%r14,4),%rbx
add    $0x30,%rbx
lea    (%rdi,%r11,4),%rcx
add    $0x30,%rcx
xor    %esi,%esi
xchg   %ax,%ax
movups -0x30(%rcx,%rsi,4),%xmm0
movups -0x20(%rcx,%rsi,4),%xmm1
movups %xmm0,-0x30(%rbx,%rsi,4)
movups %xmm1,-0x20(%rbx,%rsi,4)
movups -0x10(%rcx,%rsi,4),%xmm0
movups (%rcx,%rsi,4),%xmm1
movups %xmm0,-0x10(%rbx,%rsi,4)
movups %xmm1,(%rbx,%rsi,4)
add    $0x10,%rsi
add    $0xfffffffffffffffe,%rax
jne    1290 <merge+0x190>
test   $0x1,%r9b
je     12df <merge+0x1df>
lea    (%rsi,%r14,1),%rax
add    %r11,%rsi
movups (%rdi,%rsi,4),%xmm0
movups 0x10(%rdi,%rsi,4),%xmm1
movups %xmm0,(%rdi,%rax,4)
movups %xmm1,0x10(%rdi,%rax,4)
cmp    %r8,%r10
je     1304 <merge+0x204>
add    %r8,%r14
add    %r8,%r11
sub    %r8d,%edx
add    $0x1,%edx
mov    (%rdi,%r11,4),%eax
mov    %eax,(%rdi,%r14,4)
add    $0x4,%rdi
add    $0xffffffff,%edx
cmp    $0x1,%edx
ja     12f0 <merge+0x1f0>
pop    %rbx
pop    %r14
ret
xor    %esi,%esi
test   $0x1,%r9b
jne    12c6 <merge+0x1c6>
jmp    12df <merge+0x1df>

LLVM IR (-O0):
define void @merge(i32* %0, i32 %1, i32 %2) {
%4 = alloca i32*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
store i32* %0, i32** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%16 = load i32, i32* %5
%17 = load i32, i32* %6
%18 = add nsw i32 %16, %17
%19 = sdiv i32 %18, 2
%20 = load i32, i32* %5
%21 = sub nsw i32 %19, %20
%22 = add nsw i32 %21, 1
store i32 %22, i32* %13
%23 = load i32, i32* %6
%24 = load i32, i32* %5
%25 = sub nsw i32 %23, %24
%26 = add nsw i32 %25, 1
%27 = load i32, i32* %13
%28 = sub nsw i32 %26, %27
store i32 %28, i32* %14
%29 = load i32, i32* %5
store i32 %29, i32* %9
%30 = load i32, i32* %5
store i32 %30, i32* %7
%31 = load i32, i32* %5
%32 = load i32, i32* %6
%33 = add nsw i32 %31, %32
%34 = sdiv i32 %33, 2
%35 = add nsw i32 %34, 1
store i32 %35, i32* %8
br label %36
36: ; preds = %109, %3
%37 = load i32, i32* %13
%38 = icmp sgt i32 %37, 0
br i1 %38, label %39, label %42
39: ; preds = %36
%40 = load i32, i32* %14
%41 = icmp sgt i32 %40, 0
br label %42
42: ; preds = %39, %36
%43 = phi i1 [ false, %36 ], [ %41, %39 ]
br i1 %43, label %44, label %110
44: ; preds = %42
%45 = load i32*, i32** %4
%46 = load i32, i32* %7
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i32, i32* %45, i64 %47
%49 = load i32, i32* %48
%50 = load i32*, i32** %4
%51 = load i32, i32* %8
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i32, i32* %50, i64 %52
%54 = load i32, i32* %53
%55 = icmp slt i32 %49, %54
br i1 %55, label %56, label %70
56: ; preds = %44
%57 = load i32*, i32** %4
%58 = load i32, i32* %7
%59 = add nsw i32 %58, 1
store i32 %59, i32* %7
%60 = sext i32 %58 to i64
%61 = getelementptr inbounds i32, i32* %57, i64 %60
%62 = load i32, i32* %61
%63 = load i32*, i32** %4
%64 = load i32, i32* %9
%65 = add nsw i32 %64, 1
store i32 %65, i32* %9
%66 = sext i32 %64 to i64
%67 = getelementptr inbounds i32, i32* %63, i64 %66
store i32 %62, i32* %67
%68 = load i32, i32* %13
%69 = add nsw i32 %68, -1
store i32 %69, i32* %13
br label %109
70: ; preds = %44
%71 = load i32*, i32** %4
%72 = load i32, i32* %8
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds i32, i32* %71, i64 %73
%75 = load i32, i32* %74
store i32 %75, i32* %15
%76 = load i32, i32* %14
%77 = add nsw i32 %76, -1
store i32 %77, i32* %14
%78 = load i32, i32* %8
%79 = sub nsw i32 %78, 1
store i32 %79, i32* %11
br label %80
80: ; preds = %95, %70
%81 = load i32, i32* %11
%82 = load i32, i32* %7
%83 = icmp sge i32 %81, %82
br i1 %83, label %84, label %98
84: ; preds = %80
%85 = load i32*, i32** %4
%86 = load i32, i32* %11
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds i32, i32* %85, i64 %87
%89 = load i32, i32* %88
%90 = load i32*, i32** %4
%91 = load i32, i32* %11
%92 = add nsw i32 %91, 1
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i32, i32* %90, i64 %93
store i32 %89, i32* %94
br label %95
95: ; preds = %84
%96 = load i32, i32* %11
%97 = add nsw i32 %96, -1
store i32 %97, i32* %11
br label %80
98: ; preds = %80
%99 = load i32, i32* %7
%100 = add nsw i32 %99, 1
store i32 %100, i32* %7
%101 = load i32, i32* %8
%102 = add nsw i32 %101, 1
store i32 %102, i32* %8
%103 = load i32, i32* %15
%104 = load i32*, i32** %4
%105 = load i32, i32* %9
%106 = add nsw i32 %105, 1
store i32 %106, i32* %9
%107 = sext i32 %105 to i64
%108 = getelementptr inbounds i32, i32* %104, i64 %107
store i32 %103, i32* %108
br label %109
109: ; preds = %98, %56
br label %36
110: ; preds = %42
br label %111
111: ; preds = %114, %110
%112 = load i32, i32* %13
%113 = icmp sgt i32 %112, 0
br i1 %113, label %114, label %128
114: ; preds = %111
%115 = load i32*, i32** %4
%116 = load i32, i32* %7
%117 = add nsw i32 %116, 1
store i32 %117, i32* %7
%118 = sext i32 %116 to i64
%119 = getelementptr inbounds i32, i32* %115, i64 %118
%120 = load i32, i32* %119
%121 = load i32*, i32** %4
%122 = load i32, i32* %9
%123 = add nsw i32 %122, 1
store i32 %123, i32* %9
%124 = sext i32 %122 to i64
%125 = getelementptr inbounds i32, i32* %121, i64 %124
store i32 %120, i32* %125
%126 = load i32, i32* %13
%127 = add nsw i32 %126, -1
store i32 %127, i32* %13
br label %111
128: ; preds = %111
br label %129
129: ; preds = %132, %128
%130 = load i32, i32* %14
%131 = icmp sgt i32 %130, 0
br i1 %131, label %132, label %146
132: ; preds = %129
%133 = load i32*, i32** %4
%134 = load i32, i32* %8
%135 = add nsw i32 %134, 1
store i32 %135, i32* %8
%136 = sext i32 %134 to i64
%137 = getelementptr inbounds i32, i32* %133, i64 %136
%138 = load i32, i32* %137
%139 = load i32*, i32** %4
%140 = load i32, i32* %9
%141 = add nsw i32 %140, 1
store i32 %141, i32* %9
%142 = sext i32 %140 to i64
%143 = getelementptr inbounds i32, i32* %139, i64 %142
store i32 %138, i32* %143
%144 = load i32, i32* %14
%145 = add nsw i32 %144, -1
store i32 %145, i32* %14
br label %129
146: ; preds = %129
ret void
}

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