void cpytr3x3(double *restrict a, double *restrict b) {
  double *a00 __attribute__((unused)) = a++;
  double *a10 __attribute__((unused)) = a++;
  double *a20 __attribute__((unused)) = a++;
  double *a01 __attribute__((unused)) = a++;
  double *a11 __attribute__((unused)) = a++;
  double *a21 __attribute__((unused)) = a++;
  double *a02 __attribute__((unused)) = a++;
  double *a12 __attribute__((unused)) = a++;
  double *a22 __attribute__((unused)) = a++;
  ;
  double *b00 __attribute__((unused)) = b++;
  double *b10 __attribute__((unused)) = b++;
  double *b20 __attribute__((unused)) = b++;
  double *b01 __attribute__((unused)) = b++;
  double *b11 __attribute__((unused)) = b++;
  double *b21 __attribute__((unused)) = b++;
  double *b02 __attribute__((unused)) = b++;
  double *b12 __attribute__((unused)) = b++;
  double *b22 __attribute__((unused)) = b++;
  ;
  *b00 = *a00;
  *b10 = *a01;
  *b20 = *a02;
  *b01 = *a10;
  *b11 = *a11;
  *b21 = *a12;
  *b02 = *a20;
  *b12 = *a21;
  *b22 = *a22;
}


x86 assembly (clang, -O0):
<cpytr3x3>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x60(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x68(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x70(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x78(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x80(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x88(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x90(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x98(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0xa0(%rbp)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x60(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x70(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x78(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x80(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x88(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x90(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x98(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x58(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0xa0(%rbp),%rax
movsd  %xmm0,(%rax)
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cpytr3x3>:
movsd  (%rdi),%xmm0
movsd  %xmm0,(%rsi)
movsd  0x18(%rdi),%xmm0
movsd  %xmm0,0x8(%rsi)
movsd  0x30(%rdi),%xmm0
movsd  %xmm0,0x10(%rsi)
movsd  0x8(%rdi),%xmm0
movsd  %xmm0,0x18(%rsi)
movsd  0x20(%rdi),%xmm0
movsd  %xmm0,0x20(%rsi)
movsd  0x38(%rdi),%xmm0
movsd  %xmm0,0x28(%rsi)
movsd  0x10(%rdi),%xmm0
movsd  %xmm0,0x30(%rsi)
movsd  0x28(%rdi),%xmm0
movsd  %xmm0,0x38(%rsi)
movsd  0x40(%rdi),%xmm0
movsd  %xmm0,0x40(%rsi)
ret

LLVM IR (-O0):
define void @cpytr3x3(double* noalias %0, double* noalias %1) {
%3 = alloca double*
%4 = alloca double*
%5 = alloca double*
%6 = alloca double*
%7 = alloca double*
%8 = alloca double*
%9 = alloca double*
%10 = alloca double*
%11 = alloca double*
%12 = alloca double*
%13 = alloca double*
%14 = alloca double*
%15 = alloca double*
%16 = alloca double*
%17 = alloca double*
%18 = alloca double*
%19 = alloca double*
%20 = alloca double*
%21 = alloca double*
%22 = alloca double*
store double* %0, double** %3
store double* %1, double** %4
%23 = load double*, double** %3
%24 = getelementptr inbounds double, double* %23, i32 1
store double* %24, double** %3
store double* %23, double** %5
%25 = load double*, double** %3
%26 = getelementptr inbounds double, double* %25, i32 1
store double* %26, double** %3
store double* %25, double** %6
%27 = load double*, double** %3
%28 = getelementptr inbounds double, double* %27, i32 1
store double* %28, double** %3
store double* %27, double** %7
%29 = load double*, double** %3
%30 = getelementptr inbounds double, double* %29, i32 1
store double* %30, double** %3
store double* %29, double** %8
%31 = load double*, double** %3
%32 = getelementptr inbounds double, double* %31, i32 1
store double* %32, double** %3
store double* %31, double** %9
%33 = load double*, double** %3
%34 = getelementptr inbounds double, double* %33, i32 1
store double* %34, double** %3
store double* %33, double** %10
%35 = load double*, double** %3
%36 = getelementptr inbounds double, double* %35, i32 1
store double* %36, double** %3
store double* %35, double** %11
%37 = load double*, double** %3
%38 = getelementptr inbounds double, double* %37, i32 1
store double* %38, double** %3
store double* %37, double** %12
%39 = load double*, double** %3
%40 = getelementptr inbounds double, double* %39, i32 1
store double* %40, double** %3
store double* %39, double** %13
%41 = load double*, double** %4
%42 = getelementptr inbounds double, double* %41, i32 1
store double* %42, double** %4
store double* %41, double** %14
%43 = load double*, double** %4
%44 = getelementptr inbounds double, double* %43, i32 1
store double* %44, double** %4
store double* %43, double** %15
%45 = load double*, double** %4
%46 = getelementptr inbounds double, double* %45, i32 1
store double* %46, double** %4
store double* %45, double** %16
%47 = load double*, double** %4
%48 = getelementptr inbounds double, double* %47, i32 1
store double* %48, double** %4
store double* %47, double** %17
%49 = load double*, double** %4
%50 = getelementptr inbounds double, double* %49, i32 1
store double* %50, double** %4
store double* %49, double** %18
%51 = load double*, double** %4
%52 = getelementptr inbounds double, double* %51, i32 1
store double* %52, double** %4
store double* %51, double** %19
%53 = load double*, double** %4
%54 = getelementptr inbounds double, double* %53, i32 1
store double* %54, double** %4
store double* %53, double** %20
%55 = load double*, double** %4
%56 = getelementptr inbounds double, double* %55, i32 1
store double* %56, double** %4
store double* %55, double** %21
%57 = load double*, double** %4
%58 = getelementptr inbounds double, double* %57, i32 1
store double* %58, double** %4
store double* %57, double** %22
%59 = load double*, double** %5
%60 = load double, double* %59
%61 = load double*, double** %14
store double %60, double* %61
%62 = load double*, double** %8
%63 = load double, double* %62
%64 = load double*, double** %15
store double %63, double* %64
%65 = load double*, double** %11
%66 = load double, double* %65
%67 = load double*, double** %16
store double %66, double* %67
%68 = load double*, double** %6
%69 = load double, double* %68
%70 = load double*, double** %17
store double %69, double* %70
%71 = load double*, double** %9
%72 = load double, double* %71
%73 = load double*, double** %18
store double %72, double* %73
%74 = load double*, double** %12
%75 = load double, double* %74
%76 = load double*, double** %19
store double %75, double* %76
%77 = load double*, double** %7
%78 = load double, double* %77
%79 = load double*, double** %20
store double %78, double* %79
%80 = load double*, double** %10
%81 = load double, double* %80
%82 = load double*, double** %21
store double %81, double* %82
%83 = load double*, double** %13
%84 = load double, double* %83
%85 = load double*, double** %22
store double %84, double* %85
ret void
}

LLVM IR (-O2):
define void @cpytr3x3(double* noalias nocapture %0, double* noalias nocapture writeonly %1) {
%3 = getelementptr inbounds double, double* %0, i64 1
%4 = getelementptr inbounds double, double* %0, i64 2
%5 = getelementptr inbounds double, double* %0, i64 3
%6 = getelementptr inbounds double, double* %0, i64 4
%7 = getelementptr inbounds double, double* %0, i64 5
%8 = getelementptr inbounds double, double* %0, i64 6
%9 = getelementptr inbounds double, double* %0, i64 7
%10 = getelementptr inbounds double, double* %0, i64 8
%11 = getelementptr inbounds double, double* %1, i64 1
%12 = getelementptr inbounds double, double* %1, i64 2
%13 = getelementptr inbounds double, double* %1, i64 3
%14 = getelementptr inbounds double, double* %1, i64 4
%15 = getelementptr inbounds double, double* %1, i64 5
%16 = getelementptr inbounds double, double* %1, i64 6
%17 = getelementptr inbounds double, double* %1, i64 7
%18 = getelementptr inbounds double, double* %1, i64 8
%19 = load double, double* %0
store double %19, double* %1
%20 = load double, double* %5
store double %20, double* %11
%21 = load double, double* %8
store double %21, double* %12
%22 = load double, double* %3
store double %22, double* %13
%23 = load double, double* %6
store double %23, double* %14
%24 = load double, double* %9
store double %24, double* %15
%25 = load double, double* %4
store double %25, double* %16
%26 = load double, double* %7
store double %26, double* %17
%27 = load double, double* %10
store double %27, double* %18
ret void
}