void CCFD_Px(double *ph, double *pH, int l, int l0) {
  int i, i0;
  if (l0 == l) {
    for (i = 0; i < l; i++)
      ph[i] = pH[i];
    return;
  }
  for (i0 = 0; i0 < l0 - 1; i0++) {
    i = i0 + i0;
    ph[i] = pH[i0];
    ph[i + 1] = pH[i0];
  }
  i = i0 + i0;
  ph[i] = pH[l0 - 1];
  if (i < l - 1)
    ph[i + 1] = pH[l0 - 1];
}


x86 assembly (clang, -O0):
<CCFD_Px>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    115e <CCFD_Px+0x5e>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1159 <CCFD_Px+0x59>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1125 <CCFD_Px+0x25>
jmp    1223 <CCFD_Px+0x123>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11c6 <CCFD_Px+0xc6>
mov    -0x20(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1165 <CCFD_Px+0x65>
mov    -0x20(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1223 <CCFD_Px+0x123>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
pop    %rbp
ret

x86 assembly (clang, -O2):
<CCFD_Px>:
push   %rbx
cmp    %edx,%ecx
jne    11ac <CCFD_Px+0xac>
test   %ecx,%ecx
jle    1414 <CCFD_Px+0x314>
mov    %ecx,%r9d
cmp    $0x4,%ecx
jb     1133 <CCFD_Px+0x33>
lea    (%rsi,%r9,8),%rax
cmp    %rdi,%rax
jbe    126b <CCFD_Px+0x16b>
lea    (%rdi,%r9,8),%rax
cmp    %rsi,%rax
jbe    126b <CCFD_Px+0x16b>
xor    %ecx,%ecx
mov    %rcx,%rax
not    %rax
add    %r9,%rax
mov    %r9,%rdx
and    $0x3,%rdx
je     1164 <CCFD_Px+0x64>
nopw   0x0(%rax,%rax,1)
movsd  (%rsi,%rcx,8),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
add    $0x1,%rcx
add    $0xffffffffffffffff,%rdx
jne    1150 <CCFD_Px+0x50>
cmp    $0x3,%rax
jb     1414 <CCFD_Px+0x314>
xchg   %ax,%ax
movsd  (%rsi,%rcx,8),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
movsd  0x8(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x8(%rdi,%rcx,8)
movsd  0x10(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x10(%rdi,%rcx,8)
movsd  0x18(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x18(%rdi,%rcx,8)
add    $0x4,%rcx
cmp    %rcx,%r9
jne    1170 <CCFD_Px+0x70>
jmp    1414 <CCFD_Px+0x314>
lea    -0x1(%rcx),%r8d
xor    %eax,%eax
cmp    $0x2,%ecx
jl     1335 <CCFD_Px+0x235>
mov    %r8d,%r9d
cmp    $0x2,%r8d
jb     11e4 <CCFD_Px+0xe4>
lea    (%rsi,%r9,8),%rax
cmp    %rdi,%rax
jbe    1298 <CCFD_Px+0x198>
mov    %r9,%rax
shl    $0x4,%rax
add    %rdi,%rax
cmp    %rsi,%rax
jbe    1298 <CCFD_Px+0x198>
xor    %ecx,%ecx
mov    %rcx,%rax
not    %rax
test   $0x1,%r9b
je     1212 <CCFD_Px+0x112>
movsd  (%rsi,%rcx,8),%xmm0
mov    %rcx,%rbx
shl    $0x4,%rbx
movsd  %xmm0,(%rdi,%rbx,1)
movsd  (%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x8(%rdi,%rbx,1)
or     $0x1,%rcx
add    %r9,%rax
je     1331 <CCFD_Px+0x231>
mov    %rcx,%rax
shl    $0x4,%rax
add    %rdi,%rax
add    $0x18,%rax
nopl   0x0(%rax)
movsd  (%rsi,%rcx,8),%xmm0
movsd  %xmm0,-0x18(%rax)
movsd  (%rsi,%rcx,8),%xmm0
movsd  %xmm0,-0x10(%rax)
movsd  0x8(%rsi,%rcx,8),%xmm0
movsd  %xmm0,-0x8(%rax)
movsd  0x8(%rsi,%rcx,8),%xmm0
movsd  %xmm0,(%rax)
add    $0x2,%rcx
add    $0x20,%rax
cmp    %rcx,%r9
jne    1230 <CCFD_Px+0x130>
jmp    1331 <CCFD_Px+0x231>
mov    %r9d,%ecx
and    $0xfffffffc,%ecx
lea    -0x4(%rcx),%rax
mov    %rax,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
mov    %edx,%r8d
and    $0x3,%r8d
cmp    $0xc,%rax
jae    135e <CCFD_Px+0x25e>
xor    %eax,%eax
jmp    13c8 <CCFD_Px+0x2c8>
mov    %r9d,%ecx
and    $0xfffffffe,%ecx
lea    -0x2(%rcx),%rax
mov    %rax,%r10
shr    %r10
add    $0x1,%r10
test   %rax,%rax
je     1416 <CCFD_Px+0x316>
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
lea    0x20(%rdi),%rbx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups (%rsi,%rax,8),%xmm0
movaps %xmm0,%xmm1
movlhps %xmm0,%xmm1
movhlps %xmm0,%xmm0
movups %xmm0,-0x10(%rbx)
movups %xmm1,-0x20(%rbx)
movups 0x10(%rsi,%rax,8),%xmm0
movaps %xmm0,%xmm1
movlhps %xmm0,%xmm1
movhlps %xmm0,%xmm0
movups %xmm0,0x10(%rbx)
movups %xmm1,(%rbx)
add    $0x4,%rax
add    $0x40,%rbx
add    $0xfffffffffffffffe,%r11
jne    12d0 <CCFD_Px+0x1d0>
test   $0x1,%r10b
je     1328 <CCFD_Px+0x228>
movups (%rsi,%rax,8),%xmm0
shl    $0x4,%rax
movaps %xmm0,%xmm1
movlhps %xmm0,%xmm1
movhlps %xmm0,%xmm0
movups %xmm0,0x10(%rdi,%rax,1)
movups %xmm1,(%rdi,%rax,1)
cmp    %r9,%rcx
jne    11e6 <CCFD_Px+0xe6>
lea    (%r8,%r8,1),%eax
movslq %r8d,%rcx
movsd  (%rsi,%rcx,8),%xmm0
mov    %eax,%ebx
movsd  %xmm0,(%rdi,%rbx,8)
add    $0xffffffff,%edx
cmp    %edx,%eax
jge    1414 <CCFD_Px+0x314>
movsd  (%rsi,%rcx,8),%xmm0
or     $0x1,%eax
movsd  %xmm0,(%rdi,%rax,8)
pop    %rbx
ret
and    $0xfffffffffffffffc,%rdx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups (%rsi,%rax,8),%xmm0
movups 0x10(%rsi,%rax,8),%xmm1
movups %xmm0,(%rdi,%rax,8)
movups %xmm1,0x10(%rdi,%rax,8)
movups 0x20(%rsi,%rax,8),%xmm0
movups 0x30(%rsi,%rax,8),%xmm1
movups %xmm0,0x20(%rdi,%rax,8)
movups %xmm1,0x30(%rdi,%rax,8)
movups 0x40(%rsi,%rax,8),%xmm0
movups 0x50(%rsi,%rax,8),%xmm1
movups %xmm0,0x40(%rdi,%rax,8)
movups %xmm1,0x50(%rdi,%rax,8)
movups 0x60(%rsi,%rax,8),%xmm0
movups 0x70(%rsi,%rax,8),%xmm1
movups %xmm0,0x60(%rdi,%rax,8)
movups %xmm1,0x70(%rdi,%rax,8)
add    $0x10,%rax
add    $0xfffffffffffffffc,%rdx
jne    1370 <CCFD_Px+0x270>
test   %r8,%r8
je     140b <CCFD_Px+0x30b>
lea    (%rdi,%rax,8),%rdx
add    $0x10,%rdx
lea    (%rsi,%rax,8),%rax
add    $0x10,%rax
shl    $0x5,%r8
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x10(%rax,%rbx,1),%xmm0
movups (%rax,%rbx,1),%xmm1
movups %xmm0,-0x10(%rdx,%rbx,1)
movups %xmm1,(%rdx,%rbx,1)
add    $0x20,%rbx
cmp    %rbx,%r8
jne    13f0 <CCFD_Px+0x2f0>
cmp    %r9,%rcx
jne    1135 <CCFD_Px+0x35>
pop    %rbx
ret
xor    %eax,%eax
test   $0x1,%r10b
jne    130e <CCFD_Px+0x20e>
jmp    1328 <CCFD_Px+0x228>

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

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