void compose(long *w, const long *u, long k, const long *v, long n) {
  register long i = 0;
  if (k < n) {
    for (; i < n; i++, w++, v++)
      *w = (*v < k) ? u[*v] : *v;
  } else {
    for (; i < n; i++, w++, v++)
      *w = u[*v];
    for (; i < k; i++, w++)
      *w = u[i];
  }
}


x86 assembly (clang, -O0):
<compose>:
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,-0x30(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x28(%rbp),%rax
jge    11ae <compose+0xae>
jmp    1133 <compose+0x33>
mov    -0x30(%rbp),%rax
cmp    -0x28(%rbp),%rax
jge    11a9 <compose+0xa9>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
cmp    -0x18(%rbp),%rax
jge    116a <compose+0x6a>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x38(%rbp)
jmp    1175 <compose+0x75>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
jmp    1133 <compose+0x33>
jmp    1248 <compose+0x148>
jmp    11b3 <compose+0xb3>
mov    -0x30(%rbp),%rax
cmp    -0x28(%rbp),%rax
jge    1200 <compose+0x100>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
jmp    11b3 <compose+0xb3>
jmp    1205 <compose+0x105>
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    1243 <compose+0x143>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x8(%rbp)
jmp    1205 <compose+0x105>
jmp    1248 <compose+0x148>
pop    %rbp
ret

x86 assembly (clang, -O2):
<compose>:
push   %rbx
cmp    %r8,%rdx
jge    1167 <compose+0x67>
test   %r8,%r8
jle    13f7 <compose+0x2f7>
cmp    $0x1,%r8
je     1278 <compose+0x178>
mov    %r8,%r9
and    $0xfffffffffffffffe,%r9
xor    %r10d,%r10d
xor    %eax,%eax
jmp    1146 <compose+0x46>
nopw   0x0(%rax,%rax,1)
mov    %rbx,0x8(%rdi,%rax,8)
add    $0x2,%rax
add    $0xfffffffffffffff0,%r10
cmp    %rax,%r9
je     1272 <compose+0x172>
mov    (%rcx,%rax,8),%rbx
cmp    %rdx,%rbx
jge    1153 <compose+0x53>
mov    (%rsi,%rbx,8),%rbx
mov    %rbx,(%rdi,%rax,8)
mov    0x8(%rcx,%rax,8),%rbx
cmp    %rdx,%rbx
jge    1130 <compose+0x30>
mov    (%rsi,%rbx,8),%rbx
jmp    1130 <compose+0x30>
test   %r8,%r8
jle    1212 <compose+0x112>
lea    -0x1(%r8),%rax
mov    %r8d,%r9d
and    $0x3,%r9d
cmp    $0x3,%rax
jb     11d9 <compose+0xd9>
mov    %r8,%r10
and    $0xfffffffffffffffc,%r10
xor    %r11d,%r11d
xor    %ebx,%ebx
nopl   (%rax)
mov    (%rcx,%rbx,8),%rax
mov    (%rsi,%rax,8),%rax
mov    %rax,(%rdi,%rbx,8)
mov    0x8(%rcx,%rbx,8),%rax
mov    (%rsi,%rax,8),%rax
mov    %rax,0x8(%rdi,%rbx,8)
mov    0x10(%rcx,%rbx,8),%rax
mov    (%rsi,%rax,8),%rax
mov    %rax,0x10(%rdi,%rbx,8)
mov    0x18(%rcx,%rbx,8),%rax
mov    (%rsi,%rax,8),%rax
mov    %rax,0x18(%rdi,%rbx,8)
add    $0x4,%rbx
add    $0xffffffffffffffe0,%r11
cmp    %rbx,%r10
jne    1190 <compose+0x90>
sub    %r11,%rdi
sub    %r11,%rcx
test   %r9,%r9
je     1208 <compose+0x108>
shl    $0x3,%r9
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    (%rcx,%rax,1),%rbx
mov    (%rsi,%rbx,8),%rbx
mov    %rbx,(%rdi,%rax,1)
add    $0x8,%rax
cmp    %rax,%r9
jne    11f0 <compose+0xf0>
add    %rax,%rdi
cmp    %rdx,%r8
jl     121e <compose+0x11e>
jmp    13f7 <compose+0x2f7>
xor    %r8d,%r8d
cmp    %rdx,%r8
jge    13f7 <compose+0x2f7>
mov    %rdx,%r10
sub    %r8,%r10
cmp    $0x4,%r10
jb     135b <compose+0x25b>
lea    (%rsi,%rdx,8),%rax
cmp    %rax,%rdi
jae    1248 <compose+0x148>
lea    (%rdi,%r10,8),%rax
lea    (%rsi,%r8,8),%rcx
cmp    %rax,%rcx
jb     135b <compose+0x25b>
mov    %r10,%r9
and    $0xfffffffffffffffc,%r9
lea    -0x4(%r9),%rax
mov    %rax,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %ecx,%r11d
and    $0x3,%r11d
cmp    $0xc,%rax
jae    1293 <compose+0x193>
xor    %eax,%eax
jmp    1308 <compose+0x208>
sub    %r10,%rdi
sub    %r10,%rcx
test   $0x1,%r8b
je     13f7 <compose+0x2f7>
mov    (%rcx),%rax
cmp    %rdx,%rax
jge    128e <compose+0x18e>
mov    (%rsi,%rax,8),%rax
mov    %rax,(%rdi)
pop    %rbx
ret
and    $0xfffffffffffffffc,%rcx
lea    (%rsi,%r8,8),%rbx
add    $0x70,%rbx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movups -0x70(%rbx,%rax,8),%xmm0
movups -0x60(%rbx,%rax,8),%xmm1
movups %xmm0,(%rdi,%rax,8)
movups %xmm1,0x10(%rdi,%rax,8)
movups -0x50(%rbx,%rax,8),%xmm0
movups -0x40(%rbx,%rax,8),%xmm1
movups %xmm0,0x20(%rdi,%rax,8)
movups %xmm1,0x30(%rdi,%rax,8)
movups -0x30(%rbx,%rax,8),%xmm0
movups -0x20(%rbx,%rax,8),%xmm1
movups %xmm0,0x40(%rdi,%rax,8)
movups %xmm1,0x50(%rdi,%rax,8)
movups -0x10(%rbx,%rax,8),%xmm0
movups (%rbx,%rax,8),%xmm1
movups %xmm0,0x60(%rdi,%rax,8)
movups %xmm1,0x70(%rdi,%rax,8)
add    $0x10,%rax
add    $0xfffffffffffffffc,%rcx
jne    12b0 <compose+0x1b0>
test   %r11,%r11
je     134b <compose+0x24b>
lea    (%rdi,%rax,8),%rcx
add    $0x10,%rcx
add    %r8,%rax
lea    (%rsi,%rax,8),%rax
add    $0x10,%rax
shl    $0x5,%r11
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
movups -0x10(%rax,%rbx,1),%xmm0
movups (%rax,%rbx,1),%xmm1
movups %xmm0,-0x10(%rcx,%rbx,1)
movups %xmm1,(%rcx,%rbx,1)
add    $0x20,%rbx
cmp    %rbx,%r11
jne    1330 <compose+0x230>
cmp    %r9,%r10
je     13f7 <compose+0x2f7>
add    %r9,%r8
lea    (%rdi,%r9,8),%rdi
mov    %edx,%ecx
sub    %r8d,%ecx
mov    %r8,%rax
not    %rax
add    %rdx,%rax
and    $0x7,%rcx
je     1385 <compose+0x285>
nop
mov    (%rsi,%r8,8),%rbx
mov    %rbx,(%rdi)
add    $0x1,%r8
add    $0x8,%rdi
add    $0xffffffffffffffff,%rcx
jne    1370 <compose+0x270>
cmp    $0x7,%rax
jb     13f7 <compose+0x2f7>
sub    %r8,%rdx
lea    (%rsi,%r8,8),%rax
add    $0x38,%rax
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
mov    -0x38(%rax,%rcx,8),%rsi
mov    %rsi,(%rdi,%rcx,8)
mov    -0x30(%rax,%rcx,8),%rsi
mov    %rsi,0x8(%rdi,%rcx,8)
mov    -0x28(%rax,%rcx,8),%rsi
mov    %rsi,0x10(%rdi,%rcx,8)
mov    -0x20(%rax,%rcx,8),%rsi
mov    %rsi,0x18(%rdi,%rcx,8)
mov    -0x18(%rax,%rcx,8),%rsi
mov    %rsi,0x20(%rdi,%rcx,8)
mov    -0x10(%rax,%rcx,8),%rsi
mov    %rsi,0x28(%rdi,%rcx,8)
mov    -0x8(%rax,%rcx,8),%rsi
mov    %rsi,0x30(%rdi,%rcx,8)
mov    (%rax,%rcx,8),%rsi
mov    %rsi,0x38(%rdi,%rcx,8)
add    $0x8,%rcx
cmp    %rcx,%rdx
jne    13a0 <compose+0x2a0>
pop    %rbx
ret

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

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