void CINTdmat_transpose(double *a_t, const double *a, const int m,
                        const int n) {
  int i, j, k;
  double *pa1, *pa2, *pa3;
  for (j = 0; j < n - 3; j += 4) {
    pa1 = a_t + m;
    pa2 = pa1 + m;
    pa3 = pa2 + m;
    for (i = 0, k = j; i < m; i++, k += n) {
      a_t[i] = a[k + 0];
      pa1[i] = a[k + 1];
      pa2[i] = a[k + 2];
      pa3[i] = a[k + 3];
    }
    a_t += m * 4;
  }
  switch (n - j) {
  case 1:
    for (i = 0, k = j; i < m; i++, k += n) {
      a_t[i] = a[k];
    }
    break;
  case 2:
    pa1 = a_t + m;
    for (i = 0, k = j; i < m; i++, k += n) {
      a_t[i] = a[k + 0];
      pa1[i] = a[k + 1];
    }
    break;
  case 3:
    pa1 = a_t + m;
    pa2 = pa1 + m;
    for (i = 0, k = j; i < m; i++, k += n) {
      a_t[i] = a[k + 0];
      pa1[i] = a[k + 1];
      pa2[i] = a[k + 2];
    }
    break;
  }
}


x86 assembly (clang, -O0):
<CINTdmat_transpose>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    -0x18(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1235 <CINTdmat_transpose+0x135>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    120f <CINTdmat_transpose+0x10f>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x38(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1170 <CINTdmat_transpose+0x70>
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x20(%rbp)
jmp    1119 <CINTdmat_transpose+0x19>
mov    -0x18(%rbp),%eax
mov    -0x20(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x44(%rbp)
sub    $0x1,%eax
je     1270 <CINTdmat_transpose+0x170>
jmp    124e <CINTdmat_transpose+0x14e>
mov    -0x44(%rbp),%eax
sub    $0x2,%eax
je     12bf <CINTdmat_transpose+0x1bf>
jmp    125f <CINTdmat_transpose+0x15f>
mov    -0x44(%rbp),%eax
sub    $0x3,%eax
je     1345 <CINTdmat_transpose+0x245>
jmp    13fd <CINTdmat_transpose+0x2fd>
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12ba <CINTdmat_transpose+0x1ba>
mov    -0x10(%rbp),%rax
movslq -0x24(%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)
mov    -0x18(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    127d <CINTdmat_transpose+0x17d>
jmp    13fd <CINTdmat_transpose+0x2fd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1340 <CINTdmat_transpose+0x240>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    12df <CINTdmat_transpose+0x1df>
jmp    13fd <CINTdmat_transpose+0x2fd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13f8 <CINTdmat_transpose+0x2f8>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x38(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1378 <CINTdmat_transpose+0x278>
jmp    13fd <CINTdmat_transpose+0x2fd>
pop    %rbp
ret

x86 assembly (clang, -O2):
<CINTdmat_transpose>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
xor    %eax,%eax
cmp    $0x4,%ecx
jl     11cd <CINTdmat_transpose+0xcd>
lea    -0x3(%rcx),%r8d
movslq %edx,%r14
lea    0x0(,%r14,4),%eax
movslq %eax,%r9
mov    %ecx,%r10d
mov    %r14d,%r11d
lea    (%r14,%r14,2),%rax
lea    (%rdi,%rax,8),%r13
shl    $0x3,%r9
lea    (%rdi,%r14,8),%rax
shl    $0x4,%r14
add    %rdi,%r14
lea    0x18(%rsi),%r15
shl    $0x3,%r10
xor    %r12d,%r12d
jmp    1179 <CINTdmat_transpose+0x79>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    %r9,%rdi
add    $0x4,%r12
add    %r9,%r13
add    %r9,%r14
add    %r9,%rax
add    $0x20,%r15
cmp    %r12d,%r8d
jle    11c8 <CINTdmat_transpose+0xc8>
test   %edx,%edx
jle    1160 <CINTdmat_transpose+0x60>
mov    %r15,%rbx
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  -0x18(%rbx),%xmm0
movsd  %xmm0,(%rdi,%rbp,8)
movsd  -0x10(%rbx),%xmm0
movsd  %xmm0,(%rax,%rbp,8)
movsd  -0x8(%rbx),%xmm0
movsd  %xmm0,(%r14,%rbp,8)
movsd  (%rbx),%xmm0
movsd  %xmm0,0x0(%r13,%rbp,8)
add    $0x1,%rbp
add    %r10,%rbx
cmp    %rbp,%r11
jne    1190 <CINTdmat_transpose+0x90>
jmp    1160 <CINTdmat_transpose+0x60>
mov    %ecx,%eax
and    $0xfffffffc,%eax
mov    %ecx,%ebp
sub    %eax,%ebp
cmp    $0x3,%ebp
je     12ee <CINTdmat_transpose+0x1ee>
cmp    $0x2,%ebp
je     130b <CINTdmat_transpose+0x20b>
cmp    $0x1,%ebp
jne    1514 <CINTdmat_transpose+0x414>
test   %edx,%edx
jle    1514 <CINTdmat_transpose+0x414>
movslq %eax,%r9
movslq %ecx,%r10
mov    %edx,%r8d
cmp    $0x4,%edx
jb     123d <CINTdmat_transpose+0x13d>
lea    -0x1(%r8),%rax
imul   %r10,%rax
add    %r9,%rax
lea    (%rsi,%rax,8),%rcx
lea    (%rsi,%r9,8),%rdx
cmp    %rdx,%rcx
mov    %rdx,%rax
cmova  %rcx,%rdx
cmovb  %rcx,%rax
add    $0x8,%rdx
cmp    %rdx,%rdi
jae    1497 <CINTdmat_transpose+0x397>
lea    (%rdi,%r8,8),%rcx
cmp    %rcx,%rax
jae    1497 <CINTdmat_transpose+0x397>
xor    %edx,%edx
mov    %r9,%rax
mov    %rdx,%rbx
not    %rbx
add    %r8,%rbx
mov    %r8,%rcx
and    $0x3,%rcx
je     1277 <CINTdmat_transpose+0x177>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rsi,%rax,8),%xmm0
movsd  %xmm0,(%rdi,%rdx,8)
add    $0x1,%rdx
add    %r10,%rax
add    $0xffffffffffffffff,%rcx
jne    1260 <CINTdmat_transpose+0x160>
cmp    $0x3,%rbx
jb     1514 <CINTdmat_transpose+0x414>
lea    0x0(,%rax,8),%r9
mov    %r10,%rbx
shl    $0x5,%rbx
lea    (%r10,%r10,2),%rcx
lea    (%r9,%rcx,8),%r11
mov    %r10,%rcx
shl    $0x4,%rcx
lea    (%rcx,%rax,8),%rcx
add    %r10,%rax
cs nopw 0x0(%rax,%rax,1)
movsd  (%rsi,%r9,1),%xmm0
movsd  %xmm0,(%rdi,%rdx,8)
movsd  (%rsi,%rax,8),%xmm0
movsd  %xmm0,0x8(%rdi,%rdx,8)
movsd  (%rsi,%rcx,1),%xmm0
movsd  %xmm0,0x10(%rdi,%rdx,8)
movsd  (%rsi,%r11,1),%xmm0
movsd  %xmm0,0x18(%rdi,%rdx,8)
add    $0x4,%rdx
add    %rbx,%rsi
cmp    %rdx,%r8
jne    12b0 <CINTdmat_transpose+0x1b0>
jmp    1514 <CINTdmat_transpose+0x414>
test   %edx,%edx
jle    1514 <CINTdmat_transpose+0x414>
movslq %edx,%r9
movslq %eax,%rbp
mov    %edx,%r8d
cmp    $0x1,%edx
jne    132c <CINTdmat_transpose+0x22c>
xor    %ecx,%ecx
jmp    13ca <CINTdmat_transpose+0x2ca>
test   %edx,%edx
jle    1514 <CINTdmat_transpose+0x414>
movslq %edx,%r8
movslq %eax,%rbp
mov    %edx,%r9d
cmp    $0x1,%edx
jne    1401 <CINTdmat_transpose+0x301>
xor    %ecx,%ecx
jmp    1472 <CINTdmat_transpose+0x372>
movslq %ecx,%r11
mov    %r8d,%r10d
and    $0xfffffffe,%r10d
lea    (%rdi,%r9,8),%r14
add    $0x8,%r14
mov    %r9,%rax
shl    $0x4,%rax
lea    (%rax,%rdi,1),%r12
add    $0x8,%r12
lea    (%rsi,%rbp,8),%rax
add    $0x10,%rax
mov    %r11,%r15
shl    $0x4,%r15
lea    (%rsi,%r11,8),%rdx
add    $0x10,%rdx
xor    %ecx,%ecx
mov    %rbp,%rbx
nopl   0x0(%rax)
movsd  -0x10(%rax),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
movsd  -0x8(%rax),%xmm0
movsd  %xmm0,-0x8(%r14,%rcx,8)
movsd  (%rax),%xmm0
movsd  %xmm0,-0x8(%r12,%rcx,8)
lea    (%rbx,%r11,1),%rbp
movsd  -0x10(%rdx,%rbx,8),%xmm0
movsd  %xmm0,0x8(%rdi,%rcx,8)
movsd  -0x8(%rdx,%rbx,8),%xmm0
movsd  %xmm0,(%r14,%rcx,8)
movsd  (%rdx,%rbx,8),%xmm0
movsd  %xmm0,(%r12,%rcx,8)
add    $0x2,%rcx
add    %r11,%rbp
add    %r15,%rax
mov    %rbp,%rbx
cmp    %rcx,%r10
jne    1370 <CINTdmat_transpose+0x270>
test   $0x1,%r8b
je     1514 <CINTdmat_transpose+0x414>
lea    (%rdi,%r9,8),%rax
lea    (%rax,%r9,8),%rdx
movsd  (%rsi,%rbp,8),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
movsd  0x8(%rsi,%rbp,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movsd  0x10(%rsi,%rbp,8),%xmm0
movsd  %xmm0,(%rdx,%rcx,8)
jmp    1514 <CINTdmat_transpose+0x414>
movslq %ecx,%r11
mov    %r9d,%r10d
and    $0xfffffffe,%r10d
lea    (%rdi,%r8,8),%r15
add    $0x8,%r15
lea    (%rsi,%rbp,8),%rdx
add    $0x8,%rdx
mov    %r11,%r14
shl    $0x4,%r14
lea    (%rsi,%r11,8),%rbx
add    $0x8,%rbx
xor    %ecx,%ecx
mov    %rbp,%rax
nop
movsd  -0x8(%rdx),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
movsd  (%rdx),%xmm0
movsd  %xmm0,-0x8(%r15,%rcx,8)
lea    (%rax,%r11,1),%rbp
movsd  -0x8(%rbx,%rax,8),%xmm0
movsd  %xmm0,0x8(%rdi,%rcx,8)
movsd  (%rbx,%rax,8),%xmm0
movsd  %xmm0,(%r15,%rcx,8)
add    $0x2,%rcx
add    %r11,%rbp
add    %r14,%rdx
mov    %rbp,%rax
cmp    %rcx,%r10
jne    1430 <CINTdmat_transpose+0x330>
test   $0x1,%r9b
je     1514 <CINTdmat_transpose+0x414>
lea    (%rdi,%r8,8),%rax
movsd  (%rsi,%rbp,8),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
movsd  0x8(%rsi,%rbp,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    1514 <CINTdmat_transpose+0x414>
mov    %r8d,%edx
and    $0xfffffffc,%edx
mov    %rdx,%rax
imul   %r10,%rax
add    %r9,%rax
lea    0x0(,%r8,8),%r11
and    $0xffffffffffffffe0,%r11
lea    0x0(,%r9,8),%r14
mov    %r10,%r12
shl    $0x5,%r12
lea    (%r10,%r10,2),%rcx
lea    (%r14,%rcx,8),%r15
mov    %r10,%rcx
shl    $0x4,%rcx
lea    (%rcx,%r9,8),%r13
add    %r10,%r9
xor    %ebx,%ebx
mov    %rsi,%rcx
nopl   (%rax)
movsd  (%rcx,%r14,1),%xmm0
movhps (%rcx,%r9,8),%xmm0
movsd  (%rcx,%r13,1),%xmm1
movhps (%rcx,%r15,1),%xmm1
movups %xmm0,(%rdi,%rbx,1)
movups %xmm1,0x10(%rdi,%rbx,1)
add    $0x20,%rbx
add    %r12,%rcx
cmp    %rbx,%r11
jne    14e0 <CINTdmat_transpose+0x3e0>
cmp    %r8,%rdx
jne    1242 <CINTdmat_transpose+0x142>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @CINTdmat_transpose(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
%11 = alloca i32
%12 = alloca double*
%13 = alloca double*
%14 = alloca double*
store double* %0, double** %5
store double* %1, double** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
store i32 0, i32* %10
br label %15
15: ; preds = %91, %4
%16 = load i32, i32* %10
%17 = load i32, i32* %8
%18 = sub nsw i32 %17, 3
%19 = icmp slt i32 %16, %18
br i1 %19, label %20, label %94
20: ; preds = %15
%21 = load double*, double** %5
%22 = load i32, i32* %7
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds double, double* %21, i64 %23
store double* %24, double** %12
%25 = load double*, double** %12
%26 = load i32, i32* %7
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds double, double* %25, i64 %27
store double* %28, double** %13
%29 = load double*, double** %13
%30 = load i32, i32* %7
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds double, double* %29, i64 %31
store double* %32, double** %14
store i32 0, i32* %9
%33 = load i32, i32* %10
store i32 %33, i32* %11
br label %34
34: ; preds = %79, %20
%35 = load i32, i32* %9
%36 = load i32, i32* %7
%37 = icmp slt i32 %35, %36
br i1 %37, label %38, label %85
38: ; preds = %34
%39 = load double*, double** %6
%40 = load i32, i32* %11
%41 = add nsw i32 %40, 0
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds double, double* %39, i64 %42
%44 = load double, double* %43
%45 = load double*, double** %5
%46 = load i32, i32* %9
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds double, double* %45, i64 %47
store double %44, double* %48
%49 = load double*, double** %6
%50 = load i32, i32* %11
%51 = add nsw i32 %50, 1
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds double, double* %49, i64 %52
%54 = load double, double* %53
%55 = load double*, double** %12
%56 = load i32, i32* %9
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds double, double* %55, i64 %57
store double %54, double* %58
%59 = load double*, double** %6
%60 = load i32, i32* %11
%61 = add nsw i32 %60, 2
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds double, double* %59, i64 %62
%64 = load double, double* %63
%65 = load double*, double** %13
%66 = load i32, i32* %9
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds double, double* %65, i64 %67
store double %64, double* %68
%69 = load double*, double** %6
%70 = load i32, i32* %11
%71 = add nsw i32 %70, 3
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds double, double* %69, i64 %72
%74 = load double, double* %73
%75 = load double*, double** %14
%76 = load i32, i32* %9
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds double, double* %75, i64 %77
store double %74, double* %78
br label %79
79: ; preds = %38
%80 = load i32, i32* %9
%81 = add nsw i32 %80, 1
store i32 %81, i32* %9
%82 = load i32, i32* %8
%83 = load i32, i32* %11
%84 = add nsw i32 %83, %82
store i32 %84, i32* %11
br label %34
85: ; preds = %34
%86 = load i32, i32* %7
%87 = mul nsw i32 %86, 4
%88 = load double*, double** %5
%89 = sext i32 %87 to i64
%90 = getelementptr inbounds double, double* %88, i64 %89
store double* %90, double** %5
br label %91
91: ; preds = %85
%92 = load i32, i32* %10
%93 = add nsw i32 %92, 4
store i32 %93, i32* %10
br label %15
94: ; preds = %15
%95 = load i32, i32* %8
%96 = load i32, i32* %10
%97 = sub nsw i32 %95, %96
switch i32 %97, label %211 [
i32 1, label %98
i32 2, label %121
i32 3, label %159
]
98: ; preds = %94
store i32 0, i32* %9
%99 = load i32, i32* %10
store i32 %99, i32* %11
br label %100
100: ; preds = %114, %98
%101 = load i32, i32* %9
%102 = load i32, i32* %7
%103 = icmp slt i32 %101, %102
br i1 %103, label %104, label %120
104: ; preds = %100
%105 = load double*, double** %6
%106 = load i32, i32* %11
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds double, double* %105, i64 %107
%109 = load double, double* %108
%110 = load double*, double** %5
%111 = load i32, i32* %9
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds double, double* %110, i64 %112
store double %109, double* %113
br label %114
114: ; preds = %104
%115 = load i32, i32* %9
%116 = add nsw i32 %115, 1
store i32 %116, i32* %9
%117 = load i32, i32* %8
%118 = load i32, i32* %11
%119 = add nsw i32 %118, %117
store i32 %119, i32* %11
br label %100
120: ; preds = %100
br label %211
121: ; preds = %94
%122 = load double*, double** %5
%123 = load i32, i32* %7
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds double, double* %122, i64 %124
store double* %125, double** %12
store i32 0, i32* %9
%126 = load i32, i32* %10
store i32 %126, i32* %11
br label %127
127: ; preds = %152, %121
%128 = load i32, i32* %9
%129 = load i32, i32* %7
%130 = icmp slt i32 %128, %129
br i1 %130, label %131, label %158
131: ; preds = %127
%132 = load double*, double** %6
%133 = load i32, i32* %11
%134 = add nsw i32 %133, 0
%135 = sext i32 %134 to i64
%136 = getelementptr inbounds double, double* %132, i64 %135
%137 = load double, double* %136
%138 = load double*, double** %5
%139 = load i32, i32* %9
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds double, double* %138, i64 %140
store double %137, double* %141
%142 = load double*, double** %6
%143 = load i32, i32* %11
%144 = add nsw i32 %143, 1
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds double, double* %142, i64 %145
%147 = load double, double* %146
%148 = load double*, double** %12
%149 = load i32, i32* %9
%150 = sext i32 %149 to i64
%151 = getelementptr inbounds double, double* %148, i64 %150
store double %147, double* %151
br label %152
152: ; preds = %131
%153 = load i32, i32* %9
%154 = add nsw i32 %153, 1
store i32 %154, i32* %9
%155 = load i32, i32* %8
%156 = load i32, i32* %11
%157 = add nsw i32 %156, %155
store i32 %157, i32* %11
br label %127
158: ; preds = %127
br label %211
159: ; preds = %94
%160 = load double*, double** %5
%161 = load i32, i32* %7
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds double, double* %160, i64 %162
store double* %163, double** %12
%164 = load double*, double** %12
%165 = load i32, i32* %7
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds double, double* %164, i64 %166
store double* %167, double** %13
store i32 0, i32* %9
%168 = load i32, i32* %10
store i32 %168, i32* %11
br label %169
169: ; preds = %204, %159
%170 = load i32, i32* %9
%171 = load i32, i32* %7
%172 = icmp slt i32 %170, %171
br i1 %172, label %173, label %210
173: ; preds = %169
%174 = load double*, double** %6
%175 = load i32, i32* %11
%176 = add nsw i32 %175, 0
%177 = sext i32 %176 to i64
%178 = getelementptr inbounds double, double* %174, i64 %177
%179 = load double, double* %178
%180 = load double*, double** %5
%181 = load i32, i32* %9
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds double, double* %180, i64 %182
store double %179, double* %183
%184 = load double*, double** %6
%185 = load i32, i32* %11
%186 = add nsw i32 %185, 1
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds double, double* %184, i64 %187
%189 = load double, double* %188
%190 = load double*, double** %12
%191 = load i32, i32* %9
%192 = sext i32 %191 to i64
%193 = getelementptr inbounds double, double* %190, i64 %192
store double %189, double* %193
%194 = load double*, double** %6
%195 = load i32, i32* %11
%196 = add nsw i32 %195, 2
%197 = sext i32 %196 to i64
%198 = getelementptr inbounds double, double* %194, i64 %197
%199 = load double, double* %198
%200 = load double*, double** %13
%201 = load i32, i32* %9
%202 = sext i32 %201 to i64
%203 = getelementptr inbounds double, double* %200, i64 %202
store double %199, double* %203
br label %204
204: ; preds = %173
%205 = load i32, i32* %9
%206 = add nsw i32 %205, 1
store i32 %206, i32* %9
%207 = load i32, i32* %8
%208 = load i32, i32* %11
%209 = add nsw i32 %208, %207
store i32 %209, i32* %11
br label %169
210: ; preds = %169
br label %211
211: ; preds = %94, %210, %158, %120
ret void
}

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