void kernel_dgetr_2_lib4(int kmax, int kna, double *A, double *C, int sdc) {
  const int bs = 4;
  int k;
  k = 0;
  if (kna > 0) {
    for (; k < kna; k++) {
      C[0 + bs * 0] = A[0 + bs * 0];
      C[0 + bs * 1] = A[1 + bs * 0];
      C += 1;
      A += bs;
    }
    C += bs * (sdc - 1);
  }
  for (; k < kmax - 3; k += 4) {
    C[0 + bs * 0] = A[0 + bs * 0];
    C[0 + bs * 1] = A[1 + bs * 0];
    C[1 + bs * 0] = A[0 + bs * 1];
    C[1 + bs * 1] = A[1 + bs * 1];
    C[2 + bs * 0] = A[0 + bs * 2];
    C[2 + bs * 1] = A[1 + bs * 2];
    C[3 + bs * 0] = A[0 + bs * 3];
    C[3 + bs * 1] = A[1 + bs * 3];
    C += bs * sdc;
    A += bs * bs;
  }
  for (; k < kmax; k++) {
    C[0 + bs * 0] = A[0 + bs * 0];
    C[0 + bs * 1] = A[1 + bs * 0];
    C += 1;
    A += bs;
  }
}


x86 assembly (clang, -O0):
<kernel_dgetr_2_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
movl   $0x4,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x0,-0x8(%rbp)
jle    11a2 <kernel_dgetr_2_lib4+0xa2>
jmp    1133 <kernel_dgetr_2_lib4+0x33>
mov    -0x24(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1187 <kernel_dgetr_2_lib4+0x87>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x10(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1133 <kernel_dgetr_2_lib4+0x33>
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x2,%ecx
mov    -0x18(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
jmp    11a7 <kernel_dgetr_2_lib4+0xa7>
mov    -0x24(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    127a <kernel_dgetr_2_lib4+0x17a>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x30(%rax)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x1c(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x18(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x10(%rbp)
mov    -0x24(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x24(%rbp)
jmp    11a7 <kernel_dgetr_2_lib4+0xa7>
jmp    127f <kernel_dgetr_2_lib4+0x17f>
mov    -0x24(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12d3 <kernel_dgetr_2_lib4+0x1d3>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x10(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    127f <kernel_dgetr_2_lib4+0x17f>
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgetr_2_lib4>:
test   %esi,%esi
jle    125b <kernel_dgetr_2_lib4+0x15b>
lea    -0x1(%rsi),%r9d
xor    %r10d,%r10d
cmp    $0x2,%r9d
jb     119d <kernel_dgetr_2_lib4+0x9d>
mov    %r9,%rax
shl    $0x5,%rax
add    %rdx,%rax
add    $0x10,%rax
cmp    %rcx,%rax
jbe    1139 <kernel_dgetr_2_lib4+0x39>
lea    (%rcx,%r9,8),%rax
add    $0x28,%rax
cmp    %rdx,%rax
ja     119d <kernel_dgetr_2_lib4+0x9d>
add    $0x1,%r9
mov    %r9d,%eax
and    $0x1,%eax
test   %rax,%rax
mov    $0x2,%r11d
cmovne %rax,%r11
mov    %r9,%r10
sub    %r11,%r10
mov    %r10,%r11
shl    $0x5,%r11
add    %rdx,%r11
lea    (%rcx,%r10,8),%r9
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
movups (%rdx),%xmm0
movups 0x20(%rdx),%xmm1
movaps %xmm0,%xmm2
movlhps %xmm1,%xmm2
unpckhpd %xmm1,%xmm0
movups %xmm2,(%rcx,%rax,8)
movups %xmm0,0x20(%rcx,%rax,8)
add    $0x2,%rax
add    $0x40,%rdx
cmp    %rax,%r10
jne    1170 <kernel_dgetr_2_lib4+0x70>
mov    %r11,%rdx
mov    %r9,%rcx
mov    %esi,%r11d
sub    %r10d,%r11d
mov    %r10d,%r9d
not    %r9d
add    %esi,%r9d
and    $0x3,%r11d
je     11e5 <kernel_dgetr_2_lib4+0xe5>
neg    %r11d
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%rdx),%xmm0
movsd  %xmm0,(%rcx)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x20(%rcx)
add    $0x8,%rcx
add    $0x20,%rdx
add    $0xffffffff,%eax
cmp    %eax,%r11d
jne    11c0 <kernel_dgetr_2_lib4+0xc0>
sub    %eax,%r10d
cmp    $0x3,%r9d
jb     124b <kernel_dgetr_2_lib4+0x14b>
mov    %esi,%eax
sub    %r10d,%eax
movsd  (%rdx),%xmm0
movsd  %xmm0,(%rcx)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x20(%rcx)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x8(%rcx)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x28(%rcx)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x10(%rcx)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x30(%rcx)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x18(%rcx)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x38(%rcx)
add    $0x20,%rcx
sub    $0xffffffffffffff80,%rdx
add    $0xfffffffc,%eax
jne    11f0 <kernel_dgetr_2_lib4+0xf0>
lea    -0x4(,%r8,4),%eax
ff
cltq
lea    (%rcx,%rax,8),%rcx
jmp    125d <kernel_dgetr_2_lib4+0x15d>
xor    %esi,%esi
lea    -0x3(%rdi),%r9d
cmp    %r9d,%esi
jge    12dd <kernel_dgetr_2_lib4+0x1dd>
shl    $0x2,%r8d
movslq %r8d,%rax
shl    $0x3,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rdx),%xmm0
movsd  %xmm0,(%rcx)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x20(%rcx)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x8(%rcx)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x28(%rcx)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x10(%rcx)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x30(%rcx)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x18(%rcx)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x38(%rcx)
sub    $0xffffffffffffff80,%rdx
add    $0x4,%esi
add    %rax,%rcx
cmp    %r9d,%esi
jl     1280 <kernel_dgetr_2_lib4+0x180>
cmp    %edi,%esi
jge    1432 <kernel_dgetr_2_lib4+0x332>
mov    %esi,%r10d
not    %r10d
add    %edi,%r10d
cmp    $0x1,%r10d
jbe    137d <kernel_dgetr_2_lib4+0x27d>
mov    %r10,%rax
shl    $0x5,%rax
add    %rdx,%rax
add    $0x10,%rax
cmp    %rax,%rcx
jae    1318 <kernel_dgetr_2_lib4+0x218>
lea    (%rcx,%r10,8),%rax
add    $0x28,%rax
cmp    %rax,%rdx
jb     137d <kernel_dgetr_2_lib4+0x27d>
add    $0x1,%r10
mov    %r10d,%r8d
and    $0x1,%r8d
test   %r8,%r8
mov    $0x2,%eax
cmovne %r8,%rax
sub    %rax,%r10
add    %r10d,%esi
mov    %r10,%r8
shl    $0x5,%r8
add    %rdx,%r8
lea    (%rcx,%r10,8),%r9
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nop
movups (%rdx),%xmm0
movups 0x20(%rdx),%xmm1
movaps %xmm0,%xmm2
movlhps %xmm1,%xmm2
unpckhpd %xmm1,%xmm0
movups %xmm2,(%rcx,%rax,8)
movups %xmm0,0x20(%rcx,%rax,8)
add    $0x2,%rax
add    $0x40,%rdx
cmp    %rax,%r10
jne    1350 <kernel_dgetr_2_lib4+0x250>
mov    %r8,%rdx
mov    %r9,%rcx
mov    %edi,%r9d
sub    %esi,%r9d
mov    %esi,%r8d
not    %r8d
add    %edi,%r8d
and    $0x3,%r9d
je     13c4 <kernel_dgetr_2_lib4+0x2c4>
neg    %r9d
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%rdx),%xmm0
movsd  %xmm0,(%rcx)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x20(%rcx)
add    $0x8,%rcx
add    $0x20,%rdx
add    $0xffffffff,%eax
cmp    %eax,%r9d
jne    13a0 <kernel_dgetr_2_lib4+0x2a0>
sub    %eax,%esi
cmp    $0x3,%r8d
jb     1432 <kernel_dgetr_2_lib4+0x332>
sub    %esi,%edi
xor    %eax,%eax
xchg   %ax,%ax
movsd  (%rdx),%xmm0
movsd  %xmm0,(%rcx,%rax,8)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x20(%rcx,%rax,8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x8(%rcx,%rax,8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x28(%rcx,%rax,8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x10(%rcx,%rax,8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x30(%rcx,%rax,8)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x18(%rcx,%rax,8)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x38(%rcx,%rax,8)
add    $0x4,%rax
sub    $0xffffffffffffff80,%rdx
cmp    %eax,%edi
jne    13d0 <kernel_dgetr_2_lib4+0x2d0>
ret

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

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